web-dev-qa-db-ja.com

Linuxのデバイスドライバーはプログラム/プロセスですか、それとも単なるライブラリですか?

デバイスドライバーは、単独で実行されるプログラムですか、それともメモリに読み込まれているライブラリ(関数のグループ)であり、プログラムはその関数の1つを呼び出すことができます(したがって、単独で実行されていません)。

また、プログラムの場合、プロセスIDはありますか?たとえば、他のプロセスを終了するのと同じ方法でデバイスドライバーを終了できますか?

23
user255688

Linuxでは、多くのデバイスドライバーはカーネルの一部であり、ライブラリやプロセスではありません。プログラムは、デバイスファイル(通常は/dev内)およびopenreadwriteioctlなどのさまざまなシステムコールを使用してこれらと対話します。 ..

ただし、例外があります。一部のデバイスドライバーは、カーネルドライバースタブとユーザー空間ライブラリの混合を使用します(e.g。 UIOを使用)。その他は完全にユーザー空間に実装され、通常はいくつかのビットバンギングインターフェイス(UARTまたはGPIO)の上に実装されます。どちらの場合も、それらは通常は処理中なので、別のプロセスは表示されず、デバイスを使用しているプロセスのみが表示されます。

デバイスドライバーを「終了」するには、そのドライバーを使用しているすべてのプロセスを停止してから、そのカーネルモジュール(モジュールとして構築されていると想定)を削除し、必要に応じて、使用する他のモジュールを削除する必要があります。 lsmodを使用してシステム上のモジュールを一覧表示し、rmmodまたはmodprobe -rを使用してそれらをアンロードできます。どちらも、lsmodにモジュールがないことを示している場合にのみ機能しますユーザー。

35
Stephen Kitt

まず、ドライバーとは何かを定義する必要があります。デバイス(カメラなど)またはサブシステム(ファイルシステムなど)を制御するプログラムまたはサブルーチンとして定義します。それがシステムプログラムを介して直接行われるか、カーネルサーバーまたはユーザーランドプロセスを介して行われるかは、この本質的にセマンティックな質問の主な問題ではありません。

Linuxでは、実際の「ドライバー」がデバイスツリーであるソフトウェアで記述された一般的なプロトコルしか提供しない場合があります。これは、ハードウェアパラメーターの構成と、ドライバーを構成する使用するソフトウェアです。

一般的に言えば、ドライバーインターフェイスとプロトコルは、デバイスツリーまたはudevルールで定義された必要に応じて読み込まれるカーネルモジュールを使用して実装されます。カーネルモジュールは、厳密な意味ではプロセスまたはライブラリではありません。

ライブラリは、任意のプロセスにロードできる静的なコードのセットです。最新のオペレーティングシステムは、これらのライブラリを共有メモリにロードします。プロセス自体は、任意の数の共有ライブラリにリンクできます。

プロセスは、システムプログラムまたはカーネルがシステムメモリやCPU時間などのリソースを割り当てている実行中のプログラムです。カーネルモジュール自体がこのパターンに従う場合とそうでない場合がありますが、Linuxでは事実上のプロセスとは見なされません。

だからあなたの質問に答えるために、ドライバーはプロセスである必要はありませんが、それはそうでありえます。コードはライブラリに存在できますが、ドライバーは、カーネルモジュールの形式のカーネルであれ、ユーザーランドプロセスの形式であれ、プログラムを介してmemeryに読み込まれます。

ドライバーの全体が実際に何であるかを考えると、それはより意味論的な議論になります。ドライバーは常にプログラムであると言えるかもしれませんが、デバイスツリーの場合とは異なる場合もあります。実際には、ユーザーランドプロセス、デバイスツリーファイル、udevルール、カーネルモジュールであり、プロセスとモジュールの両方がライブラリを使用して構成しています。ドライバーのロジック。

9
jdwolf

Linuxデバイスドライバーは、本質的にはkernel-space libraryです。その呼び出しは、主に上位レベルのドライバーまたはそれを使用するユーザー空間プロセスによって開始されます。

これにはいくつかの例外があります。

  • カーネルスレッドは、ドライバーによっても開始/停止できます。これらは、基本的にユーザー空間部分のないプロセスです。
  • 割り込みハンドラーは、ユーザー空間プロセスではなく、ハードウェアによって開始されます。

GNU Hurdのような他のシステムでは、ドライバーは本質的にデーモンであり、プロセスは相互に作用します。Linuxでは、ドライバーはライブラリです。どちらの概念にも長所と短所があります。