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

flyaround   2010-1-11 15:45 楼主
    为了分配一块内存给DMA使用,一般用这两个函数分配内存 HalAllocateCommonBuffer,AllocPhysMem。这两个都函数可同时返回物理地址和虚拟地址。但这两个函数分配的内存都是uncached。
    DMA应该是不使用cache的吧。如果我能在逻辑上保证(比如读之前flush cache)始终能读到内存中的数据,那有没有可能分配一块带cache的内存给DMA使用呢?该如何操作?

回复评论 (6)

1. DMA, 就是不透过 CPU 的 Core 做存取, 故其与 cache 是无关的, 但是在程式准备资料填入 dma 的 buffer 或是从 dma buffer 搬出时, 就与 cache 有关了.

2. LZ 可将得到的 physical address 再透过 VirtualAlloc/VirtualCopy 或是 MmMapIoSpace 等 API 即可获得 cached virtual address.

Paul, Chao @ Techware
点赞  2010-1-11 16:12
引用: 引用 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);
va2=MmMapIoSpace(pa,size,TRUE);
...
MmUnMapIoSpace(va2,size);
FreePhysMem(va1);
点赞  2010-1-11 16:23
我只知道底层有寄存器可以是某段内存空间禁用cache的
点赞  2010-1-19 11:12
引用: 引用 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

mark
点赞  2010-1-19 11:20
引用: 引用 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
学习了…
点赞  2010-1-19 15:38
引用: 引用 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);


经验证,此法可行。thanks。
点赞  2010-1-21 15:42
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复