ChatGPTに聞いて知った起動の流れ自分用メモ(64bit/x86/Ubuntuマシンでざっくり検証)
- 電源ユニットのボタンを押す
- 電源ユニットからマザーボードにリクエストが飛ぶ
- マザーボードが各種コンポーネント(メモリ、CPU、SSDなど)にリクエストを送って起動する
- CPUが起動して、CPUにハードコードされたリセットベクタ(起動時のメモリ空間はマザーボード上のフラッシュメモリ(4MB)のアドレスが主にマッピングされている)から処理が開始する
- UEFIプログラムは、SSDの先頭にあるGPT(パーティションやパーティションの情報が書かれている)を見て、GUIDがc12a7328-f81f-11d2-ba4b-00a0c93ec93bのパーティションをESPとして認識する
- ESPパーティションはUEFIの場合FAT32ファイルシステムでフォーマットされていることがUEFIレベルで定まっているので、UEFIプログラムは読み込める(UEFIプログラムはFAT32ドライバをもっている)。ESPにはブートローダー(一般にOSを起動するプログラム)が入っていて、FAT32ファイルシステム上で/EFI/Ubuntu/grubx64.efiが典型(Ubuntuだと/boot/efiにESPパーティションはマウントされる)。おそらく、grubx64.efiにext4ファイルシステムのドライバが入っていたりする
- GRUBは、UEFIやBIOS経由で起動されるブートローダプログラム。つまり、エントリーポイントがUEFI/BIOSで、そこからGRUBに処理が引き渡される
- GRUBが選択されると、GRUBは次のbootパーティションを読み込む。ここはUbuntuだと/bootにマウントされる箇所で、ext4ファイルシステムでフォーマットされていがち。このext4ファイルシステムの/grub/grub.cfg(Ubuntu上だと/boot/grub/grub.cfg)を読み込む。これに基づいて、GRUBは起動するOSを選ばせてくれる(grub.cfgにはGRUBシェルスクリプトが書かれており、OS非依存でGRUB環境のもと動くらしい)
- GRUBに処理が引き渡されているので、この中でOSを選べば、自由にOSを起動できる
個人的おもしろポイント
- CPUファームウェアによってBIOSかUEFIかは決まっている。その上でいくつかブートローダを選べる中で結局GRUBに処理が引き渡される。GRUBはUEFIより便利?なので、BIOSよりUEFIが進化しているとしても、嬉しい
- Windowsを起動したい場合、UEFIからESPのWindowsブートローダを直接選んでもいいし、GRUBブートローダを選んでGRUBのインターフェースからWindowsブートローダを選んでも良い
- リセットベクタは、x86だと0xFFFF0、RiscVだとデフォルトで0x00001000、ARMだと0x00000000_80000000など、およそISAごとに決まっているらしい