gpt4 book ai didi

linux - 这种将数据写入特定物理内存地址的方式是如何工作的呢?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:40:11 28 4
gpt4 key购买 nike

我想将数据写入任意物理内存地址以测试我的系统的错误检测和纠正功能。现有内核模块中的一段代码是这样写的:

 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内存 Controller 中一个寄存器的寄存器地址。基本上,内存地址是在该寄存器中检索的。剩下的代码我看不懂,从获取一个页面开始,然后进行位运算。

据我了解,pfn_to_page 用于通过传入页框编号作为参数来获取包含特定物理地址的页面。 addr >> PAGE_SHIFT 部分是将给定地址转换为其对应的页框号。但是,我不明白如何正确使用 PAGE_SHIFT?与 PAGE_SHIFT 一起使用的正确数据类型应该是什么?

kmap() 返回适当的虚拟页面地址,然后添加偏移量以获得指向虚拟内存地址的正确指针。 (addr & (~PAGE_MASK)) 实际上做了什么?

我的任务是将错误注入(inject)写入物理地址?但是上面的代码好像是写入了一个虚拟地址。还有其他办法吗?

最佳答案

这个:

(addr & (~PAGE_MASK))

将清除在 PAGE_MASK 中设置的 addr 中的位。假设页面大小为 4 KB,PAGE_MASK 可能会设置其 12 个最低有效位,因为 212 = 4096。

所以,PAGE_MASK0x00000fff。然后,按位反转 ~PAGE_MASK 就是 0xfffff000,所以当 addr 与此进行按位与运算时,最低 12 位addr 被清除。

关于linux - 这种将数据写入特定物理内存地址的方式是如何工作的呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13970259/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com