ファームウェア
ファームウェアは、ハードウェアデバイスの基本的な制御と管理を行うソフトウェアで、ハードウェアが正常に動作するための初期化や自己診断などの基本的な指示を提供する。
これは通常、デバイスのROM(読み出し専用メモリ)に埋め込まれており、デバイスの電源が投入されたときに最初に実行される。
ファームウェアの役割
ファームウェアはハードウェアの初期設定や操作を効果的に管理し、デバイスの基本的な動作を保証する。
ファームウェアの場所
ファームウェアは通常、コンピューターまたは他の電子デバイス内のROM(読み出し専用メモリ)に埋め込まれている。
このメモリはハードウェアに直接組み込まれており、電源を切ってもその内容が失われないため、デバイスが起動するたびにファームウェアが実行される。
具体的には、以下のような形で保存される。
BIOS、UEFIチップ
パーソナルコンピューターでは、ファームウェアはBIOS(Basic Input/Output System)やUEFI(Unified Extensible Firmware Interface)の形で、マザーボード上の専用チップに格納されている。
組み込みシステム
スマートフォンや家電製品などの組み込みシステムでは、ファームウェアがフラッシュメモリやその他の非揮発性メモリに保存されており、これにより、デバイスの基本機能をコントロールするプログラムが保持される。
ハードウェアコンポーネント
プリンターやルーターなどのデバイスでは、ファームウェアがそれぞれの機能を司る専用のハードウェアコンポーネント内に存在する。
POST(Power-On Self Test)
ファームウェアのPOST(Power-On Self Test)は、コンピューターや他の電子デバイスが電源を投入された際に自動的に実行される自己診断プロセス。
POSTはシステムの信頼性を確保し、起動時にハードウェア関連の問題がある場合に早期に警告する重要な役割を果たす。
このテストはデバイスのハードウェアが正常に機能しているかを確認し、システムに問題がないことを保証するためのもので、特に新しいシステムをセットアップする際や、ハードウェアのアップグレード後にはこのプロセスが非常に重要となる。
POSTの主な機能とプロセス
下記の通り。
ハードウェアの検証
POSTはCPU、メモリ(RAM)、データストレージデバイス(ハードドライブやSSD)、入出力デバイス(キーボード、マウス)、ビデオカードなどの主要なコンポーネントをチェックする。
これには、コンポーネントが適切に接続され、機能しているかを確認するテストが含まれる。
エラーチェック
ハードウェアのテスト中にエラーが発見された場合、POSTはエラーコードを表示するか、またはビープ音のシーケンス(ビープコード)を使って問題を報告する。
システム設定の読み込み
POSTはBIOSやUEFI設定からシステムの構成情報を読み込む。
これにはブート順序やデバイスの構成設定などが含まれ、システムがどのデバイスから起動すべきかを決定する。
ブートローダーへの制御の移行
POSTがすべての初期チェックを完了し、システムに重大な問題がないと判断された場合、ファームウェアはブートローダーに制御を移す。ブートローダーはその後、オペレーティングシステムのカーネルをロードし、システムの起動プロセスを続けます。
ブートローダーとの関係
ブートローダーはファームウェアによって呼び出される。
ブートローダーは、コンピューターや他のデバイスの起動プロセスにおいて非常に重要な役割を果たすソフトウェアコンポーネントで、このプログラムは、デバイスのファームウェア(BIOSやUEFIなど)によって最初にロードされ、その後、オペレーティングシステムのカーネルをストレージからメモリに読み込む責任を持つ。
詳細は、ブートローダーの記事を参照
カーネルとの関係性
ファームウェアはOSの核であるカーネルと密接な関係がある。
ファームウェアとカーネルの関係は、ファームウェアがハードウェアを初期化し、基本的なハードウェアの設定を行った後、オペレーティングシステムをロードし、その中核であるカーネルに制御を渡すという流れで表される。
つまり、ファームウェアはカーネルがその機能を発揮するための「土台」を提供し、カーネルはその上でシステム全体の統合的な管理を行うという役割分担がある。
このように、ファームウェアとカーネルはシステムを起動し、効率的に運用するために互いに依存しながら協力して機能する。
制御
「制御」を受け渡すという文脈で、コンピュータシステムのブートプロセスにおける「制御」は、CPUの実行フロー、つまりプロセッサが次にどの命令を実行するかを指定することを意味し、この制御の受け渡しは、低レベルのプログラムからより高レベルのプログラムへ、正確にはブートローダーからオペレーティングシステムのカーネルへの処理の移行を指す。
詳しくは、制御(コンピュータ)の記事を参照
ブートストラップ
上記のカーネルとの関連性は、一連の手順を通じて、ファームウェアからカーネル、そして最終的にはユーザーに対するアプリケーションへと、システム制御がスムーズに移行していく。
この過程は、コンピューターのアーキテクチャやオペレーティングシステムによって若干の違いがあるものの、基本的な流れは下記の通り。
電源投入(Power-On Self Test, POST)
コンピューターの電源が入ると、ファームウェアに埋め込まれたPOSTが自動的に実行されます。POSTはハードウェアのチェックを行い、CPU、メモリ、入出力システムなどの基本的なハードウェアが正しく機能しているかを確認します。問題がなければ次のステップへ進みます。
ブートローダーの起動
ファームウェアはストレージデバイス上のブートローダー(例えば、GRUBやWindows Boot Manager)の位置を特定し、そのコードをメモリに読み込みます。ブートローダーはファームウェアから制御を受け取り、オペレーティングシステムのカーネルをディスクから読み込むための次の手順を準備します。
カーネルのロード
ブートローダーはオペレーティングシステムのカーネルイメージをハードディスクやSSDからRAMに読み込みます。このイメージにはカーネル本体と必要なドライバやモジュールが含まれています。
カーネルの初期化
カーネルがメモリにロードされると、自身の初期化プロセスを開始します。このプロセスには、さらなるハードウェアの検出と初期化、システムサービスの設定、プロセス管理機構の立ち上げなどが含まれます。
ユーザースペースへの移行
カーネルがシステムの基本的なセットアップを完了すると、最終的にはユーザースペースプログラム(例えば、initやsystemd)に制御を移します。
これにより、ユーザー向けのサービスが起動し、ログインプロンプトが表示されたり、グラフィカルなデスクトップ環境が開始されたりします。