単純なブートローダーがどのように機能するかを理解するのに苦労しています。私が話しているブートローダーは、MITのコース「オペレーティングシステムエンジニアリング」からのものです。
まず、BIOSが実行するアセンブリコードの一部を示します。
[f000:fec3] 0xffec3: lidtw %cs:0x7908
[f000:fec9] 0xffec9: lgdtw %cs:0x7948
[f000:fecf] 0xffecf: mov %cr0,%eax
[f000:fed2] 0xffed2: or $0x1,%eax
[f000:fed6] 0xffed6: mov %eax,%cr0
[f000:fed9] 0xffed9: ljmpl $0x8,$0xffee1
このコードは、見た目から、割り込みテーブルと記述子テーブルを設定してから、プロテクトモードをオンにします。
- BIOSでプロテクトモードに入るのはなぜですか?ブートローダーをリアルモードで実行するべきではありません(ところで、なぜリアルモードで実行する必要があるのですか?)
- 私は検索しましたが、ljmpl命令がどのように機能するかを正確にどこにも見つけられませんでした。これは、ljmpおよび通常のjmpとの違いです。誰かが正しい方向を指し示していただければ幸いです。
- なぜジャンプを実行するのですか?この指導の目的は何ですか?
ブートローダーコードに移ります-
# Switch from real to protected mode, using a bootstrap GDT
# and segment translation that makes virtual addresses
# identical to their physical addresses, so that the
# effective memory map does not change during the switch.
lgdt gdtdesc
movl %cr0, %eax
orl $CR0_PE_ON, %eax
movl %eax, %cr0
# Jump to next instruction, but in 32-bit code segment.
# Switches processor into 32-bit mode.
ljmp $PROT_MODE_CSEG, $protcseg
- プロセッサがリアルモードになっていると表示されますが、BIOSがプロテクトモードに切り替わるのを見たばかりです...混乱しています-どうすればこれが可能になるのでしょうか。
- 32ビットモードに切り替えるにはどうすればよいですか?ljmp命令が原因で、プロセッサが魔法のように32ビットモードになる原因は何ですか?
そして、私が理解していないもう1つのことは、gdbを使用してブートローダーの実行を追跡すると、次の命令が実行されていることを確認します(これは、ブートローダーコードのljmp命令です)。
ljmp $0x8,$0x7c32
しかし、.asmファイルを見ると、次のことがわかりました。
ljmp $0xb866,$0x87c32
ここで完全に失われました-.asmファイルに書き込まれた命令と実行された命令がどうして違うのですか?私はこれがプロテクトモードとそれがアドレスをどのように変換するかに関係しているという予感がありますが、私は実際にはそれを理解していません。
助けていただければ幸いです!