lspci -k
3.2.0-29-genericカーネルを搭載したKubuntuで、次のようなものが表示されます。
01:00.0 VGA compatible controller: NVIDIA Corporation G86 [Quadro NVS 290] (rev a1)
Subsystem: NVIDIA Corporation Device 0492
Kernel driver in use: nvidia
Kernel modules: nvidia_current, nouveau, nvidiafb
カーネルドライバーnvidia
とカーネルモジュールnvidia_current
、nouveau
、nvidiafb
。
カーネルドライバーとカーネルモジュールの違いは何でしょうか。
カーネルモジュールは、 insmod
または modprobe
などを使用して、実行時にカーネルに挿入できるコンパイル済みコードのビットです。 =。
ドライバーは、ハードウェアデバイスと通信するためにカーネルで実行される少しのコードです。ハードウェアを「駆動」します。コンピュータのハードウェアのほとんどすべてのビットには、関連するドライバがあります。¹実行中のカーネルの大部分は、ドライバコードです。²
ドライバーは、ディスク上のカーネルファイルに静的に組み込まれる場合があります。ドライバーは、カーネルモジュールとして組み込まれて、後で動的に読み込まれるようにすることもできます。 (そして、おそらくアンロードされます。)
標準的な方法は、ドライバーをカーネルに静的にリンクするのではなく、可能な限りカーネルモジュールとしてビルドすることです。これにより、柔軟性が向上します。ただし、そうしないことには十分な理由があります。
システムの起動を支援するために、特定のドライバが絶対に必要な場合があります。 initrd 機能のため、想像するほど頻繁には起こりません。
静的に構築されたドライバーは、静的にスコープされたシステムに 組み込みシステム のように、まさに必要なものである場合があります。つまり、どのドライバーが常に必要であり、これが変更されないことが事前にわかっている場合は、動的カーネルモジュールに煩わされない正当な理由があります。
カーネルを静的にビルドし、Linuxの動的モジュールロード機能を無効にすると、カーネルコードの実行時の変更が防止されます。これにより、柔軟性を犠牲にしてセキュリティと安定性が向上します。
すべてのカーネルモジュールがドライバーであるとは限りません。たとえば、Linuxカーネルの比較的最近の機能は、 別のプロセススケジューラをロードする ができることです。別の例として、より複雑なタイプのハードウェアには、低レベルのハードウェアドライバーとユーザーランドの間に位置する SB HIDドライバー などの 特定の要素を実装するUSBスタックの 、基盤となるハードウェアとは無関係です。
その他:
この広範なステートメントの1つの例外は、CPUチップで、「ドライバー」自体がありません。コンピューターには、ドライバーがないハードウェアが含まれている場合もあります。
OSカーネルの残りのコードは、 メモリ管理 、 [〜#〜] ipc [〜#〜] 、 scheduling のような一般的なサービスを提供しますこれらのサービスは、以前にリンクされた例と同様に、主に serland アプリケーションにサービスを提供するか、またはドライバーやその他のカーネル内インフラストラクチャによって使用される内部サービスである可能性があります。
lspci
出力に関する特定の質問に答えるために、「カーネルドライバー」行は現在カードにバインドされているドライバー、この場合は専用のnvidia
ドライバーを指します。 「カーネルモジュール」の行には、このカードにバインドできることがわかっているすべてのドライバがリストされています。ここでは、おそらくlspci
がドライバーとそのファイル名を見つけた方法と、ドライバー自体にコード化された名前が原因で、プロプライエタリドライバーが別の名前を表示しています。
このニースによると tutorial :
...モジュールの1つのタイプはデバイスドライバーです。これにより、カーネルはシステムに接続されたハードウェアにアクセスできます。
したがって、ツリーを描画しようとすると、モジュールを継承(拡張)する「デバイスドライバー」があり、その間に「ハードウェアへのアクセス」が見つかる、より具体的な特性があります...
すべてのドライバーはモジュールです。すべてのモジュールがドライバーであるとは限りません。
モジュールは実行時に挿入できます。モジュール/ドライバは、カーネルとともに静的にコンパイルすることもできます。
典型的なモジュールinitは
module_init(init_fn);
init_fn()
{
/* some code */
}
同じモジュールをドライバーにすることができます
module_init(init_fn);
init_fn()
{
device_register(&device);
/* some code */
}
私の答えはジムに行きます。カーネルドライバーは、ハードウェアの一部を駆動するように設計されたプログラム(カーネルモジュール)です。 lspciの出力は、nvidiaがデバイスのloaded
モジュールであるため、カーネルドライバーであると示しています。それに加えて、他の利用可能なカーネルモジュールも利用できます。
Linuxでドライバーを一覧表示および削除するコマンドは、それぞれlsmod
およびrmmod
であることを追加します。これは、モジュールのリストとモジュールの削除を示しています。