通过流DMA映射对主存储器的非一致性访问

时间:2018-10-14 17:13:41

标签: linux-kernel persistence linux-device-driver cpu-cache dma

背景

对于我的研究项目,我正在创建一个工具来验证为持久性(非易失性)内存设计的算法和数据结构的正确性。为了提供持久性内存问题的简要背景,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。我已将.namenum_resources字段适当地设置为上述resources

结果是内核 BUG 消息...

struct resource

我在这里丢失了一些东西。有没有更简单的方法可以直接从内存中读取数据而不进行DMA传输;如果没有,是否可以创建仅写入缓冲区的BUG: unable to handle kernel NULL pointer dereference at 0000000000000000

最小工作示例

下面是我正在尝试做的一个最小工作示例。在此测试中,我希望将一个值写入struct device,该值大概会保存在回写缓存中,然后执行非一致性的内存到内存流DMA传输到{{1} },因此testMemory应该是我们刚刚写给readMemory的其他任何值。

readMemory

0 个答案:

没有答案