デバイスドライバーは、それ自体で実行されるプログラムであるか、またはメモリに読み込まれ、プログラムがその関数の1つを呼び出すことができるライブラリー(関数のグループ)のみです(そのため、単独で実行されません)。
そして、それがプログラムである場合、プロセスIDを持っているので、たとえば、他のプロセスを終了できるのと同じ方法でデバイスドライバーを終了できますか?
デバイスドライバーは、それ自体で実行されるプログラムであるか、またはメモリに読み込まれ、プログラムがその関数の1つを呼び出すことができるライブラリー(関数のグループ)のみです(そのため、単独で実行されません)。
そして、それがプログラムである場合、プロセスIDを持っているので、たとえば、他のプロセスを終了できるのと同じ方法でデバイスドライバーを終了できますか?
回答:
Linuxでは、多くのデバイスドライバーがカーネルの一部であり、ライブラリやプロセスではありません。これらの使用してデバイスファイル(通常は中との対話プログラム/dev
)と、様々なシステム呼び出しなどopen
、read
、write
、ioctl
...
ただし、例外があります。一部のデバイスドライバーは、カーネルドライバースタブとユーザー空間ライブラリの混合を使用します(たとえば、UIOを使用)。その他は、通常、ビットバンギングインターフェイス(UARTまたはGPIO)の上に、ユーザー空間で完全に実装されます。どちらの場合も、通常はインプロセスであるため、別のプロセスは表示されず、デバイスを使用しているプロセスのみが表示されます。
デバイスドライバーを「終了」するには、それを使用するすべてのプロセスを停止し、そのカーネルモジュール(モジュールとしてビルドされていると仮定)、およびオプションで、使用する必要のないその他のモジュールを削除する必要があります。を使用してシステム上のモジュールをリストし、またはlsmod
を使用してそれらをアンロードできます。どちらも、ユーザーがいないことを示す場合にのみ機能します。rmmod
modprobe -r
lsmod
CONFIG_MODULE_FORCE_UNLOAD
場合rmmod -f
は、使用中/削除するように設計されていない/などのモジュールを強制的にアンロードしようとすることができます。また、カーネルを汚染します。
まず、ドライバーとは何かを定義する必要があります。デバイス(カメラなど)またはサブシステム(ファイルシステムなど)を制御するプログラムまたはサブルーチンとして定義します。システムプログラムを介して直接実行するか、カーネルサーバーまたはユーザーランドプロセスを介して実行するかは、本質的にこの本質的な意味の問題ではありません。
場合によっては、Linuxは、実際の「ドライバー」がデバイスツリーであるソフトウェアで記述された汎用プロトコルのみを提供します。これは、ハードウェアパラメータと、ドライバを構成する使用するソフトウェアの構成です。
一般的に、ドライバーインターフェイスとプロトコルは、デバイスツリーまたはudevルールで定義された必要に応じてロードされるカーネルモジュールを使用して実装されます。カーネルモジュールは、プロセスまたはライブラリの厳密な意味ではありません。
ライブラリは、特定のプロセスにロードできる静的なコードセットです。最新のオペレーティングシステムは、これらのライブラリを共有メモリにロードします。プロセス自体は、任意の数の共有ライブラリにリンクできます。
プロセスは、システムプログラムやカーネルがシステムメモリやCPU時間などのリソースを割り当てている実行中のプログラムです。カーネルモジュールは、このパターン自体に従う場合とそうでない場合がありますが、Linuxでの事実上のプロセスとはみなされません。
したがって、あなたの質問に答えるために、ドライバーはプロセスである必要はありませんが、プロセスは可能です。コードはライブラリに存在できますが、カーネルモジュールの形式のカーネルであれ、ユーザーランドプロセスであれ、ドライバーはプログラムを介してメモリにロードされます。
ドライバーの全体が実際に何であるかを考えるとき、それはより意味論的な議論になります。ドライバーは常にプログラムであると言えますが、デバイスツリーの場合はそうではないこともあります。実際には、ユーザーランドプロセス、デバイスツリーファイル、udevルール、およびプロセスとモジュールの両方がライブラリを使用するカーネルモジュールである場合もありますドライバーのロジック。
Linuxデバイスドライバーは、本質的にカーネルスペースライブラリです。その呼び出しは、主に高レベルのドライバーまたはそれを使用するユーザー空間プロセスによって開始されます。
これにはいくつかの例外があります。
GNU Hurdのような他のシステムでは、ドライバーは本質的にデーモンであり、プロセスと対話できます。Linuxでは、ドライバーはライブラリーです。ただし、どちらの概念にも長所と短所があります。