web-dev-qa-db-ja.com

リアルモードとLinuxカーネルの読み込みが混乱する

私の知る限り、プロテクトモードはカーネルでアクティブ化され、grubステージではまだリアルモードです。私の誤解は次のとおりです。リアルモードでは、使用可能な合計メモリは1MB未満ですが、grubはどのようにしてカーネルとルートファイルシステム(通常は1MBより大きい)をメモリにロードできますか?

4
Bình Nguyên

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

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

ブートローダーはリアルモードのカーネルコードのみをロードし、それが残りをブートストラップします(_Arch/x86/boot/pm.c_のgo_to_protected_mode()を見てください)。これは、プロセスがリアルモードで実行する場合のメモリ制限内にとどまる方法です。

小さな注意:GRUBは、実行内容に応じて、両方リアルモードとプロテクトモードで実行される場合があります。一部の機能(一部のハードウェア)では、プロテクトモードに切り替わる場合があります。検出、メニュー表示)。ただし、カーネルに到達したときにリアルモードであると考えるのは正しいです。

5
Chris Down

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:
0
ankhmesut