社区
嵌入开发(WinCE)
帖子详情
DMA可以使用带cache的内存吗?
oncancel
2010-01-11 03:45:45
为了分配一块内存给DMA使用,一般用这两个函数分配内存 HalAllocateCommonBuffer,AllocPhysMem。这两个都函数可同时返回物理地址和虚拟地址。但这两个函数分配的内存都是uncached。
DMA应该是不使用cache的吧。如果我能在逻辑上保证(比如读之前flush cache)始终能读到内存中的数据,那有没有可能分配一块带cache的内存给DMA使用呢?该如何操作?
...全文
185
6
打赏
收藏
DMA可以使用带cache的内存吗?
为了分配一块内存给DMA使用,一般用这两个函数分配内存 HalAllocateCommonBuffer,AllocPhysMem。这两个都函数可同时返回物理地址和虚拟地址。但这两个函数分配的内存都是uncached。 DMA应该是不使用cache的吧。如果我能在逻辑上保证(比如读之前flush cache)始终能读到内存中的数据,那有没有可能分配一块带cache的内存给DMA使用呢?该如何操作?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
6 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
oncancel
2010-01-21
打赏
举报
回复
[Quote=引用 2 楼 oncancel 的回复:]
引用 1 楼 paul_chao 的回复:
1. DMA, 就是不透过 CPU 的 Core 做存取, 故其与 cache 是无关的, 但是在程式准备资料填入 dma 的 buffer 或是从 dma buffer 搬出时, 就与 cache 有关了.
2. LZ 可将得到的 physical address 再透过 VirtualAlloc/VirtualCopy 或是 MmMapIoSpace 等 API 即可获得 cached virtual address.
Paul, Chao @ Techware
你的意思是先用AllocPhysMem分配一块物理地址并得到一个虚拟地址,再把这块地址用MmMapIoSpace重新映射一次虚拟地址?这样的操作合法吗?释放的时候也先MmUnMapIoSpace再FreePhysMem?
va1=AllocPhysMem(size,PAGE_READONLY,0,0,&pa,LowPart);
va2=MmMapIoSpace(pa,size,TRUE);
...
MmUnMapIoSpace(va2,size);
FreePhysMem(va1);
[/Quote]
经验证,此法可行。thanks。
xumercury
2010-01-19
打赏
举报
回复
[Quote=引用 1 楼 paul_chao 的回复:]
1. DMA, 就是不透过 CPU 的 Core 做存取, 故其与 cache 是无关的, 但是在程式准备资料填入 dma 的 buffer 或是从 dma buffer 搬出时, 就与 cache 有关了.
2. LZ 可将得到的 physical address 再透过 VirtualAlloc/VirtualCopy 或是 MmMapIoSpace 等 API 即可获得 cached virtual address.
Paul, Chao @ Techware
[/Quote]
mark
mxm1986
2010-01-19
打赏
举报
回复
我只知道底层有寄存器可以是某段内存空间禁用cache的
wolfmvp
2010-01-19
打赏
举报
回复
[Quote=引用 1 楼 paul_chao 的回复:]
1. DMA, 就是不透过 CPU 的 Core 做存取, 故其与 cache 是无关的, 但是在程式准备资料填入 dma 的 buffer 或是从 dma buffer 搬出时, 就与 cache 有关了.
2. LZ 可将得到的 physical address 再透过 VirtualAlloc/VirtualCopy 或是 MmMapIoSpace 等 API 即可获得 cached virtual address.
Paul, Chao @ Techware
[/Quote]学习了…
oncancel
2010-01-11
打赏
举报
回复
[Quote=引用 1 楼 paul_chao 的回复:]
1. DMA, 就是不透过 CPU 的 Core 做存取, 故其与 cache 是无关的, 但是在程式准备资料填入 dma 的 buffer 或是从 dma buffer 搬出时, 就与 cache 有关了.
2. LZ 可将得到的 physical address 再透过 VirtualAlloc/VirtualCopy 或是 MmMapIoSpace 等 API 即可获得 cached virtual address.
Paul, Chao @ Techware
[/Quote]
你的意思是先用AllocPhysMem分配一块物理地址并得到一个虚拟地址,再把这块地址用MmMapIoSpace重新映射一次虚拟地址?这样的操作合法吗?释放的时候也先MmUnMapIoSpace再FreePhysMem?
va1=AllocPhysMem(size,PAGE_READONLY,0,0,&pa);
va2=MmMapIoSpace(pa,size,TRUE);
...
MmUnMapIoSpace(va2,size);
FreePhysMem(va1);
paul_chao
2010-01-11
打赏
举报
回复
1. DMA, 就是不透过 CPU 的 Core 做存取, 故其与 cache 是无关的, 但是在程式准备资料填入 dma 的 buffer 或是从 dma buffer 搬出时, 就与 cache 有关了.
2. LZ 可将得到的 physical address 再透过 VirtualAlloc/VirtualCopy 或是 MmMapIoSpace 等 API 即可获得 cached virtual address.
Paul, Chao @ Techware
linux
dma
cache
flush,linux
dma
cache
说到
DMA
,就会想到
Cache
,两者本身似乎是好不相关的事物。的确,假设
DMA
针对
内存
的目的地址和
Cache
缓存的对象没有重叠区域,
DMA
和
Cache
之间就相安无事,但是,如果有重叠呢,经过
DMA
操作,
Cache
缓存对应的
内存
的数据已经被修改,而CPU本身并不知道,它仍然认为
Cache
中的数据仍然还是
内存
中的数据,以后访问
Cache
映射的
内存
时,它仍然
使用
陈旧的
Cache
数据,这就会发生
Cache
...
DMA
内存
大小、连续性、
cache
一致性、如何配置CMA的总结
1、
DMA
ZONE的大小只能是16M ? 这个答案在32位X86计算机的条件下是成立的,但是在其他的绝大多数情况下都不成立。 首先我们要理解
DMA
ZONE产生的历史原因是什么。
DMA
可以直接在
内存
和外设之间进行数据搬移,对于
内存
的存取来讲,它和CPU一样,是一个访问master,可以直接访问
内存
。
DMA
ZONE产生的本质原因是:不一定所有的
DMA
都可以访问到所有的
内存
,这本质上是硬件的设计限制。牛B的
DMA
引擎是访问
内存
范围是没有限制的,就可以不用
DMA
ZONE的
内存
,可以不
使用
GPF...
Cache
和
DMA
一致性
DMA
应该多多少少知道点吧。
DMA
(Direct Memory Access)是指在外接可以不用CPU干预,直接把数据传输到
内存
的技术。这个过程中可以把CPU解放出来,可以很好的提升系统性能。那么
DMA
和
Cache
有什么关系呢?这也需要我们关注?
【
DMA
】如何保证
DMA
和
cache
的一致性
【
DMA
】如何保证
DMA
和
cache
的一致性
ARMV8 用户态
DMA
cache
一致性问题和解决
原因:
dma
和cpu都有操作
内存
的能力,
dma
操作
内存
不通过cpu和
cache
,即cpu
cache
感知不到
dma
对
内存
的操作 因此cpu和
dma
合作时,就会存在cpu
cache
和
内存
的一致性问题,原因是
dma
对
内存
操作无法被
cache
感知。 当然如果给
dma
的
内存
是no
cache
的,cpu不会
使用
cache
,也就不存在相关问题。 如果给
dma
的是
带
cache
内存
,那么cpu访问的时候就需要...
嵌入开发(WinCE)
19,519
社区成员
41,565
社区内容
发帖
与我相关
我的任务
嵌入开发(WinCE)
硬件/嵌入开发 嵌入开发(WinCE)
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章