リアルモードとLinuxカーネルロードの混乱

リアルモードとLinuxカーネルロードの混乱

私が知っている限り、保護モードはカーネルで有効になっていますが、グラブステップではまだリアルモードです。私の誤解は:リアルモードで利用可能な合計メモリは1MB未満ですが、grubはカーネルまたはルートファイルシステム(通常1MBより大きい)をどのようにメモリにロードしますか?

答え1

GRUBはカーネル全体をメモリにロードする必要はありません。カーネルイメージは2つの部分に分けられます。

  • リアルモードのカーネルコードは小さく、640kBの利用可能なメモリしきい値内でロードできます。
  • カーネルの残りの部分は保護モードで実行され、メモリの最初のメガバイトの後にロードされます。

ブートローダはリアルモードのカーネルコードのみをロードし、残りは再起動します(参考資料を参照go_to_protected_mode()arch/x86/boot/pm.c。これは、プロセスがリアルモードで実行されるメモリ制限内に保持される方法です。

ヒント:GRUBは以下で実行できます。両方実行している操作に応じて、実際のモードと保護モードがあります。特定の操作(特定のハードウェア検出とメニュー表示)については、保護モードに切り替えることができます。しかし、カーネルに到達したら、リアルモードにあると思うのは正しいです。

答え2

これは、BIOS int 0x15、0x87機能を介してリアルモードで実行できます。 GDTはソースとターゲットに対して正しく作成する必要があります。cx- 移動するバイト数。

    push edx
    push es
    xor  ax, ax
    mov  es, ax
    mov  ah, 0x87
    mov  si, gdt
    int  0x15
    jc   error
    pop  es
    pop  edx
    ret

gdt:
    times   16  db  0
    dw  0xffff              ; segment limit
.src:
    dw  0
    db  2
    db  0x93                ; data access rights
    dw  0
    dw  0xffff              ; segment limit
.dest:
    dw  0
    db  0x10                ; load protected-mode kernel to 100000h
    db  0x93                ; data access rights
    dw  0
    times   16  db  0

 error:

関連情報