dma_map_single可以使用任意的地址吗?

dysxq 2010-11-23 04:38:27
如题,使用dma_map_single来映射一块内存用于dma操作时,这个内存可以是任意地址比如说我堆栈中里的变量地址吗?还是说必须要cache对齐才行
又,有没有什么办法可以把应用层的一块内存传到内核,然后驱动通过dma直接把数据接收到这块缓存中(内存是随意地址的,可能未对齐)
...全文
1681 8 打赏 收藏 转发到动态 举报
写回复
用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过来,而不用再次进行分配,拷贝

4,441

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧