社区
Linux_Kernel
帖子详情
dma_map_single可以使用任意的地址吗?
dysxq
2010-11-23 04:38:27
如题,使用dma_map_single来映射一块内存用于dma操作时,这个内存可以是任意地址比如说我堆栈中里的变量地址吗?还是说必须要cache对齐才行
又,有没有什么办法可以把应用层的一块内存传到内核,然后驱动通过dma直接把数据接收到这块缓存中(内存是随意地址的,可能未对齐)
...全文
1751
8
打赏
收藏
dma_map_single可以使用任意的地址吗?
如题,使用dma_map_single来映射一块内存用于dma操作时,这个内存可以是任意地址比如说我堆栈中里的变量地址吗?还是说必须要cache对齐才行 又,有没有什么办法可以把应用层的一块内存传到内核,然后驱动通过dma直接把数据接收到这块缓存中(内存是随意地址的,可能未对齐)
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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
,除了将skb
地址
转换为物理
地址
外,还要将CPU cache写回(因为cache里可能是新的,内存里是旧的)。
DMA
需要的内存由内核去申请,内核可能需要对这段内存重新做一遍映射,特点是映射的时候标记这些页是不带cache的,这个特性也是存放在页表里面的。
Arm linux
dma
map
ping操作
Arm linux
dma
map
ping 目 录 1 概述 3 2 基本概念 3 3 Cache操作 4 3.1 写数据到device 4 3.2 从device读数据 4 3.3 swio技术 4 3.4 代码分析 5 3.4.1 arm64_
dma
_init 5 3.4.2
dma
_
map
_
single
6 3.4.3
dma
_un
map
_
single
8 概述 由于处理器存在cache, ...
关于
dma
_alloc_coherent的用法
目录 概述
DMA
映射 建立一致性
DMA
映射
DMA
池 建立流式
DMA
映射 单页流式映射 分散/聚集映射 PCI双重
地址
周期映射 DAC 简单的PCI
DMA
例子 ISA设备
DMA
概述
DMA
的操作是需要物理
地址
的,但是在linux内核中
使用
的都是虚拟
地址
,如果想要用
DMA
对一段内存进行操作,如何得到这一段内存的物理
地址
和虚拟
地址
的映射呢?
dma
_alloc_coherent这个函数实现了这种机制。 1、函数原型: void *
dma
_alloc_coherent( struct
Linux 下的
DMA
浅析
DMA
是一种无需CPU的参与就可以让外设和系统内存之间进行双向数据传输的硬件机制。
使用
DMA
可以使系统CPU从实际的I/O数据传输过程中摆脱出来,从而大大提高系统的吞吐率。
DMA
经常与硬件体系结构特别是外设的总线技术密切相关。 一、
DMA
控制器硬件结构
DMA
允许外围设备和主内存之间直接传输 I/O 数据,
DMA
依赖于系统。 每一种体系结构
DMA
传输不同,编程接口也不同。 数据传输可以以两...
linux中关于
dma
_alloc_coherent的用法
大家都知道,
DMA
的操作是需要物理
地址
的,但是在linux内核中
使用
的都是虚拟
地址
,如果我们想要用
DMA
对一段内存进行操作,我们如何得到这一段内存的物理
地址
和虚拟
地址
的映射呢?
dma
_alloc_coherent这个函数实现了这种机制。 1、函数原型:void *
dma
_alloc_coherent(struct device *dev, size_t size,
dma
_addr_t *d
Linux_Kernel
4,465
社区成员
17,462
社区内容
发帖
与我相关
我的任务
Linux_Kernel
Linux/Unix社区 内核源代码研究区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章