对于我的研究项目,我正在创建一个工具来验证为持久性(非易失性)内存设计的算法和数据结构的正确性。为了提供持久性内存问题的简要背景,CPU高速缓存是易失的,因此回写高速缓存中的挂起写操作将在断电时丢失,从而导致不一致。因此,为了验证此类算法的正确性,我计划定期检查主内存的内容,而不会从其他CPU缓存甚至当前 CPU的缓存中侦听,并使用作为验证正确性的一种手段。
经过大量研究,我发现可以执行非相干DMA,但只能通过流DMA映射来执行。我遇到的问题是DMA需要一个struct device
,它代表一个实际的设备,但是我想做的只是将它们读入缓冲区。
我已经分配了缓冲区 B ,并尝试使用platform_device
(linux / platform_device.h)API创建伪设备。我使用platform_device_alloc
分配struct platform_device
(带有NULL检查),我设置struct resource
来设置.start = virt_to_phys(B)
,.end = dirt_to_phys(B) + sizeof(B)
和{{1 }},以及.flag = IORESOURCE_MEM
。我已将.name
和num_resources
字段适当地设置为上述resources
。
结果是内核 BUG 消息...
struct resource
我在这里丢失了一些东西。有没有更简单的方法可以直接从内存中读取数据而不进行DMA传输;如果没有,是否可以创建仅写入缓冲区的BUG: unable to handle kernel NULL pointer dereference at 0000000000000000
?
下面是我正在尝试做的一个最小工作示例。在此测试中,我希望将一个值写入struct device
,该值大概会保存在回写缓存中,然后执行非一致性的内存到内存流DMA传输到{{1} },因此testMemory
应该是我们刚刚写给readMemory
的其他任何值。
readMemory