DMA可以使用带cache的内存吗?

oncancel 2010-01-11 03:45:45
为了分配一块内存给DMA使用,一般用这两个函数分配内存 HalAllocateCommonBuffer,AllocPhysMem。这两个都函数可同时返回物理地址和虚拟地址。但这两个函数分配的内存都是uncached。
DMA应该是不使用cache的吧。如果我能在逻辑上保证(比如读之前flush cache)始终能读到内存中的数据,那有没有可能分配一块带cache的内存给DMA使用呢?该如何操作?
...全文
175 6 打赏 收藏 转发到动态 举报
写回复
用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

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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