web-dev-qa-db-ja.com

Linuxカーネルはデバイスのメジャー番号とマイナー番号をどのようにして知るのですか?

私の知る限り、カーネルはハードウェアを検出し、sysfsに情報を追加して、/ devにデバイスを作成してから、udevイベントを生成します。私の質問は、デバイスドライバーがこれらすべてを実行するのか、それともカーネル自体なのかということです。ドライバーがそれを行うと、デバイスのメジャー番号とマイナー番号がわかって、devtmpsにファイルが作成されます。

また、デバイスを処理するドライバーをロードするためにmodprobeを呼び出すのはudevであることも(おそらく間違って)理解しています。

MODALIAS uevent環境変数の内容を使用してこれを行うため、エイリアスがこの文字列(正しいドライバー)と一致するすべてのモジュールがロードされると言われました。要するに、Linuxでのハードウェア検出のステップは何であり、WHOは各ステップを実行します:カーネル自体、カーネル内のドライバー、またはユーザー空間のudev。ありがとう。

5
mmm

カーネルはデバイス番号を決定するため、デバイス番号を認識しています。各ドライバーは、管理するデバイス番号を登録します。番号はソースコードにハードコードされているか、場合によっては動的に割り当てられます。 sysfs ファイルシステムを使用すると、udevなどのアプリケーションでカーネルがサポートするデバイスを検出できます。詳細については、 devは作成するデバイスのデバイス番号をどのように取得しますか? を参照してください。

ドライバーの初期化コードはハードウェアをプローブし、プローブ中に検出したハードウェアに基づいてデバイスを登録します。一部のタイプのハードウェアはプロービングをサポートしていません。たとえば、 ISAバス (PCタイプのコンピューターではほとんど古いバス)は、接続されているハードウェアを一覧表示する方法を提供しないため、ドライバーは通信を試みて、別の周辺機器がないことを祈るしかありません。同じアドレスに取り付けられています。一部のプラットフォームでは、ブートローダーに使用可能な周辺機器とそれらがマップされる場所を説明する デバイスツリー が含まれ、Linuxカーネルはこの情報に基づいてドライバーをアクティブ化します。周辺機器用にドライバをロードする方法は3つあります。

  • ドライバーは、カーネルイメージの一部として含まれている場合があります。
  • ドライバはモジュールとしてコンパイルされ、明示的にロードされます(たとえば、/etc/modulesまたはinitramfsに含めることによって)。
  • PCI(最新のPCのメインバス)やUSBなどのユニバーサル識別番号と共に接続された周辺機器をリストできるバスタイプによって報告された情報に基づいて特定のドライバーを自動的にロードするメカニズムがあります。カーネルはmodprobeを実行し、ペリフェラルの識別をエンコードするシンボリック名を渡します。これは、ドライバーモジュールの「実際の」名前のエイリアスです。参照 ドライバモジュールは自動的にロードおよびアンロードされますか?