ユーザスペースコードの場合と同様に、カーネルランドのさまざまな種類のハードウェアにアクセスするための標準化されたAPIが存在します(正確な使用法はOSによって異なります)。その結果、1つのデバイスドライバがこれらの標準化されたAPIを介して別のデバイスのドライバにアクセスすることはそれほど魅力的ではありません。 (警告:USBは非常に複雑なプロトコルであり、長いポストを短く保つために多くの詳細が書かれています)
元の質問は、PCIeからUSBカードに焦点を当てました。この例では、ドライバーの3つの「レイヤー」があると考えるのが有益だと思います。第1層は、PCIeバスコントローラドライバであり、PCIeデバイスのMMIOをマッピングし、それらのPCIeデバイスからの割り込みをサポートするなど、PCIeバス固有の機能を制御します。第2の層は、USBホストコントローラ層であり、標準化されたUSBトランザクションを発行する機能を提供する。最後に、(USBドライバキーボードのような)USBデバイスドライバは、標準化されたUSBトランザクションを使用してスタックの上に載って、特定のUSB周辺デバイスの機能を実装する。キーボードドライバからの呼び出しは、USBホストコントローラドライバ内の関数を呼び出して、PCIeドライバを呼び出すことさえできる。多くの独立したドライバが採用されているにもかかわらず、これはすべてカーネル空間で行われます。
ほとんどのPCIeデバイスは、MMIOアクセスを介してCPUと大量の通信を行います。これらは、プロセッサに対するメモリの読み書きとして表示されます。一般に、PCIeからCPUへのデータのMMIO転送を実行するために、特定のドライバ機能は必要ありません(ただし、エンディアンの訂正またはキャッシュ問題への対処には単純なアクセス機能があります)。
USBホストコントローラドライバは、標準のデバイスメモリマップと動作を規定する標準(XHCI、この例で使用するUSB 3.0規格など)に準拠している点で興味深いです。したがって、通常、チップ固有のドライバがUSBホストコントローラデバイスへの非標準初期化を実行することがあります。さらに、これらのチップ固有のドライバは、XHCI標準化されたMMIO領域の位置を検索し、XHCIコントローラ(この例ではPCIe割り込みから)の割り込みを受信する方法を提供します。
この標準化されたメモリ領域と割り込みメカニズムは、汎用のXHCIホストコントローラドライバに渡されます。一般的なXHCIコードは、デバイスがPCIeであるかどうか気にしません.XHCI規格に準拠したメモリ領域を通過し、正しい割り込みを受け取ることができます。XHCIドライバは汎用USB転送機能を提供し、デバイスはUSBトランザクションを開始するために使用できます。
ほとんどの場合、XHCIドライバは、渡されたMMIO領域への読み書きを行うだけです。これにより、同じ共通XHCIコードがワイドアレイUSBホストコントローラにサービスを提供します。その多くは、 PCIeデバイス。したがって、XHCIドライバは、USBコントローラを実装する基盤となるハードウェアを抽象化することができます。このように、元の疑問が提起された例では、USBホストコントローラの標準は、よりモジュラーなUSBドライバシステムを作るための基礎となるハードウェアメカニズムを隠すように設計されています。
Googleの割り込み ' –
残念ながら、これはシステム固有のものです。 – user3344003