社区
嵌入开发(WinCE)
帖子详情
DMA可以使用带cache的内存吗?
oncancel
2010-01-11 03:45:45
为了分配一块内存给DMA使用,一般用这两个函数分配内存 HalAllocateCommonBuffer,AllocPhysMem。这两个都函数可同时返回物理地址和虚拟地址。但这两个函数分配的内存都是uncached。
DMA应该是不使用cache的吧。如果我能在逻辑上保证(比如读之前flush cache)始终能读到内存中的数据,那有没有可能分配一块带cache的内存给DMA使用呢?该如何操作?
...全文
175
6
打赏
收藏
DMA可以使用带cache的内存吗?
为了分配一块内存给DMA使用,一般用这两个函数分配内存 HalAllocateCommonBuffer,AllocPhysMem。这两个都函数可同时返回物理地址和虚拟地址。但这两个函数分配的内存都是uncached。 DMA应该是不使用cache的吧。如果我能在逻辑上保证(比如读之前flush cache)始终能读到内存中的数据,那有没有可能分配一块带cache的内存给DMA使用呢?该如何操作?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
Cache
和
DMA
一致性
DMA
应该多多少少知道点...
DMA
(Direct Memory Access)是指在外接可以不用CPU干预,直接把数据传输到
内存
的技术。这个过程中可以把CPU解放出来,可以很好的提升系统性能。那么
DMA
和
Cache
有什么关系呢?这也需要我们关注?
DMA
内存
大小、连续性、
cache
一致性、如何配置CMA的总结
1、
DMA
ZONE的大小只能是16M ? 这个答案在32位X86计算机的条件下是成立的,但是在其他的绝大多数情况下都不成立。...牛B的
DMA
引擎是访问
内存
范围是没有限制的,就可以不用
DMA
ZONE的
内存
,可以不
使用
GPF...
网卡设备中
DMA
与
Cache
的一致性问题
2、
DMA
传输要注意与
cache
的一致性问题。必须保证
DMA
缓冲区中的数据时最新的。有两种方法:
cache
flush和
cache
invalidate。1、网卡等外设的
DMA
传输,要求缓冲区的物理地址必须连续。因为
DMA
硬件时直接和
内存
进行数据...
dma
和
cache
的一致性
在介绍
cache
一致性之前,先明确一些概念~ 1、之前谈到
内存
空间的时候,我们知道
内存
空间包括
内存
和...
cache
的硬件
使用
LRU算法将
cache
里面的内容替换到
内存
。通常是这种方式。 我们假设MEM里面有一块红色的区域...
ARMV8 用户态
DMA
cache
一致性问题和解决
原因:
dma
和cpu都有操作
内存
的能力,
dma
操作
内存
不通过cpu和
cache
,即cpu ...如果给
dma
的是
带
cache
内存
,那么cpu访问的时候就需要注意。 armv8提供了
cache
相关指令解决上述问题,比如下面2条: dc civac Data or un
嵌入开发(WinCE)
19,502
社区成员
41,568
社区内容
发帖
与我相关
我的任务
嵌入开发(WinCE)
硬件/嵌入开发 嵌入开发(WinCE)
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章