我在玩耍,试图在我的安装了Linux的x86_64 CPU上手动执行页表遍历。
我想尝试使用Linux API和手动查看页面表值来获得相同的值。
我在这里找到了https://www.kernel.org/doc/gorman/html/understand/understand006.html,其中CR3的值应等于current->mm->pgd。但实际上并不是这样的:
current->mm->pgd = 0x457ec6067
cr3 = 0x45700a006
current->mm->pgd 似乎在运行过程中保持不变。我错过了什么吗?
谢谢!
编辑。这是我的代码:
__asm__ __volatile__ (
"mov %%cr3, %%rax\n\t"
"mov %%rax, %0\n\t"
: "=m" (cr3)
:
: "%rax"
);
pr_err("cr3 = 0x%lx ", (long)cr3);
pr_err("\tcurrent->mm->pgd = 0x%lx\n", current->mm->pgd->pgd);
pr_err
在你读取current->mm->pgd->pgd
之前运行。如果您使用一个调用该函数的格式字符串来处理两个操作数,会发生什么? - Peter Cordes