ドライバをカーネルにコンパイルする必要があるのはなぜですか?より多くのドライバが動的カーネルモジュールとして配布されないのはなぜですか?

ドライバをカーネルにコンパイルする必要があるのはなぜですか?より多くのドライバが動的カーネルモジュールとして配布されないのはなぜですか?

私はまだLinuxカーネルに初めて触れているので、この基本的な質問について理解してください。私が読んで見ることができる資料を教えてください。

Windowsの場合、ハードウェアドライバのワークフローはコアオペレーティングシステムを最初にインストールしてから、ドライバを別々にインストールするようです。

Linuxでは、すべてのドライバがカーネルに直接コンパイルされるようです。これは、インストールされたLinuxディストリビューションがサポートされているすべてのハードウェアをサポートしていることを意味しますか?一部のハードウェアしか使用していませんか?

これは、独自のNVIDIAドライバ(カーネルには含まれていません)のようなものをインストールするには、実際にNVIDIAドライバでカーネルを再コンパイルする必要があることを意味しますか? UbuntuやFedoraなどのディストリビューションは、ドライバが組み込まれたプリコンパイルされたカーネルを提供しますか?

最近、Xboxワイヤレスアダプタのサポートを追加するLinuxインストールにドライバをインストールしました。 「DKMS」を使用して、ドライバをカーネルにコンパイルせずにシステムに追加します。

DKMSはLinuxにマイクロカーネル機能を追加する方法ですか?すべてのドライバが動的モジュールとして展開されないのはなぜですか?カーネルモジュールはインストール時にすでに動的ではありませんか/ib/modules

自己署名のLinuxインストール環境では、動的カーネルモジュールがセキュアブートにどのように影響しますか?

ベストアンサー1

私はあなたが互いに関連していますが、2つの異なる概念、つまりカーネルがドライバを使用する方法(静的コンパイル、動的ロード)、そしてどのように開発されたか(木の中、木の外)。

ツリー内で開発されたドライバは、カーネルにコンパイルまたは動的にロードできます。ほとんどは動的にロードされます。ツリーで開発されたドライバは、ほとんどのディストリビューションのカーネルソースには表示されないため、ほとんど常に動的にロードされるため、まったくコンパイルできません。ドライバを別途インストールする必要がある場合は、カーネルの外部で開発されたものです。

ドライバはカーネルの多くの内部APIに依存し、私が理解したのはLinuxは、これらのAPIの以前のバージョンとの互換性に興味がありません。。人々は、古いバージョンとの互換性のために、古いコードと気まぐれな最新のコードを維持するよりもクリーンなコードを好む。したがって、彼らはドライバをツリーに置くことを好みます。誰かがAPIをリファクタリングしている場合は、そのAPIのすべてのユーザーに対してこれを変更する必要があります。

もちろん、これはツリー外部ドライバでは実行できません。したがって、他のバージョンでは依存するAPIがクラッシュする可能性があるため、特定のカーネルバージョン用にコンパイルする必要があります。 NVIDIA(およびおそらく他社)の場合、ドライバは基本的に独自のバイナリを包むシムです。 (shimは複数のカーネルバージョンをサポートしています。)これは、ディストリビューションの場合、パッケージ化された各カーネルバージョンにドライバパッケージがあることを意味します。

DKMSはメカニズムですこれらのツリー外部カーネルをサポートするために、DKMS は各カーネルバージョンに対して 1 つのドライババージョンをパッケージ化するのではなく、インストールされているカーネルバージョンごとにドライバをコンパイルします。

おすすめ記事