- 论坛徽章:
- 0
|
刚发表在了嵌入式开发中,可能不太合适,所以搬过来了
前几天在Intel i386 linux PC上移植了一个PCIE Ramdisk的驱动。遇到了分配的DMA区域数据不一致的情况,想不明白,希望得到大家指点:
在PC上通过dma_alloc_coherent()分配了一块区域,分配出来的physical address在0x15000~0x15000+1M区间。按照linux的Documentaion,用这个函数分配的区域能保证数据一致性,而且x86平台本身就有硬件保证让这段区域non-cacheable non-bufferable.
但是测试结果发现,这样分配的区域完全是cacheable 和bufferable的。
测试过程:
PC 往该段内存写入数据。然后让连在PC上的PCIe Device去做DMA read 那段物理地址。发现读出来的数据都是PC写之前的数据,大约过了8s或者通过cl_flush_cache()做cache flush之后,才能读到正确的数据。
而且,Device去做DMA write之后,PC不做invalidate的工作,拿到的数据也是更新前的。
最后在调用dma_alloc_coherent()分配后做个set_memory_uc()将分配的memory 设置为uncacheable, Device 做DMA read前 加入cl_flush_cache()才能保证Device 的DMA 读写 Host Memory数据的一致性。
请问在x86上怎样分配一致性内存区域让DMA去读取呢?为什么在用了通用的DMA 区域分配函数后,得到的内存区域还是cachable bufferable的呢? |
|