(5) 上一小节说到scatterlist结构体描述SG缓存块的,包含页面、页内偏移、长度等信息,Linux提供了sg_set_page函数来把这些信息存入scatterlist结构体中(遍历scatterlist结构体数组一个一个分配)。 (6) 最后调用dma_map_sg函数建立SGDMA映射,此时SGDMA的环境就建立好了。dma_map_sg函数定义在/
dma_map_single 函数就像是一个 “地址翻译官”,它能够将单个内存页的地址映射为设备能够理解的总线地址;dma_map_sg 函数则更强大,它可以处理多个内存页组成的分散 / 聚集列表,将这些内存页的地址都映射为设备可访问的总线地址,就像一个 “团队翻译官”,能够同时处理多个任务。这些映射函数会根据设备的特点和需求...
(5) 上一小节说到scatterlist结构体描述SG缓存块的,包含页面、页内偏移、长度等信息,Linux提供了sg_set_page函数来把这些信息存入scatterlist结构体中(遍历scatterlist结构体数组一个一个分配)。 (6) 最后调用dma_map_sg函数建立SGDMA映射,此时SGDMA的环境就建立好了。dma_map_sg函数定义在/asm/dma-mapping.h中,...
int i, count = dma_map_sg(dev, sglist, nents, direction); structscatterlist, *sg; for_each_sg(sglist, sg, count, i) { hw_address[i] = sg_dma_address(sg); hw_len[i] = sg_dma_len(sg); } 其中,nents是sglist中地址的个数。 dma_map_sg函数的具体实现,可以将多个sglist项映射...
nents一定是先前传递给dma_map_sg函数的入口项的数量 void dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nents, enum dma_data_direction direction); void dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nents, enum dma_data_direction direction);...
nents一定是先前传递给dma_map_sg函数的入口项的数量 void dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nents, enum dma_data_direction direction); void dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nents, enum dma_data_direction direction);...
dma_addr_t dma_map_single(struct device *dev,void *buffer,size_t size, enum dma_data_direction direction); 返回值是总线地址,可以把它传递给设备。当传输完毕后,使⽤dma_unmap_single函数删除映射:void dma_unmap_single(struct device *dev,dma_addr_t dma_addr,size_t size, enum dma_data_...
(5) 上一小节说到scatterlist结构体描述SG缓存块的,包含页面、页内偏移、长度等信息,Linux提供了sg_set_page函数来把这些信息存入scatterlist结构体中(遍历scatterlist结构体数组一个一个分配)。 (6) 最后调用dma_map_sg函数建立SGDMA映射,此时SGDMA的环境就建立好了。dma_map_sg函数定义在/asm/dma-mapping.h中,...
kernel中使用struct page的数组来管理物理内存,有些系统上只有一个数组mem_map,有些架构的系统上,比如NUMA,因为有大量不连续的物理内存,那就可能需要多个page 数组来管理这些内存。幸运的是,driver只需要使用struct page即可,不需要关心这个page从哪里来的。kernel提供了一些函数,可以方便的根据page获取virtual address:...
有一些函数和宏用来在page结构指针与虚拟地址之间进行转换。 内核维护一个或多个 struct page 结构数组来跟踪系统中所有物理内存. 在某些系统, 用了一个单独的数组称为 mem_map. 而在另一些系统中, 情况更加复杂。非一致内存访问( NUMA )系统和有很多不连续物理内存的系统可能有多个内存映射数组, 因此从移植性考...