Debian カーネル - ドライバがカーネルでコンパイルされた場合、ファームウェアファイルが必要なのはなぜですか?

Debian カーネル - ドライバがカーネルでコンパイルされた場合、ファームウェアファイルが必要なのはなぜですか?

使っていますこのUSB Wi-Fiデバイス私のDebianで実行していますDE10-ナノプレート

製品の詳細を見ると、RT2800USBドライバに含まれているRT5370チップセットを使用しているようです。以下のスクリーンショットに示すように、カーネルでこの機能を有効にしました。

ここに画像の説明を入力してください。

ただし、以下を使用してファームウェアをインストールしないと、Wi-Fiデバイスは機能しません。

sudo apt install firmware-ralink

私の質問は - ファームウェアはドライバとどのように関連していますか? Wi-Fiデバイスに必要なファームウェアがすでにインストールされている必要はありませんか?ここで何が起こっているのでしょうか?

私はカーネルドライバとデバイスに初めて触れたので、ここで起こる魔法を理解しようとしています。私が理解したのは、デバイスを使用するには、関連するドライバがカーネルにコンパイルまたは後でロードできるモジュールとして提供されていることを確認するだけです。

これは私が実行したときのdmesg出力ですifup wlan0。ファームウェアファイルはrt2870.binソフトウェアパッケージで提供されていますfirmware-ralink

[   78.302351] ieee80211 phy0: rt2x00lib_request_firmware: Info - Loading firmware file 'rt2870.bin'
[   78.311413] ieee80211 phy0: rt2x00lib_request_firmware: Info - Firmware detected - version: 0.36
[   80.175252] wlan0: authenticate with 30:23:03:41:73:67
[   80.206023] wlan0: send auth to 30:23:03:41:73:67 (try 1/3)
[   80.220665] wlan0: authenticated
[   80.232966] wlan0: associate with 30:23:03:41:73:67 (try 1/3)
[   80.257518] wlan0: RX AssocResp from 30:23:03:41:73:67 (capab=0x411 status=0 aid=5)
[   80.270065] wlan0: associated
[   80.503705] IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready

答え1

多くのハードウェアデバイス製造元はデバイスにファームウェアを含まず、ファームウェアをデバイスにロードするにはオペレーティングシステムドライバが必要です。

他のメーカーは以前のバージョンのファームウェアを内蔵していますが、ドライバが最新バージョンをロードできるようにします。組み込みバージョンは古くなったり、バグがあることがよくあります(しばしばデバイス自体で更新されることもあります。製造やテストプロセスを変更する必要があるためです)。ファームウェアのバージョンが必ずしもそうである必要はないという根拠があります。いいね、最小限の機能を備えたものと似ている必要があります。アップデートはドライバによってロードされ、ロードされなければなりません。)

ファームウェアファイルには、ほとんど常にGPLと互換性のないライセンス(明示的または識別可能なライセンスではなく、デバイス自体およびそれに付随するWindowsドライバと一緒に配布され、暗黙的な「許可」のみがあります)があるため、次のように使用することはできません。カーネル自体は一緒に配布されるため、別々のパッケージとして配布する必要があります。

デバイスが正常に動作するには、ドライバとファームウェアが必要です。

答え2

Linuxカーネル用のファームウェアは別々に展開され、独自の開発ツリーがあります。

https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/tree/

なぜ別に開発したのかわかりません。考えられる答え:

  • そのうちの1つには、埋め込みを防ぐライセンスがある可能性があります。
  • その後、カーネルを更新せずにファームウェアを更新し、別々に保存して最適化できます。

はい、次のようになります。https://lwn.net/Articles/284932/

これについて書かれた良い記事があります。https://www.linuxfromscratch.org/blfs/view/svn/postlfs/firmware.html

答え3

次の理由でカーネルにファームウェアを含めることは意味がありません。

  • カーネルの起動にファームウェアは必要ありません。単にデバイスが完全に動作するようにするだけです。
  • ファームウェアはカーネルの機能(デバイスのみ)には影響しません。カーネルにすべてのファームウェアを含めると、カーネルが大きくなります。
  • ファイルシステム(/lib/firmwareなど)のファイルからファームウェアをロードすることは、ドライバをカーネルに組み込むよりもロードするときにうまく機能します。
  • カーネルに組み込まれていない場合、カーネルはメモリをデバイスにロードした後にメモリを解放するために特別な作業を行う必要はありません。
  • ファイルシステムに単一のファームウェアコピーを持つことは、インストールされているすべてのカーネルにファームウェアコピーを持つよりも優れています。特に、ファームウェアのバージョンがカーネルのバージョンとは独立している場合はさらにそうです。

そして他の人が指摘したように、カーネルに含めることはとにかく合法的ではありません。

いくつかの例外がありますが、ほとんどの場合、デバイスのドライバおよび/またはファームウェアはカーネル自体の一部ではありませんが、システムを起動するために必要です。このような場合、カーネルまたはドライバのインストール中にビルドされると、通常はinitrdに含まれます。

関連情報