USB検出のフローを理解する方法は?


14

カーネルスペースからユーザースペースへのUSBイベントの流れを理解したいと思います(私の好奇心から、どのように実装されているかを知ることで)。

より明確にするために、USBドライブをシステムに接続したときにデスクトップにポップアップがどのように表示され、ドライブがどのようにマウントされるかを知りたいと思います。

また、USBにイメージが存在するかどうかを確認し、「はい」の場合、GIMPまたは他のソフトウェアで開く必要があるかどうかをどのように尋ねますか?

私はその非常に大きく幅広い質問を知っていますが、その背後にあるアイデア全体を理解する方法に関するいくつかの指針を教えてください。

大規模なコードブラウジングは行っていませんが、正しく誘導できれば問題はありません。

回答:


16
  1. デバイスがプラグインされ、そのデバイスのハードウェアバスを管理するソフトウェアが割り込み(またはハードウェアレベルでのその他の通知)を受信し、バスドライバーが接続されたデバイスを列挙するか、デバイスを識別するその他のバス固有のハードウェアアクションを実行します。
  2. カーネルは、ハードウェアのbus / device / etc識別子で/ sbin / modprobeを呼び出すことにより、新しいハードウェアのドライバーをロードするよう要求します。
  3. ユーザー空間では、modprobeは一致するドライバー指定のエイリアスを見つけようとします。(/lib/modules/$(uname -r)/modules.alias完全なリストについては、を参照してください。)これらは、ハードウェアインターフェイスに基づいて異なって見えます。たとえばpci:v0000102Bd00002527sv*sd*bc*sc*i*、PCIデバイスベンダー102B、デバイス2527、およびサブベンダーなど、またはUSBの場合:usb:v2040p4982d*dc*dsc*dp*ic*isc*ip*
  4. デバイスドライバーが読み込まれる(または、既にドライバーを持っている新しいデバイスが初期化される)と、カーネル内のドライバーは、読み込まれたデバイスの通知をudevユーザー空間に送信します。
  5. udevルールのリストに対する通知と一致する/lib/udev/rules.d/とは/etc/udev/rules.d。ここから、動作はルールに基づいて非常に特殊化されます。
  6. USBディスクの場合、80-udisks.rulesファイルはおそらく作業に最適な場所です。これらのルールは、blkidやその他のヘルパーなどを使用してディスクのタイプと内容をプローブし、ENV{UDISKS_PRESENTATION_HIDE}="1"何らかの理由でディスクを無視するなどのあらゆる構成値を取り込みます。詳細については、「man 7 udisks」を参照してください。
  7. udisks・デーモンに表示されるデバイスのための時計udevのデータベース、およびプレゼントDバスを超えるデバイスの発見可能なリストとしてそれらそれら。(「udisks --enumerate」を参照してください。)
  8. さまざまなアクションがudisksで設定され、それらのアクションを許可するポリシーはポリシーファイルで確認できます/usr/share/polkit-1/actions/org.freedesktop.udisks.policy。(マウント、アンマウントなどができる人)
  9. デバイスに関心のあるサービスは、udisksからのDBusイベントをリッスンし、特定の条件が見つかったときにアクションを実行します。たとえば、GNOMEのNautilus(gvfs volume-monitor経由)はデバイスの自動マウントを要求します(上記のポリシーをチェックするudisks経由)。
  10. ファイルシステムがマウントされると、それらの同じリスニングサービスはより多くのアクションを実行します。たとえば、Nautilusは、共通の写真保存ディレクトリがファイルシステムで見つかったときにF-Spotを開くかどうかを尋ねDCIMます。

1
たぶん、起動中にこれがどのように異なるか知っていますか(ステップ1だけが異なると仮定します)?ブート中にデバイスが検出されず、手動で再接続した後に正しくロードされるのはなぜですか?
naktinis
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.