函数名称:dma_alloc_attrs 函数原型:void *dma_alloc_attrs(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t flag, unsigned long attrs) 返回类型:void 参数: 类型参数名称 struct device * dev size_t size dma_addr_t * dma_handle gfp_t flag unsigned long attrs 267...
这个函数返回两个值,其中cpu_addr是虚拟地址,CPU可以通过这个地址来访问这段buffer,另外一个dma_handle物理地址,可以传递给DMA engine。 这里分配的大小以 PAGE_SIZE为单位。 另外这个函数会调用alloc_page()来分配物理页面,所以不要在中断上下文中使用该API 其实现流程如下:dma_alloc_coherent dma_alloc_attrs ops-...
通过iommu_domain_alloc为新建的vfio_domain创新的iommu_domain,其最终调用的函数为intel_iommu_domain_alloc static struct iommu_domain *intel_iommu_domain_alloc(unsigned type) { struct dmar_domain *dmar_domain; struct iommu_domain *domain; if (type != IOMMU_DOMAIN_UNMANAGED) return NULL; dmar_domain...
retval = sysfs_create_files(&cls->kset.kobj, (const struct attribute **)cls->attrs); return retval; } [cpp] view plain copy /* 定义DMA系统设备驱动 */ static struct sysdev_driver s3c2440_dma_driver = { .add = s3c2440_dma_add,/* 添加add函数 */ }; 下面是add函数,就是调用三个函数...
void *(*alloc)(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t gfp, unsigned long attrs); diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h index fe3849434b2a..25a30906289d 100644 --- a/include/linux/dma-mapping.h ...
申请函数: alloc_pages(gfp_mask,order) 返回第一个所分配页框描述符的地址,或者如果分配失败则返回NULL。 __get_free_pages(gfp_mask,order) 类似于alloc_pages(),但它返回第一个所分配页的线性地址。如果需要获得线性地址对应的页框号,那 么需要调用virt_to_page(addr)宏产生线性地址。
上面的代码片断是取自内核e100网卡驱动,核心逻辑就是先把skb的地址做一下dma map,然后让硬件可以直接dma这段数据,其中使用的pci_map_single这个函数最终会调到 staticinlinedma_addr_tdma_map_single_attrs(structdevice*dev,void*ptr,size_tsize,enumdma_data_directiondir,unsignedlongattrs){structdma_map_ops*op...