dma_addr_t与流式映射和一致性映射

DMA映射在设备驱动中至关重要,涉及到一致性映射和流式映射。dma_alloc_coherent用于一致性映射,dma_map_single用于流式映射。一致性映射的内存分配和释放涉及dma_pool_create和dma_pool_destroy。流式映射需要指定数据流向,如DMA_TO_DEVICE或DMA_FROM_DEVICE。此外,针对不同场景,如单页和分散/聚集映射,有不同的映射和解映射函数。驱动程序在使用DMA时需要注意缓冲区的访问权限和同步问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DMA映射

       一个DMA映射是要分配的DMA缓冲区与为该缓冲区生成的、设备可访问地址的组合。DMA映射建立了一个新的结构类型---dma_addr_t来表示总线地址dma_addr_t类型的变量对驱动程序是不透明的,唯一允许的操作是将它们传递给DMA支持例程以及设备本身。

       根据DMA缓冲区期望保留的时间长短,PCI代码有两种DMA映射:
1)一致性映射
2)流式DMA映射(推荐)

********************************************************************************************************

建立一致性DMA映射

********************************************************************************************************

void *dma_alloc_coherent(struct device *dev,size_t size,dma_addr_t *dma_handle,int flag);
该函数处理了缓冲区的分配和映射。

前两个参数是device结构和所需缓冲区的大小。
函数在两处返回结果:
1)函数的返回值是缓冲区的内核虚拟地址,可以被驱动程序使用。
2)相关的总线地址则保存在dma_handle中。

向系统返回缓冲区--解除一致性映射
void dma_free_coherent(struct device *dev,size_t size,void *vaddr,dma_addr_t dma_handle);

---------
DMA池

DMA池是一个生成小型、一致性DMA映射的机制。调用dma_alloc_coherent函数获得的映射,可能其最小大小为单个页。如果设备需要的DMA区域比这还小,就要用DMA池了。

<linux/dmapool.h>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值