web-dev-qa-db-ja.com

Linuxカーネルはドライバーをどのように扱いますか?

Linuxがハードウェアドライバーを処理する方法について読みました。どうやら、ほとんどのハードウェアドライバーはLinuxカーネルにプリコンパイルされているようです。私はそれについていくつか質問があります...

Linuxカーネルにほとんどすべてのハードウェアデバイス用のハードウェアドライバーが含まれている場合、Linux上で実行されるラップトップに特定の数のハードウェアデバイスしかない場合、Linuxカーネルにあるすべての冗長ハードウェアドライバーはどうですか?これらのすべてのドライバーをカーネルに保持し、それらを使用していないときでもシステムで稼働させ続けることは、リソースの無駄ではありませんか?

5
Uday Kumar

最初にいくつかの歴史。 Linuxの初期の時代には、デバイスドライバーは実際にカーネルに直接コンパイルされていました。実際、ドライバを直接コンパイルすることはまだ可能であり、多くのカーネルにはこの方法で含まれている非常に一般的なドライバがまだ残っている場合があります。動作方法は、SLSやSlackwareなどの初期のディストリビューションに同梱されている汎用カーネルが、カーネルがサポートするほぼすべてのドライバーを直接コンパイルしているため、可能な限り幅広いハードウェアで動作します。それでも、それらの一部は相互に互換性がないため、すべてを入れることはできませんでした。次に、システムをインストールした後、独自のカーネルを構築し、構成を慎重に確認して、コンピューターにあるすべてのドライバーが正しいことを確認します。時々、ドライバーのヘッダーファイルを手動で編集して、奇数ボールハードウェアのサポートを含める必要がありました-特定のチップセットを使用するイーサネットカードは、そのチップセットのドライバーを使用していましたが、実装される面白い方法がありました。その後、コンパイル、インストールし、再起動後にコンピューター専用のカスタムカーネルを作成します。無駄のない最適化。実際には、見逃したこと、忘れたファイルシステムのサポートを追加すること、何らかの方法で設定を調整することなど、このプロセスを一般に数回繰り返しました。すすぎ、繰り返します。

ありがたいことに、それらの日は長い過去です。カーネルは、長い間、ロード可能なモジュールをサポートしていました。これらは、オンデマンドでロードまたはアンロードできる共有ライブラリのタイプになるようにコンパイルされたカーネルドライバーです。カーネルがブートする方法は、カーネルファイル自体と、カーネルがサポートするすべてのカーネルモジュールを含む小さな圧縮ファイルシステム(Wikipediaの initramfs を参照)を使用することです。カーネルがロードされ、初期ファイルシステムが検出されると、必要なすべてのドライバーのロードを開始できます。

その少しの歴史は、多くの仕事をスキップし、その過程で汗をかいています。 1つの巨大なモノリシックカーネルですべてのコンパイル済みドライバーを使用し、完全に自動化されたドライバーロードシステムを使用するまでの間に、明示的にロードする必要のあるモジュール、一部の半自動ロードなど、そのパスに沿ったすべてのステップがありました等.

そのため、最新のカーネルは必要なドライバーの大部分に負荷を要求するため、最新のLinuxディストリビューションのカーネルでリソースを消費する冗長なハードウェアドライバーはあまりありません。

9
Kurt Fitzner