社区
Linux_Kernel
帖子详情
dma_map_single可以使用任意的地址吗?
dysxq
2010-11-23 04:38:27
如题,使用dma_map_single来映射一块内存用于dma操作时,这个内存可以是任意地址比如说我堆栈中里的变量地址吗?还是说必须要cache对齐才行
又,有没有什么办法可以把应用层的一块内存传到内核,然后驱动通过dma直接把数据接收到这块缓存中(内存是随意地址的,可能未对齐)
...全文
1681
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过来,而不用再次进行分配,拷贝
Linux内存管理 —— DMA和一致性缓存(dma_alloc_coherent(),dma_map_sg())
还有一个接口dma_cache_sync(),可以手动去做cache同步,上面说dma_alloc_coherent()分配的是uncached内存,但有时给DMA用的内存是其他模块已经分配好的,例如协议栈发包时,最终要把skb的
地址
和长度交给DMA,除了将...
Arm linux dma mapping操作
Arm linux dma mapping 目 录 1 概述 3 2 基本概念 3 3 Cache操作 4 3.1 写数据到device 4 ...3.4.1 arm64_dma_init 5 ...3.4.2
dma_map_single
6 3.4.3 dma_unmap_single 8 概述 由于处理器存在cache, ...
关于dma_alloc_coherent的用法
DMA的操作是需要物理
地址
的,但是在linux内核中
使用
的都是虚拟
地址
,如果想要用DMA对一段内存进行操作,如何得到这一段内存的物理
地址
和虚拟
地址
的映射呢?dma_alloc_coherent这个函数实现了这种机制。 1、函数原型...
Linux 下的DMA浅析
使用
DMA可以使系统CPU从实际的I/O数据传输过程中摆脱出来,从而大大提高系统的吞吐率。DMA经常与硬件体系结构特别是外设的总线技术密切相关。 一、DMA控制器硬件结构 DMA允许外围设备和主内存之间直接传输 I/O 数据...
linux中关于dma_alloc_coherent的用法
大家都知道,DMA的操作是需要物理
地址
的,但是在linux内核中
使用
的都是虚拟
地址
,如果我们想要用DMA对一段内存进行操作,我们如何得到这一段内存的物理
地址
和虚拟
地址
的映射呢?dma_alloc_coherent这个函数实现了...
Linux_Kernel
4,441
社区成员
17,460
社区内容
发帖
与我相关
我的任务
Linux_Kernel
Linux/Unix社区 内核源代码研究区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章