web-dev-qa-db-ja.com

カーネルドライバーとカーネルモジュールの違いは何ですか?

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_currentnouveaunvidiafb

カーネルドライバーとカーネルモジュールの違いは何でしょうか。

68
JohnnyFromBF

カーネルモジュールは、 insmod または modprobe などを使用して、実行時にカーネルに挿入できるコンパイル済みコードのビットです。 =。

ドライバーは、ハードウェアデバイスと通信するためにカーネルで実行される少しのコードです。ハードウェアを「駆動」します。コンピュータのハードウェアのほとんどすべてのビットには、関連するドライバがあります。¹実行中のカーネルの大部分は、ドライバコードです。²

ドライバーは、ディスク上のカーネルファイルに静的に組み込まれる場合があります。ドライバーは、カーネルモジュールとして組み込まれて、後で動的に読み込まれるようにすることもできます。 (そして、おそらくアンロードされます。)

標準的な方法は、ドライバーをカーネルに静的にリンクするのではなく、可能な限りカーネルモジュールとしてビルドすることです。これにより、柔軟性が向上します。ただし、そうしないことには十分な理由があります。

  • システムの起動を支援するために、特定のドライバが絶対に必要な場合があります。 initrd 機能のため、想像するほど頻繁には起こりません。

  • 静的に構築されたドライバーは、静的にスコープされたシステムに 組み込みシステム のように、まさに必要なものである場合があります。つまり、どのドライバーが常に必要であり、これが変更されないことが事前にわかっている場合は、動的カーネルモジュールに煩わされない正当な理由があります。

  • カーネルを静的にビルドし、Linuxの動的モジュールロード機能を無効にすると、カーネルコードの実行時の変更が防止されます。これにより、柔軟性を犠牲にしてセキュリティと安定性が向上します。

すべてのカーネルモジュールがドライバーであるとは限りません。たとえば、Linuxカーネルの比較的最近の機能は、 別のプロセススケジューラをロードする ができることです。別の例として、より複雑なタイプのハードウェアには、低レベルのハードウェアドライバーとユーザーランドの間に位置する SB HIDドライバー などの 特定の要素を実装するUSBスタックの 、基盤となるハードウェアとは無関係です。


その他:

  1. この広範なステートメントの1つの例外は、CPUチップで、「ドライバー」自体がありません。コンピューターには、ドライバーがないハードウェアが含まれている場合もあります。

  2. OSカーネルの残りのコードは、 メモリ管理[〜#〜] ipc [〜#〜]scheduling のような一般的なサービスを提供しますこれらのサービスは、以前にリンクされた例と同様に、主に serland アプリケーションにサービスを提供するか、またはドライバーやその他のカーネル内インフラストラクチャによって使用される内部サービスである可能性があります。

  3. /boot、RAM起動時に ブートローダー の初期段階 ブートプロセス に読み込まれます。

79
Warren Young

lspci出力に関する特定の質問に答えるために、「カーネルドライバー」行は現在カードにバインドされているドライバー、この場合は専用のnvidiaドライバーを指します。 「カーネルモジュール」の行には、このカードにバインドできることがわかっているすべてのドライバがリストされています。ここでは、おそらくlspciがドライバーとそのファイル名を見つけた方法と、ドライバー自体にコード化された名前が原因で、プロプライエタリドライバーが別の名前を表示しています。

19
Jim Paris

このニースによると tutorial

...モジュールの1つのタイプはデバイスドライバーです。これにより、カーネルはシステムに接続されたハードウェアにアクセスできます。

したがって、ツリーを描画しようとすると、モジュールを継承(拡張)する「デバイスドライバー」があり、その間に「ハードウェアへのアクセス」が見つかる、より具体的な特性があります...

5
user1847726

すべてのドライバーはモジュールです。すべてのモジュールがドライバーであるとは限りません。

モジュールは実行時に挿入できます。モジュール/ドライバは、カーネルとともに静的にコンパイルすることもできます。

典型的なモジュールinitは

module_init(init_fn);
init_fn()
{
   /* some code */
}

同じモジュールをドライバーにすることができます

module_init(init_fn);
init_fn()
{
   device_register(&device);
   /* some code */
}
0
Prabagaran

私の答えはジムに行きます。カーネルドライバーは、ハードウェアの一部を駆動するように設計されたプログラム(カーネルモジュール)です。 lspciの出力は、nvidiaがデバイスのloadedモジュールであるため、カーネルドライバーであると示しています。それに加えて、他の利用可能なカーネルモジュールも利用できます。

Linuxでドライバーを一覧表示および削除するコマンドは、それぞれlsmodおよびrmmodであることを追加します。これは、モジュールのリストとモジュールの削除を示しています。

0
paintbox