私の知る限り、プロテクトモードはカーネルでアクティブ化され、grubステージではまだリアルモードです。私の誤解は次のとおりです。リアルモードでは、使用可能な合計メモリは1MB未満ですが、grubはどのようにしてカーネルとルートファイルシステム(通常は1MBより大きい)をメモリにロードできますか?
GRUBは、カーネル全体をメモリにロードする必要はありません。カーネルイメージは2つの部分に分割されます。
ブートローダーはリアルモードのカーネルコードのみをロードし、それが残りをブートストラップします(_Arch/x86/boot/pm.c
_のgo_to_protected_mode()
を見てください)。これは、プロセスがリアルモードで実行する場合のメモリ制限内にとどまる方法です。
小さな注意:GRUBは、実行内容に応じて、両方リアルモードとプロテクトモードで実行される場合があります。一部の機能(一部のハードウェア)では、プロテクトモードに切り替わる場合があります。検出、メニュー表示)。ただし、カーネルに到達したときにリアルモードであると考えるのは正しいです。
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: