低レイヤーの学習が疎かだったので勉強中。
定期的にアウトプットしていこうと思う。
TL;DR
Linuxの起動順序(ブートプロセス)は
【BIOS/UEFI → ブートローダ → カーネル → init】
の流れで行われる。
1. BIOS起動〜ブートローダ起動
【BIOSとは】
ファームウェアの一つ。Basic I/O Systemの略でBIOSらしい。
最もハードウェアに近い部分を司り、物理的なハードウェア(マザーボード)上に搭載されている。BIOS自身はプログラムであり、フラッシュメモリ(フラッシュROM)に格納されている。
主に以下の設定ができる。
- 日付と時刻
- 電源管理
- 起動デバイスの優先順位
- 組み込みデバイスの有効/無効化
【処理の流れ】
1-1. PCの電源投入と同時にBIOS実行
これはそのまんまの意味。
BIOSはフラッシュメモリに格納されているため、何度も繰り返し書き込みができ、通電をやめても記憶内容が維持される。
1-2. POST処理
PCに接続している周辺機器(ビデオ、キーボード、メモリ、マウス、FDD、HDDなど)や組み込まれているパーツをチェックし、正常にPCを起動できるかどうかをチェックする。このことをPOST(Power On Self Test)処理というらしい。
1-3. 起動ドライブの決定
プログラムが動作し、設定された起動デバイスの優先順位に従ってOSが格納された外部記憶装置へアクセス。
BIOS → CD-DVD (優先順位:高)
→ HDD_01
→ HDD_02
→ HDD_03
→ USB (優先順位:低)
参照先のデバイスにOS起動ファイルがあればそいつに引導を渡し、空だったり起動用ファイルが無い場合はBIOSは次のデバイスを参照する。この過程で起動ドライブが決定し、BIOSはそのドライブの先頭セクタをロードする。
1-4. MBR読み込み ~ ブートローダ起動
起動ドライブ先頭領域(MBR)に記録されたOS起動用のプログラム(2次ブートローダ)を主記憶装置(メインメモリ/RAM)に読み込み、制御を移す。メモリ上に読み込んだ「ブートローダ」を実行する。
【MBRとは】
Master Boot Recordの略称であり、ハードディスクの先頭セクタに置かれ、PC起動時に最初に読み込まれる領域。
【ブートローダとは】
BIOSによる呼び出しを受け、外部記憶装置からOSを読み出して起動するもの。
ブートローダはプログラムであり、実際には二段階の異なるプログラムに分かれていることが多い。一般的に「ブートローダ」と言われているものは「二次ブートローダ」であり、前述したBIOSなどが「一次ブートローダ」という言葉で説明されるようなこともある。
Linuxでは一般的にGRUBというブートローダが用いられることが多い。
ユーザがどれか1つのOSを選択すると、GRUBはそのOSのカーネルとRAMディスクをメモリ上にロードし、カーネルの先頭アドレスにジャンプするとその役目を終える。
2. カーネル起動
- 高度にハードウェアを認識・制御。ルートファイルシステムのマウントなど様々な初期化処理を行う。
- メモリ上に展開された初期RAMディスク内の、ファイルシステムへアクセスするために必要なドライバやスクリプトを使用してルートファイルシステムからマウントする
- その後、initと言う特別な最初のプロセスをルートファイルシステムから起動する。
3. initプロセス起動
initは、UNIXおよびUnix系システムのプログラムのひとつであり、他の全てのプロセスを起動する役目を持つ。
デーモンとして動作し、一般にPID 1 を付与される。ブートローダがカーネルを起動し、カーネルがinitを起動する。という流れになる。
initの種類
BSD系/System V系のOSかによって異なる
initの代替
設計上の限界に対処するために、様々な代替が開発されてきた。
代表的なものとして
- Upstart
- systemd
がある。
その他
UEFI,GPTという存在について
実はBIOSはもう古くて、現在はUEFIというものに変わりつつある。
(UEFIはUnified Extensible Firmware Interfaceの略)
こいつは従来のBIOSを拡張した新しいファームウェアで、
- GUI操作をサポート
- ファームウェアが使用可能なメモリ量の上限緩和
などといった点でBIOSより優れている。
その他にもBIOSとUEFIの違いはいくつかあるが、その内のひとつとしてMBRとGPTがある。
HDDやSSDのディスクの先頭には、MBRかGPTというディスクのパーティション形式を規定する領域があり、
- BIOSでインストールするとMBR
- UEFIでインストールするとGPT
になる。システムドライブのパーティション形式は必ずこのようになり、前者をBIOSブート、後者をUEFIブートとも言う。
この辺の違いについても、後日追って書くようにしていきたい。