web-dev-qa-db-ja.com

MODULE_DEVICE_TABLE(usb、id_table)の使用法を理解するのに苦労

MODULE_DEVICE_TABLE(usb, id_table)の正確な使用法を理解するのに苦労しています

これは、新しいデバイスが挿入されるたびにmodprobeが後で使用するマップファイルを生成します。マップファイルと照合し、一致する場合はモジュールをロードします。

しかし、私の誤解は、「とにかくモジュールがロードされていないのか」というものです。

私がやったときにすでにそれをロードしたということですinsmod module-name。または私は何かを逃していますか?

20
silentnights

これは通常、まだロードされていない場合にデバイスのドライバーをロード/挿入することにより、ホットプラグをサポートするために使用されます。

同様の質問がここにあります: Linuxでホットプラグされたときにデバイスの存在を検出します

(私のansから)

次のように機能します。

  1. コード内の各ドライバーは、次を使用してベンダー/デバイスIDを公開します。

      MODULE_DEVICE_TABLE(of, omap_mcspi_of_match);
    
  2. コンパイル時に、ビルドプロセスはすべてのドライバーからこの情報を抽出し、デバイステーブルを準備します。

  3. デバイスを挿入すると、デバイステーブルはカーネルによって参照され、追加されたデバイスのデバイス/ベンダーIDと一致するエントリが見つかった場合、そのモジュールがロードされて初期化されます。

22
brokenfoot

Linuxデバイスドライバーによると:

  1. _MODULE_DEVICE_TABLE_は、depmodプログラムによってマップファイルを生成するために使用されます。
  2. デバイスがホットプラグされると、バスドライバーがホットプラグイベントを生成します。カーネルは、適切な環境変数を設定して_/sbin/hotplug_を呼び出します。
  3. マップファイルと環境からの情報が与えられると、_/sbin/hotplug_はロードするモジュールを決定し、実際にロードします。モジュールがすでにロードされている場合は、問題ありません。

このメカニズムは、デバイスが接続されたときに必要なモジュールが配置されることを保証するだけであることを再度述べておきます。これは、モジュールをそのデバイスやその他のものとリンクしません。モジュールをロードするだけです。

特定のデバイスでドライバーが正常かどうかを確認するには、_bus_type_のmatch()関数を使用します。

11
Alexey Shmalko

ここでは、[Xbuntu 14.04互換]について理解する方法を説明します。

モジュールを作成したら、手動または自動でロードできます。

  • 手動-> insmod modulename.koまたはmodprob modulename.ko
  • 自動->複数の方法があります。

    1. / lib/modules/`uname -r`/kernel/modulename.koにコピーして、/etc/modulesを更新します。システムは起動中にモジュールをロードします。

    2. 特定のハードウェアのmodule.koをロードするスクリプト/コマンドを記述しますadd/change/removeイベントudevルール/etc/udev/rules.d/10-local.rules 。この方法を使用すると、ロード/アンロードの両方を実行できます。

    3. MODULE_DEVICE_TABLE登録でモジュールをコーディングします。次に、modulename.koを1回ロードし、depmodコマンド[Sudo depmod -a]を実行して、新しいモジュールを/lib/modules/3.16.0-34-generic/modules.alias/lib/modules/3.16.0-34-generic/modules.depファイルに追加します。私が知っているように、システムがロードされるのは、モジュールがロードされていない場合のみです。

以下を使用して、udevイベントを使用してモジュールのロード/アンロードを監視できます。

udevadmモニター

コマンド。

6