x86 linux cr3注册解除引用(我怎样才能到达一个页面目录?)

我正在学习/修补x86-64 linux上的内核内存pipe理。 我想使用下面的asm代码来查看cr3指向的页面目录的开头,但是解除引用cr3会导致内核locking。 访问cr3要点的正确方法是什么? 注意我知道我需要在环0,因此代码是一个小的内核模块(kmod.S):

.globl init_module .globl cleanup_module .text init_module: nop movq $ENTER_MSG, %rdi movq %cr3, %rsi movq (%rsi), %rdx xorq %rax, %rax callq printk xorq %rax, %rax retq cleanup_module: nop movq $LEAVE_MSG, %rdi xorq %rax, %rax callq printk retq .section .rodata ENTER_MSG: .asciz "\n\nHELLO! CR3: %p, (CR3): %p\n" LEAVE_MSG: .asciz "GOODBYE!\n\n" 

并使用folling Makefile进行编译:

 obj-m += kmodule.o kmodule-objs := kmod.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 

CR3寄存器的内容是针对CPU的,而不是针对内核的。

软件始终使用虚拟地址。 如果你想访问页表,你应该使用<asm/page.h>的助手宏; 有关详细信息,请参阅页面表管理 (尽管已经过时了)。