博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Linux开发】linux中关于dma_alloc_coherent的用法
阅读量:5138 次
发布时间:2019-06-13

本文共 615 字,大约阅读时间需要 2 分钟。

大家都知道,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);下面的这一段参考
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的的任意一个进行操作,都会改变这段内存缓冲区的内容。

转载于:https://www.cnblogs.com/huty/p/8518530.html

你可能感兴趣的文章
用JSP实现的商城购物车模块
查看>>
java环境变量配置
查看>>
强化学习(三)—— 时序差分法(SARSA和Q-Learning)
查看>>
StringBuffer类的总结
查看>>
Who's in the Middle
查看>>
创建私有cocoapods
查看>>
Customers Who Never Order
查看>>
HR给应届生的黄金面试技巧
查看>>
model.js
查看>>
iOS开发支付集成之微信支付
查看>>
技术人员的发展之路
查看>>
redis缓存数据库
查看>>
Maven的安装及配置
查看>>
oracle中sum求和问题
查看>>
Nginx配置upstream实现负载均衡
查看>>
详解post和get请求
查看>>
16 合并两个排序的链表Merge two sorted linkedlist<TODO输入两个链表>
查看>>
Qt5学习笔记 | 给窗口添加动作
查看>>
Html Table to Excel 的一种实现 (PHP)
查看>>
将MSSQL2005的用户数据库导入到godaddy
查看>>