私が知っている限り、保護モードはカーネルで有効になっていますが、グラブステップではまだリアルモードです。私の誤解は:リアルモードで利用可能な合計メモリは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: