コンピュータの起動プロセス#
ROM -> LOADER -> RUNTIME -> OS LOADER -> OS
- Loader:一般的なものには、BIOS と UEFI(後者は前者の後継者です)があります。一般的にはメモリの初期化とランタイムおよび OS ローダープログラムの読み込みを行います。
- Runtime:ファームウェアプログラムはランタイムサービスを提供するためのものであり、ハードウェアの最も基本的な抽象化です(OS に抽象化の一連を提供します)。
- OS Loader:または多くの人が
BootLoader
とも呼びます。ファイルシステムのブート、ネットワークカードのブート、オペレーティングシステムの起動設定、オペレーティングシステムのロードなどを行う必要があります。一般的な OS ローダーには GRUB、U-Boot、LinuxBoot などがあります。
UEFI がローダーを見つけて起動する方法#
現在、BIOS ではなく UEFI を使用してローダーを作成することが一般的ですが、BIOS の名前は口頭での習慣です。マザーボードの UEFI ファームウェアは efi
形式のファイルしか認識しないため、elf
形式のカーネルをロードすることはできません。この場合、OS ローダーが必要です。OS ローダーは、上位と下位の役割を果たすもので、UEFI 側では自身を efi
形式にパッケージ化し、特定の場所に保存します。kernel
に直面した場合は、elf
形式を解析してロードします。
このようにして、コンピュータは起動段階でローダーを正常に見つけ、さらに OS をロードして実行することができます。ローダーは実際にはプログラムの形式です。ローダーが存在する特定の場所は、起動デバイスの FAT32
フォーマットのパーティションに配置する必要があります。その後、このルートディレクトリの下に efi
ディレクトリを作成し、efi
ディレクトリの下に boot
ディレクトリを作成します。コンピュータのファームウェアはこの固定パスを使用してローダーを検索し、Bootx64.efi
という名前のファイルを配置する必要があります(32 ビットシステムの場合は 64 を含めることはできません)。
この FAT32
パーティションは通常、ディスク全体の最初の位置にあり、サイズは約 100M 程度です(GB やそれ以上でも柔軟に対応できます)。UEFI ファームウェアは FAT32
フォーマットのパーティションが存在するディスクをすべて起動ディスクとして扱い、これらのディスクを起動メニューに追加します。起動できるかどうかは関係ありませんが、具体的なターゲットを選択すると、固定パス(/efi/boot
で loader
を探す)を持つ UEFI プレフィックスがある場合は検索します。
同様に、ローダーは kernel
ファイルを検索する際も同じです。kernel
ファイルも同じディレクトリに配置されます。ローダーが kernel
ファイルを見つけると、elf
ファイル形式に従って解析し、実行可能な elf
ファイルであればメモリに読み込んで実行します。
FAT32 パーティション上のカーネルの読み込み方法#
これが UEFI の存在意義です。どのメモリにロードするか、セグメントまたはページングを考慮する必要はありません。UEFI は、起動段階と実行段階の両方で開発者が使用できる非常に豊富なサービスを提供します。起動時サービスと呼ばれるのは、その名の通り、これらのサービスが起動時にのみ利用可能であることを意味します。一方、ランタイムサービスは、コンピュータが起動を終えて正常に動作している場合にも使用できます。これらはすべて UEFI のインターフェースで提供されます。