web-dev-qa-db-ja.com

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

カーネル空間からユーザー空間へのUSBイベントの流れを理解したいと思います(私の好奇心から、物事の実装方法を知ることで)。

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

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

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

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

14
Sen
  1. デバイスが接続され、そのデバイスのハードウェアバスを管理するソフトウェアが割り込み(またはハードウェアレベルでのその他の通知)を受信し、バスドライバーが接続されたデバイスを列挙するか、デバイスを識別するその他のバス固有のハードウェアアクションを実行します。
  2. カーネルは、ハードウェアのバス/デバイス/などの識別子で/ sbin/modprobeを呼び出して、新しいハードウェアのドライバーをロードするよう要求します。
  3. ユーザー空間では、modprobeは一致するドライバー指定のエイリアスを見つけようとします。 (完全なリストについては、/lib/modules/$(uname -r)/modules.aliasを参照してください。)これらは、ハードウェアインターフェイスに基づいて異なって見えます。たとえば、PCIデバイスベンダー102B、デバイス2527、およびサブベンダーなどの場合はpci:v0000102Bd00002527sv*sd*bc*sc*i*、または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. disks-daemonは、devデータベースに表示されるデバイスを監視し、それらをDBus上の検出可能なデバイスのリストとして提示します。 (「udisks --enumerate」を参照してください。)
  8. さまざまなアクションがdisksで構成されており、それらのアクションを許可するポリシーはポリシーファイル/usr/share/polkit-1/actions/org.freedesktop.udisks.policyで確認できます。 (マウント、アンマウントなどができる人)
  9. デバイスに関心のあるサービスは、disksからのDBusイベントをリッスンし、特定の条件が見つかったときにアクションを実行します。たとえば、GNOMEのNautilus(gvfs volume-monitor経由)は、デバイスの自動マウントを要求します(disks経由で、上記のポリシーを確認します)。
  10. ファイルシステムがマウントされると、同じリッスンサービスがさらにアクションを実行します。たとえば、Nautilusは、共通の写真保存ディレクトリDCIMがファイルシステムで見つかったときにF-Spotを開くかどうかを尋ねます。
16
Kees Cook