我正在学习/修改x86-64 linux上的内核内存管理。我想使用下面的asm代码查看cr3指向的页面目录的开头,但取消引用cr3会导致内核锁定。访问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
答案 0 :(得分:3)
CR3寄存器的内容适用于CPU,不适用于内核。
软件始终使用虚拟地址。
如果要访问页表,则应使用<asm/page.h>
中的帮助程序宏;
有关详细信息,请参阅Page Table Management(虽然它有些过时)。