この記事は、以前の「ファームウェア・ハードウェア・システム」と「ファームウェアとドライバ」の内容を統合したものです。まず、次の関係を覚えてください。
ハードウェア
↕
デバイスファームウェア
↕
Linux カーネルドライバ
↕
カーネルサブシステムとシステムコール
↕
ユーザー空間のプログラム1. ハードウェア#
ハードウェアは、計算、記憶、入出力を実際に行う物理的な装置です。CPU、メモリ、NVMe SSD、GPU、Wi-Fi アダプタ、サウンドカード、USB 機器などが含まれます。
ハードウェアが理解できるのは、レジスタ、キュー、割り込み、DMA、バスプロトコルなどの低レベルなインターフェースです。「ファイルを開く」「ネットワーク要求を送る」といった高レベルの操作を使うには、ファームウェアとドライバが必要です。
2. ファームウェア#
ファームウェア(firmware)は、ハードウェアまたはプラットフォーム固有の環境で実行される低レベルソフトウェアです。
2.1 プラットフォームファームウェア#
Legacy BIOS、UEFI、ACPI テーブル、CPU microcode の更新機構などが該当します。主にマザーボードや関連チップの不揮発性メモリに保存され、OS が起動する前にハードウェアを初期化します。UEFI は ESP から EFI プログラムを読み込み、起動項目を選択することもできます。
2.2 デバイスファームウェア#
Wi-Fi カード、GPU、SSD、カメラ、サウンドカードなどには、デバイス自身のマイクロコントローラで実行されるファームウェアが含まれることがあります。デバイス内部に保存され続けるものもあれば、Linux のドライバが初期化時にファイルを読み込んでデバイスへ送るものもあります。
3. ドライバ#
ドライバ(driver)は、OS が特定のハードウェアを認識・設定・利用するためのソフトウェアです。Linux のドライバは多くの場合カーネル空間で動作し、カーネルモジュールとして動的に読み込まれることもあります。
ドライバは次の仕事を担当します。
- デバイスを検出し、対応するバスやデバイスドライバに結び付ける。
- レジスタ、DMA、割り込み、デバイスキューを管理する。
- ネットワーク、ブロックデバイス、USB、音声、DRM などのカーネルサブシステムに統一されたインターフェースを提供する。
- 必要に応じてデバイスファームウェアを要求し、デバイスへ読み込む。
ユーザー空間のプログラムは、通常、レジスタを直接操作せず、システムコール、デバイスファイル、ネットワークインターフェース、グラフィックス API を通じてカーネルを利用します。
4. ファームウェアとドライバの違い#
| 比較項目 | ファームウェア | ドライバ |
|---|---|---|
| 主な実行場所 | プラットフォーム、デバイス内部、またはデバイスへ読み込まれた領域 | Linux カーネル空間、一部の補助処理はユーザー空間 |
| 主な役割 | ハードウェア内部の低レベル処理を初期化・実行する | カーネルがデバイスを制御するためのインターフェースを提供する |
| Linux への依存 | プラットフォームファームウェアは通常 Linux に依存しない | 通常、OS とカーネルのインターフェースに依存する |
| 代表的な場所 | チップ内のフラッシュ、/lib/firmware、/usr/lib/firmware | /lib/modules/$(uname -r)/ または /usr/lib/modules/ |
| 例 | UEFI、VBIOS、Wi-Fi firmware、SSD firmware | nvme、i915、amdgpu、ネットワークドライバ |
5. Wi-Fi デバイスの例#
- PCIe または USB バスが Wi-Fi デバイスを検出する。
- Linux がデバイス ID に対応するネットワークドライバを選ぶ。
- ドライバがデバイスファームウェアを要求する。
- ファームウェアがデバイス内部のプロセッサやメモリへ読み込まれる。
- ドライバがキュー、割り込み、チャンネル、電源管理を設定する。
- NetworkManager や
wpa_supplicantがカーネルのネットワークインターフェースを利用する。
そのため、「ファームウェアは直接ハードウェアを制御し、ドライバは単に命令を翻訳するだけ」と単純化しすぎない方がよいでしょう。実際の役割は、ハードウェア、デバイスファームウェア、カーネルドライバ、ユーザー空間サービスに分散しています。
6. 起動時の協力関係#
プラットフォームファームウェア
BIOS / UEFI
OS より前
ファームウェアが CPU、メモリ、バス、起動デバイスを初期化し、次の起動プログラムを選びます。bootloader がカーネルを読み込む
GRUB
bootloader 段階
GRUB などが Linux カーネル、initramfs、カーネルコマンドラインを準備し、制御をカーネルへ渡します。カーネルがデバイスを初期化する
driver
カーネル段階
Linux が組み込みドライバやカーネルモジュールを読み込み、バスを列挙し、必要に応じてデバイスファームウェアを送ります。ユーザー空間へ移行する
PID 1
systemd または init
PID 1 が udev、ネットワーク、ログイン画面などを起動し、各プログラムはカーネルのインターフェースを介してハードウェアを使います。
7. /sys/firmware を確認する#
/sys は sysfs という仮想ファイルシステムで、主にカーネルがデバイスやサブシステムの状態を公開します。ファームウェアファイルの保管場所ではありません。
/sys/firmware/efi # UEFI モードで起動した場合に通常存在する
/sys/firmware/acpi # ACPI テーブルと関連インターフェース
/sys/firmware/dmi # DMI/SMBIOS 関連情報。具体的な構成は環境に依存するtest -d /sys/firmware/efi && echo UEFI || echo "Legacy BIOS"
find /sys/firmware -maxdepth 2 -type d 2>/dev/null
ls /usr/lib/firmware /lib/firmware 2>/dev/null
lsmod8. よくある誤解#
- ファームウェアとドライバは同じものではありません。
/sys/firmwareはカーネルが公開するインターフェースであり、ファームウェアファイルの倉庫ではありません。- すべてのファームウェアが
/lib/firmwareにあるわけではありません。多くはデバイス内部に保存されています。 - ドライバは単なる命令の翻訳器ではなく、割り込み、DMA、リソース管理、権限境界、カーネルサブシステムとの接続も担当します。
- UEFI、デバイスファームウェア、Linux ドライバは、異なる段階・プロセッサ・メモリ空間で動作することがあります。
Linux の起動フロー:ファームウェア、パーティション、GRUB からカーネルまで もあわせて読んでください。


