ブートローダ
BIOS による呼び出しを受けて、ブータブルディスク を探し、見つかったときに実行されるコード
ディスクが見つかると、ブートローダ と呼ばれる、先頭 512 バイトに保存された実行可能コードへと操作権が移る
しかし、多くのブートローダのサイズは 512 バイトよりも大きい
そのため、通常 512 バイトに収まる 一次ブートローダ と 二次ブートローダ の 2 ステップに分かられることが多い
ブートローダではざっくりと以下を行う
1. ディスク から OS カーネルを見つけ出し、メモリに読み込む
2. CPU を 16 bit の リアルモード から プロテクトモード へ、64 bit の ロングモード へと変更する
これにより、16 bit の化石のような OS にも対応できるようになっている
3. 特定の情報(e.g. メモリマップ など)を BIOS から聞き出し、OS のカーネルに渡す
ブートローダを実装するには、アセンブリ を必要とする
なので bootimage のような自動でカーネルの前にブートローダを置いてくれるツールも用意されている
warning.icon bootimage は BIOS のみにしか対応しておらず、UEFI にも対応していない
また、後述する標準基準 Multboot にも準拠していない
理由: ブートローダ#672f677075d04f0000e66fa8
1995 年に Multiboot というブートローダの公開標準規格が策定された
この規格では、ブートローダと OS の インタフェース が定義されており、Multiboot に準拠したブートローダであれば、同じくそれに準拠したすべての OS が読み込めるようになっている
その リファレンス実装 として、Linux システムのブートローダのデファクトスタンダードであある GNU GRUB がある
OS カーネル を Multiboot に準拠させるには、カーネルファイルの前頭に Multiboot header を挿入するだけで良い
しかし、Multiboot や GNU GRUB にはいくつか問題点もある
これらは 32 bit プロテクトモード しかサポートしていない
そのため 64 bit ロングモード に変更するための CPU の設定は依然行う必要がある
Multiboot はカーネルではなくブートローダがシンプルになるように設計されている
たとえば、通常とは異なるデフォルトページサイズでリンクされる必要があり、そうしないと GNU GRUB は Multiboot header を見つけることが出来ない
また、カーネルに渡される ブート情報 は抽象化を与えてくれず、アーキテクチャ 依存の構造を多く含む
GNU GRUB も Multiboot もドキュメントが充実していない
カーネルファイルから ブータブルディスク のイメージを作るには、ホストシステムに GRUB がインストールされている必要がある
そのため、Mac や Windows 上で OS を開発するのが難しくなる
参考: Multiboot 準拠の OS カーネル を Rust で実装する
https://os.phil-opp.com/multiboot-kernel/
参考
https://os.phil-opp.com/ja/minimal-rust-kernel/