LDD3 notes: DMA
My notes while reading Linux Device Drivers 3rd edition, Memory mapping and DMA.
Kernel addressing
Concepts
PFN - page frame number. (virtual or physical) address / page size
struct page
VMA - virtual memory area. a contiguous, homogeneous region of process virtual address space.
implementing mmap
scullp_vma_open, mapping count non-atomic?
vsyscall page?
Kernel addressing
- Physical address
- Logical Address
- Virtual address
- Bus address (physical address as understood by the DMA peripheral)
Concepts
PFN - page frame number. (virtual or physical) address / page size
struct page
- 'handle' to a page of memory.
- page_address() macro to get virtual address, if mapped
- kmap() kernel virtual address for any page in the system
- may sleep, but has an atomic version
VMA - virtual memory area. a contiguous, homogeneous region of process virtual address space.
- visible in /proc/pid/maps
- nopage() - process accessed a missing page, go get it
- vm_pgoff, offset in pages into the backing file
implementing mmap
- remap_pfn_range(), once and for all ( io_remap_page_range() )
- - reserved pages only: locked in memory, outside of memory management
- implement vm_ops->nopage() and map page at a time to fill the holes
- - can map regular ram pages
- encapsulates cache coherency, bus addressing and implements bounce buffering as a fallback
- device.dma_set_mask() - how many address bits the device sees
- cache (in)coherency: cpu won't see dma ram writes, dma ram reads won't see cpu writes
- buffer allocation and bus addressing: dma_addr_t
- "one shot" operation streaming mappings - preferred
- dma_[un]map_single()
- long standing coherent mappings
- dma_{alloc|free}_coherent()
- dma_pool_{create|alloc|free|destroy}()
scullp_vma_open, mapping count non-atomic?
vsyscall page?
Comments
Post a Comment