MODULE_DEVICE_TABLE(usb, id_table)
の正確な使用法を理解するのに苦労しています
これは、新しいデバイスが挿入されるたびにmodprobe
が後で使用するマップファイルを生成します。マップファイルと照合し、一致する場合はモジュールをロードします。
しかし、私の誤解は、「とにかくモジュールがロードされていないのか」というものです。
私がやったときにすでにそれをロードしたということですinsmod module-name
。または私は何かを逃していますか?
これは通常、まだロードされていない場合にデバイスのドライバーをロード/挿入することにより、ホットプラグをサポートするために使用されます。
同様の質問がここにあります: Linuxでホットプラグされたときにデバイスの存在を検出します
(私のansから)
次のように機能します。
コード内の各ドライバーは、次を使用してベンダー/デバイスIDを公開します。
MODULE_DEVICE_TABLE(of, omap_mcspi_of_match);
コンパイル時に、ビルドプロセスはすべてのドライバーからこの情報を抽出し、デバイステーブルを準備します。
デバイスを挿入すると、デバイステーブルはカーネルによって参照され、追加されたデバイスのデバイス/ベンダーIDと一致するエントリが見つかった場合、そのモジュールがロードされて初期化されます。
Linuxデバイスドライバーによると:
MODULE_DEVICE_TABLE
_は、depmod
プログラムによってマップファイルを生成するために使用されます。/sbin/hotplug
_を呼び出します。/sbin/hotplug
_はロードするモジュールを決定し、実際にロードします。モジュールがすでにロードされている場合は、問題ありません。このメカニズムは、デバイスが接続されたときに必要なモジュールが配置されることを保証するだけであることを再度述べておきます。これは、モジュールをそのデバイスやその他のものとリンクしません。モジュールをロードするだけです。
特定のデバイスでドライバーが正常かどうかを確認するには、_bus_type
_のmatch()
関数を使用します。
ここでは、[Xbuntu 14.04互換]について理解する方法を説明します。
モジュールを作成したら、手動または自動でロードできます。
insmod
modulename.koまたはmodprob
modulename.ko自動->複数の方法があります。
/ lib/modules/`uname -r`/kernel/modulename.koにコピーして、/etc/modules
を更新します。システムは起動中にモジュールをロードします。
特定のハードウェアのmodule.koをロードするスクリプト/コマンドを記述しますadd
/change
/remove
イベントudev
ルール/etc/udev/rules.d/10-local.rules
。この方法を使用すると、ロード/アンロードの両方を実行できます。
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モニター
コマンド。