0

Linuxカーネルとメモリ管理について少し学ぼうとしています。これを行うために、CR0 レジスタの内容をダンプするカーネル モジュール コードを少し書きました。CR0 のビット 31 が設定されている場合、カーネルによってページングがオンになっていることを示していることを理解していますが、CR0 を印刷すると (私の特定のインスタンスでは) 0x2 に設定されていることがわかります。これは、(私の理解が正しければ) ページングが無効であり、プロセッサがリアル モード (ビット 0 も設定されていない) であることを示しています。プロテクト モード/ページング メモリを期待していたので、これには驚きました。カーネルをリアル モード/非ページングで実行し、ユーザー空間をプロテクト モード/ページングにすることはできますか? ここに表示されているものが表示される理由を誰かが説明できますか?

2.6.18-274.el5 カーネル (64 ビット RHEL 5 バイナリ) を実行していることに注意してください。

コードに小さなバグがあったため、CR0 レジスタの代わりにランダムなガベージを出力していました。以下は作業コードです - アセンブリでコーディングしている場合は read_c0 関数を呼び出す必要がないことに注意してください...

.globl init_module
.globl cleanup_module
.text
init_module:
    nop
    movq    $ENTER_MSG,     %rdi
    movq    %cr3,           %rsi
    movq    %rsi,           %rdx
    shrq    $12,            %rdx
    movq    %cr0,           %r11
    movq    $FALSE,         %rcx
    andq    PAGING_BIT_31,  %r11
    cmpq    PAGING_BIT_31,  %r11
    jne     .CONT1
    movq    $TRUE,          %rcx
.CONT1:
    movq    $FALSE,         %r8
    movq    %cr0,           %r12
    andq    PROTMOD_BIT_0,  %r12
    cmpq    PROTMOD_BIT_0,  %r12
    jne     .CONT2
    movq    $TRUE,          %r8
.CONT2:
    movq    %cr0,           %r9
    xorq    %rax,           %rax
    callq   printk
    xorq    %rax,           %rax
    retq

cleanup_module:
    nop
    movq    $LEAVE_MSG,     %rdi
    movq    %cr3,           %rsi
    xorq    %rax,           %rax
    callq   printk
    retq

.section .rodata
ENTER_MSG:
    .asciz "\n\nHELLO! CR3: %p, pCR3: %p \n\tPAGING IS %s\n\tPROTECTED MODE IS %s\n\tCR0: %p\n" 
LEAVE_MSG:
    .asciz "GOODBYE! CR3: %p\n"
PAGING_BIT_31:
    .quad 0x80000000
PROTMOD_BIT_0:
    .quad 0x1
FALSE:
    .asciz "OFF"
TRUE:
    .asciz "ON"
4

0 に答える 0