2

我正在学习/修改 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
4

1 回答 1

3

CR3寄存器的内容是给CPU的,不是给内核的。

软件总是使用虚拟地址。如果你想访问页表,你应该使用 ; 中的帮助宏<asm/page.h>。有关详细信息,请参阅页表管理(尽管它有些过时)。

于 2013-07-31T07:32:20.513 回答