社区
Linux_Kernel
帖子详情
dma_map_single可以使用任意的地址吗?
dysxq
2010-11-23 04:38:27
如题,使用dma_map_single来映射一块内存用于dma操作时,这个内存可以是任意地址比如说我堆栈中里的变量地址吗?还是说必须要cache对齐才行
又,有没有什么办法可以把应用层的一块内存传到内核,然后驱动通过dma直接把数据接收到这块缓存中(内存是随意地址的,可能未对齐)
...全文
1805
8
打赏
收藏
dma_map_single可以使用任意的地址吗?
如题,使用dma_map_single来映射一块内存用于dma操作时,这个内存可以是任意地址比如说我堆栈中里的变量地址吗?还是说必须要cache对齐才行 又,有没有什么办法可以把应用层的一块内存传到内核,然后驱动通过dma直接把数据接收到这块缓存中(内存是随意地址的,可能未对齐)
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
dysxq
2010-11-24
打赏
举报
回复
是的,在内核分配的内存,都是页对齐的,而应用层分配,是不一定对齐的,我作的这个嵌入式系统里,内存分配也没有页对齐,所以看来是没办法直接进行dma了,要么想拷贝,要么想办法分配对齐的内存,好了结帖,多谢各位了
知和行
2010-11-24
打赏
举报
回复
不是很清楚你什么意思,还是那段:
驱动通过dma_alloc_coherent 获取一块连续的用于DMA的内存,这块内存肯定是对齐的,因为是以页为单位,一般是4K,再在应用层用过mmap 映射到这块内存。
再你在应用层 进行读写 操作,必要时候DMA发出去好了。
asmlearn
2010-11-23
打赏
举报
回复
应用层要用dma,得调用驱动吧。
dysxq
2010-11-23
打赏
举报
回复
哦,是这样的,我写了一个嵌入式系统,里面所有的读写请求buffer,都是直接发送到驱动的,然后必要时dma出去或进来,这样,从头到尾都是0拷贝的,之前运行的很好,但现在在arm9上出现了问题了,应该是buffer没有cacheline对齐引起的,所以我就想知道linux是怎么解决这种问题的,看来也是没办法解决的,要dma里安全的用cached memory,必须要cacheline对齐才行
知和行
2010-11-23
打赏
举报
回复
当然不用,可以在驱动通过dma_alloc_coherent 获取一块连续的用于DMA的内存,再在应用层用过mmap 映射到这块内存就可以了。
dysxq
2010-11-23
打赏
举报
回复
那就是没办法?从应到层到dma,至少要进行一次copy?
知和行
2010-11-23
打赏
举报
回复
应用层通过malloc 获得的内存,无法知道他的物理地址是多少,而且可能不连续。
dysxq
2010-11-23
打赏
举报
回复
我知道,我就是问,这个驱动使用的buffer,能不能从应用层直接map过来,而不用再次进行分配,拷贝
dma
_
map
_
single
dma
_
map
_sg理解
博客对
dma
_
map
_
single
分别与vmalloc、kmalloc进行测试。结果显示,
dma
_
map
_
single
映射vmalloc申请的
地址
时无法写入内容,而映射kmalloc申请的
地址
可正常写入。还介绍了kmalloc和vmalloc的内存分配特点,最后提及
dma
_
map
_sg接口对物理
地址
连续性的要求。
DMA
实践4:
使用
dma
_alloc_coherent替代
dma
_
map
_
single
本文详细介绍了Linux内核中用于
DMA
操作的两个关键函数:
dma
_alloc_coherent和
dma
_
map
_
single
。
dma
_alloc_coherent用于分配未缓存的内存,适用于设备直接访问;而
dma
_
map
_
single
则用于将已分配的内存映射到设备,适用于流式
DMA
传输。文章通过实例展示了如何在驱动程序中申请、
使用
和释放这两种类型的内存,并通过测试应用验证了
DMA
引擎和memcpy的性能。此外,还提供了驱动代码和用户空间测试代码供读者参考。
LINUX-
DMA
-子系统
本文深入介绍了
DMA
子系统,包括其软件框架、内存
地址
类型、Coherent
DMA
与Streaming
DMA
的
使用
、
DMA
地址
转换以及
DMA
API的详细
使用
。内容涵盖了
dma
_alloc_coherent、
dma
_pool、
dma
_
map
_
single
等关键接口,并解释了
DMA
方向和
DMA
engine的
使用
流程。
arm linux
dma
_
map
_
single
原理
本文探讨了Linux中的
DMA
映射,重点比较了流式
DMA
和一致性
DMA
,介绍了如何通过__
dma
_
map
_
single
处理
DMA
方向来维护cache一致性,以及__
dma
_
single
_cpu_to_dev和
dma
_un
map
_
single
中的cache操作。特别提到了
dma
_
map
_area和
dma
_un
map
_area的作用以及可能遇到的问题和解决方案。
Kernel下的
DMA
地址
映射详解
本文深入探讨了
DMA
地址
映射的实现细节,包括
dma
_
map
_
single
函数的工作原理、
DMA
缓冲区
地址
区间的划分及其与物理
地址
之间的映射关系。通过跟踪核心代码路径,揭示了
DMA
操作中物理
地址
和虚拟
地址
之间的转换机制。
Linux_Kernel
4,469
社区成员
17,458
社区内容
发帖
与我相关
我的任务
Linux_Kernel
Linux/Unix社区 内核源代码研究区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章