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"
次の 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