【Linux开发】linux中关于dma_alloc_coherent的用法

178 篇文章 ¥39.90 ¥99.00
在Linux内核中,DMA操作需要物理地址,而通常使用的是虚拟地址。dma_alloc_coherent函数用于解决这个问题,提供内存的物理地址和虚拟地址映射。该函数的调用方式为dma_alloc_coherent(dev, size, dma_handle, gfp),其中dev是设备指针,size是分配大小,dma_handle返回物理地址,gfp是内存分配标志。通过此函数,可以得到供DMA使用的物理地址D,并有一个与之对应的虚拟地址A,对A或D的修改都会影响到同一内存缓冲区。" 90286046,8341740,PowerDesigner数据库脚本生成错误及解决方法,"['数据库设计', '建模工具', '数据库脚本生成']

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

大家都知道,DMA的操作是需要物理地址的,但是在linux内核中使用的都是虚拟地址,如果我们想要用DMA对一段内存进行操作,我们如何得到这一段内存的物理地址和虚拟地址的映射呢?dma_alloc_coherent这个函数实现了这种机制。
1、函数原型:void *dma_alloc_coherent(struct device *dev, size_t size,dma_addr_t *dma_handle,gfp_t gfp);下面的这一段参考http://blog.csdn.net/lanmanck/archive/2009/11/05/4773175.aspx
2、调用
A = dma_alloc_writecombine(B,C,D,GFP_KERNEL);
含义:
A: 内存的虚拟起始地址,在内核要用此地址来操作所分配的内存
B: struct device指针,可以平台初始化里指定,主要是dma_mask之类,可参考framebuffer
C: 实际分配大小,传入dma_map_size即可
D: 返回的内存物理地址,dma就可以用。
所以,A和D是一一对应的,只不过,A是虚拟地址,而D是物理地址。对任意一个操作都将改变缓冲区内容。

我对此函数的理解是,调用此函数将会分配一段内存,D将返回这段内存的实际物理地址供DMA来使用,A将是D对应的
虚拟地址供操作系统调用,对A和D的的任意一个进行操作,都会改变这段内存缓冲区的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值