メインコンテンツへスキップ
  1. ノート/
  2. システム底层/

ファームウェア、ハードウェア、ドライバと Linux カーネル

ICE345
著者
ICE345
CS Student | System | Linux | OCaml

この記事は、以前の「ファームウェア・ハードウェア・システム」と「ファームウェアとドライバ」の内容を統合したものです。まず、次の関係を覚えてください。

ハードウェア
デバイスファームウェア
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 firmwarenvmei915amdgpu、ネットワークドライバ

5. Wi-Fi デバイスの例
#

  1. PCIe または USB バスが Wi-Fi デバイスを検出する。
  2. Linux がデバイス ID に対応するネットワークドライバを選ぶ。
  3. ドライバがデバイスファームウェアを要求する。
  4. ファームウェアがデバイス内部のプロセッサやメモリへ読み込まれる。
  5. ドライバがキュー、割り込み、チャンネル、電源管理を設定する。
  6. NetworkManager や wpa_supplicant がカーネルのネットワークインターフェースを利用する。

そのため、「ファームウェアは直接ハードウェアを制御し、ドライバは単に命令を翻訳するだけ」と単純化しすぎない方がよいでしょう。実際の役割は、ハードウェア、デバイスファームウェア、カーネルドライバ、ユーザー空間サービスに分散しています。

6. 起動時の協力関係
#

  1. プラットフォームファームウェア

    BIOS / UEFI

    OS より前

    ファームウェアが CPU、メモリ、バス、起動デバイスを初期化し、次の起動プログラムを選びます。
  2. bootloader がカーネルを読み込む

    GRUB

    bootloader 段階

    GRUB などが Linux カーネル、initramfs、カーネルコマンドラインを準備し、制御をカーネルへ渡します。
  3. カーネルがデバイスを初期化する

    driver

    カーネル段階

    Linux が組み込みドライバやカーネルモジュールを読み込み、バスを列挙し、必要に応じてデバイスファームウェアを送ります。
  4. ユーザー空間へ移行する

    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
lsmod

8. よくある誤解
#

  • ファームウェアとドライバは同じものではありません。
  • /sys/firmware はカーネルが公開するインターフェースであり、ファームウェアファイルの倉庫ではありません。
  • すべてのファームウェアが /lib/firmware にあるわけではありません。多くはデバイス内部に保存されています。
  • ドライバは単なる命令の翻訳器ではなく、割り込み、DMA、リソース管理、権限境界、カーネルサブシステムとの接続も担当します。
  • UEFI、デバイスファームウェア、Linux ドライバは、異なる段階・プロセッサ・メモリ空間で動作することがあります。

Linux の起動フロー:ファームウェア、パーティション、GRUB からカーネルまで もあわせて読んでください。

関連記事


评论