Linuxカーネルは、デバイスの主要なデバイス番号とマイナーデバイス番号をどのように知ることができますか?

Linuxカーネルは、デバイスの主要なデバイス番号とマイナーデバイス番号をどのように知ることができますか?

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

私はまた、udevがデバイスを処理するドライバをロードするためにmodprobeを呼び出すことを(おそらく不正確に)理解しています。

これを行うには、MODALIAS uevent環境変数の内容を使用し、エイリアスがその文字列と一致するすべてのモジュール(正しいドライバ)をロードすると聞きました。簡単に言えば、Linuxのハードウェア検出ステップは何であり、各ステップを実行する人はカーネル自体、カーネル内のドライバ、またはユーザースペースのudevです。ありがとうございます。

ベストアンサー1

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

ドライバの初期化コードは、ハードウェアを検索し、検索中に検出されたハードウェアに基づいてデバイスを登録します。特定の種類のハードウェアはプロービングをサポートしません。ISAバス(PCタイプのコンピュータではほとんど使用されていないバス)接続されたハードウェアを一覧表示する方法がないため、ドライバは通信を試み、他の周辺機器が同じアドレスに接続されないことを望むだけです。一部のプラットフォームでは、ブートローダには次のものが含まれます。デバイスツリー利用可能なペリフェラルと対応するマッピングの場所を説明し、Linuxカーネルはこの情報に基づいてドライバを有効にします。周辺機器用のドライバをロードするには3つの方法があります。

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

おすすめ記事