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 に答える