我想将数据写入任意物理内存地址,以测试我系统的错误检测和纠正功能。现有内核模块中的一个代码段是这样编写的:
u32 addr;
struct page *page;
void *mem;
pci_read_config_dword(priv->mc, I5100_MEMEINJADDRMAT, &addr);
/* Inject error by writing to address */
page = pfn_to_page(addr >> PAGE_SHIFT);
mem = kmap(page) + (addr & (~PAGE_MASK));
*((volatile u32*) (mem)) = 0x01010101;
kunmap(page);
I5100_MEMEINJADDRMAT
是 i5100 内存控制器中寄存器的寄存器地址。基本上,在该寄存器中检索内存地址。我不明白剩下的代码,从检索页面开始,然后执行按位运算。
据我了解,pfn_to_page
用于通过传入页框号作为参数来获取包含特定物理地址的页面。该addr >> PAGE_SHIFT
部分是从给定地址转换为其相应的页框号。但是,我不明白如何PAGE_SHIFT
正确使用?使用的正确数据类型应该是什么PAGE_SHIFT
?
kmap()
返回适当的虚拟页面地址,然后添加偏移量以获得指向虚拟内存地址的正确指针。实际上是做什么的(addr & (~PAGE_MASK))
?
我的任务是将错误注入写入物理地址?但是上面的代码似乎写入了一个虚拟地址。还有其他方法吗?