USBデバイスの認識はどのように機能しますか?


16

WindowsでUSBデバイスの認識がどのように機能するか興味があります。私は想像することはこのようなものです:

  • デバイスを接続すると、Windowsに「自分が何であるかを伝えるためのデバイスIDがあります」と通知されます。
  • Windowsは、そのデバイスIDと一致するドライバーがインストールされているかどうかを確認します。ドライバーはおそらく「BlackBerry Curve」や「Canon Printer」など、デバイスの名前をWindowsに通知します。
  • その場合、それはどういうわけかそのデバイスをそのドライバに関連付けます
  • それ以外の場合、一致するドライバーをオンラインで検索します(許可した場合)。

私は正しいですか?もしそうなら、それはまだいくつかの質問を残します。

  • ドライバーをインストールするとき、どこに行きますか?それらはフォルダ内のファイルですか、それともレジストリに追加されますか?
  • Windowsが最初にデバイスを認識し、考え、最後に「新しいデバイスがインストールされ、使用する準備ができました」と言ったとき、Windowsは何をしていますか?
  • Windowsは欠落しているドライバーをどこで探しますか?独自のデータベースにありますか?デバイスメーカーは、そこに含めるためにドライバーをマイクロソフトに提出しますか?

誰もこのプロセスが実際にどのように機能するか説明できますか?また、他のOSはこれを異なる方法で行いますか?

回答:


24

USBバスは、プラグを挿入(および削除)する行為をホストコントローラーが認識できるように物理的に設計されています。この「プラグ」イベントが発生すると、ホストコントローラーはバスをスキャンするデバイスドライバーに通知し、各デバイスに自身の識別を要求します。

すべてのUSBデバイスには、記述子と呼ばれるデバイスに関する情報のコレクションが含まれています。デバイス記述子は、同じコマンドですべてのデバイスから取得されます。これにより、USBバス自体のデバイスドライバーは、新しく接続されたデバイスにそれが何であるかを効果的に尋ね、合理的な応答を得ることができます。

すべての記述子のうち、ドライバーをほとんどのデバイスに一致させるために直接使用されるのはわずかです。これは、USBがデバイスのクラスを定義するためです。通常、各デバイスクラスのシステムドライバーは、そのクラスに属すると主張するデバイスを処理するのに十分です。

すべてのキーボードは、マウス、タブレット、ゲームコントローラなどと同様に、HID(Human Interface)クラスに属していると主張します。HIDクラスにはいくつかのサブクラス(キーボード、マウスなど)があるため、各サブクラスは期待どおりに処理されます。

ほとんどのディスクのようなデバイスはMass Storageクラスに属していると主張し、システムドライバーはそれらに対しても機能します。

クラスとサブクラスに加えて、記述子にはベンダーID(VID)、製品ID(PID)、およびリビジョンも含まれます。ベンダーIDは標準化委員会によって割り当てられます(ほとんどが発行順になっていますが、一部の企業は特別なリクエストを受け取りました。たとえば、intelは0x8086です)。製品IDは各ベンダーによって割り当てられ、VIDとPIDの組み合わせはリリースされた各製品に固有でなければなりません。

デバイスが最初にインストールされるとき、VID、PID、リビジョン、クラス、およびサブクラスが予測可能な方法で使用され、ロードされるデバイスドライバーが選択されます。ベンダーおよび製品固有の名前を持つことにより、ベンダーは、ストックシステムドライバーによって(ほぼ)正しく処理される可能性のあるデバイスをカスタマイズできます。

もう1つの重要な記述子は、デバイスのシリアル番号です。デバイスにシリアル番号がある場合、別の物理USBポートが使用されている場合でも、再度プラグインすると認識され、同じように扱われます。これは、同じドライブ文字が割り当てられるストレージデバイスにとって、またシリアルポートアダプタやモデムのようなデバイスにとって同じCOMポート指定が与えられるようにするために重要です。

このプロセス全体はMSDNで文書化されていますが、詳細はさまざまな場所に広がっています。


整然とした説明をありがとう。とても興味深い!
ネイサンロング

3
ドキュメントとサンプルからこれらの詳細を収集するのに費やした時間は、Windows用の最初のデバイスドライバーを作成したときの予期しないタスクでした。私は...それの結果を共有することがうれしい
RBerteig

7

質問:

  • ディレクトリ: ドライバは2つのディレクトリにインストールされます。実行部分は(ほとんどの場合)%RootDir%\ system32にインストールされ、デバイス情報部分は%RootDir%\ infにインストールされます。inf dirの下に、インストール/登録されたドライバーのoem * .infファイルが作成されます。(*は数字です)。Vistaでは、ドライバーは、まだ検出されていないデバイスをインストールする際の参照として、%RootDir%\ system32 \ driverstoreディレクトリーにコピーされます。
  • レジストリ: ドライバーはカーネルモードサービスとしてインストールされます。このため、特定のレジストリキーがドライバーサービス用に作成されます。バスドライバーの下には、対応するデバイスが個々のデバイスインスタンスキーを取得する別の場所があります。このキーでは、デバイスはこのデバイスで現在使用されているドライバーへの参照を持っています。
  • デバイス「到着」:バスドライバーは、バス上で新しいデバイスを見つけると、独自のキーの下に、システム上のデバイスを一意に識別するために使用できる一意のデバイスインスタンスIDに対応するキーレジストリを作成します。このキーが既に存在する場合、バスドライバーはこのノードが参照するデバイスをロードしようとします。このノードが存在しない場合、またはドライバーがロードされない場合、システムは、%RootDir%\ infの下にある登録済みのデバイスドライバーをスキャンして、デバイスと互換性のあるドライバーを見つけようとします。このデバイスに適合するドライバーは、列挙およびソートされます。次に、デバイスに最適なドライバーが選択され、ロードされます。
  • ドライバー検索:ドライバーは、infディレクトリーで最初に検索されます。ドライバーが見つからない場合、Windowsはユーザーにドライバーを提供できるかどうか、またはMicrosoftサーバーで検索するかどうかを尋ねます。ドライバーの製造元は、Microsoftデバイスドライバーサーバーに含めるドライバーを提出できます。

Lunatikには、いわゆるバスドライバーがデバイスを見つける方法の最初の部分があります。


3

私はUSBに関する良い本をお勧めします:

  • Jan AxelsonによるUSB Complete

あなたがこれを要求しなかったことは知っていますが、接続するはずのUSBデバイスについて少し知っておくと良いでしょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.