私の知る限り、カーネルはハードウェアを検出し、sysfsに情報を追加して、/ devにデバイスを作成してから、udevイベントを生成します。私の質問は、デバイスドライバーがこれをすべて行うのか、それともカーネル自体なのかということです。ドライバーがそれを行う場合、ドライバーはデバイスのメジャー番号とマイナー番号を知って、devtmpsにファイルを作成します。
また、デバイスを処理するドライバーをロードするためにmodprobeを呼び出すのはudevであることも(おそらく間違って)理解しています。
MODALIAS uevent環境変数の内容を使用してこれを行うため、エイリアスがこの文字列(正しいドライバー)と一致するすべてのモジュールがロードされると言われました。つまり、Linuxでのハードウェア検出の手順は何ですか。WHOは各手順を実行します。カーネル自体、カーネル内のドライバー、またはユーザースペース内のudevです。ありがとう。
承認された回答:
カーネルはデバイス番号を決定するため、デバイス番号を認識しています。各ドライバは、管理するデバイス番号を登録します。番号はソースコードにハードコーディングされているか、場合によっては動的に割り当てられます。 sysfsファイルシステムを使用すると、udevなどのアプリケーションがカーネルでサポートされているデバイスを検出できます。 udevが作成するデバイスのデバイス番号を取得する方法を参照してください。詳細については。
ドライバーの初期化コードはハードウェアをプローブし、プローブ中に検出したハードウェアに基づいてデバイスを登録します。一部のタイプのハードウェアはプロービングをサポートしていません。たとえば、ISAバス(PCタイプのコンピューターではほとんど時代遅れのバス)は、接続されているハードウェアを一覧表示する方法を提供しないため、ドライバーは通信を試みて、同じアドレスに別の周辺機器が接続されていないことを祈ることしかできません。一部のプラットフォームでは、ブートローダーに使用可能な周辺機器とそれらがマップされている場所を説明するデバイスツリーが含まれており、Linuxカーネルはこの情報に基づいてドライバーをアクティブ化します。周辺機器用にドライバをロードする方法は3つあります。
- ドライバはカーネルイメージの一部として含まれている場合があります。
- ドライバーはモジュールとしてコンパイルし、明示的にロードすることができます(たとえば、
/etc/modules
に含めることによって) またはinitramfsで)。 - 接続された周辺機器をPCI(最新のPCのメインバス)やUSBなどのユニバーサル識別番号とともに一覧表示できるバスタイプによって報告された情報に基づいて、特定のドライバーを自動的にロードするメカニズムがあります。カーネルは
modprobe
を実行します そして、周辺機器のIDをエンコードする記号名を渡します。これは、ドライバモジュールの「実際の」名前のエイリアスです。ドライバーモジュールは自動的にロードおよびアンロードされますか?
を参照してください。