次の方法で共有


ドライバーとは

ドライバーは、オペレーティング システムとデバイスが通信できるようにするソフトウェア コンポーネントです。 たとえば、アプリはデバイスからデータを読み取る必要がある場合、オペレーティング システムによって実装された関数を呼び出します。 オペレーティング システムは、ドライバーによって実装された関数を呼び出します。 通常、デバイスの製造元によって開発されたドライバーは、デバイス ハードウェアと通信してデータを取得する方法を認識しています。 ドライバーがデータを取得すると、オペレーティング システムにデータが返され、アプリに戻されます。

アプリケーション、オペレーティング システム、ドライバー間の相互作用を示す図。

定義の展開

この説明では、ドライバーの概念を簡略化します。 考慮すべきその他の点を次に示します。

  • ドライバーは、デバイスの製造元によって常に開発される必要はありません。 デバイスが公開されているハードウェア標準に従っている場合、Microsoft はドライバーを記述できるため、デバイス デザイナーはドライバーを提供する必要はありません。

  • すべてのドライバーがデバイスと直接通信するわけではありません。 多くの場合、ドライバー スタックに階層化された複数の ドライバー が I/O 要求に参加します。 スタックを視覚化する従来の方法は、次の図に示すように、最初の参加者を上部に、最後の参加者を下部に配置することです。 スタック内の一部のドライバーは、要求を 1 つの形式から別の形式に変更します。 これらのドライバーは、デバイスと直接通信しません。 代わりに、要求を変更し、スタック内の下位にあるドライバーに渡します。

    アプリケーション、オペレーティング システム、3 つのドライバー、およびデバイス間の通信を示す図。

    ファンクション ドライバー: デバイスと直接通信するドライバーは、 ファンクション ドライバーと呼ばれます。

    フィルター ドライバー: 補助処理を行うドライバーは 、フィルター ドライバーと呼ばれます。

    スタックの詳細については、「 ドライバー スタック」を参照してください。

  • 一部のフィルター ドライバーは、I/O 要求に関する情報を監視して記録しますが、アクティブには参加しません。 たとえば、一部のフィルター ドライバーは検証ツールとして機能し、スタック内の他のドライバーが I/O 要求を正しく処理することを確認します。

オペレーティング システムとデバイス間の通信を監視または参加する任意のソフトウェア コンポーネントとして、ドライバーの定義を調整できます。

ソフトウェア ドライバー

拡張された定義は合理的に正確ですが、一部のドライバーはハードウェア デバイスに関連付けられていないため、まだ不完全です。

たとえば、オペレーティング システムのコア データ構造にアクセスするツールを作成する必要がある場合は、ツールを 2 つのコンポーネントに分割できます。 最初のコンポーネントはユーザー モードで実行され、ユーザー インターフェイスが表示されます。 2 番目のコンポーネントはカーネル モードで実行され、コア オペレーティング システム データにアクセスします。 ユーザー モードで実行されるコンポーネントはアプリケーションと呼ばれ、カーネル モードで実行されるコンポーネントは ソフトウェア ドライバーと呼ばれます。 ソフトウェア ドライバーがハードウェア デバイスに関連付けられていない。

この図は、カーネル モード ソフトウェア ドライバーと通信するユーザー モード アプリケーションを示しています。

アプリケーションとソフトウェア ドライバーの関係を示す図。

ソフトウェア ドライバーは常にカーネル モードで実行されます。 これらは主に、カーネル モードでのみ使用可能な保護されたデータにアクセスするために書き込まれます。 ただし、すべてのデバイス ドライバーがカーネル モードのデータとリソースにアクセスする必要があるわけではないため、一部のデバイス ドライバーはユーザー モードで実行されます。

プロセッサ モードの詳細については、「 ユーザー モードとカーネル モード」を参照してください。

バス ドライバー

もう 1 つの種類のドライバーは 、バス ドライバーです。 バス ドライバーを理解するには、デバイス ノードとデバイス ツリーを理解する必要があります。

デバイス ツリー、デバイス ノード、バス ドライバーの詳細については、「 デバイス ノードとデバイス スタック」を参照してください。

ファンクションドライバーについての詳細

ここまでの説明では、 関数ドライバーの定義が過度に単純化されています。 デバイスのファンクション ドライバーは、デバイスと直接通信するスタック内の 1 つのドライバーであることを示しました。 これは、周辺機器コンポーネント 相互接続 (PCI) バスに直接接続するデバイスに当てはまります。 PCI デバイスのファンクション ドライバーは、デバイス上のポートとメモリ リソースにマップされているアドレスを取得します。 関数ドライバーは、これらのアドレスに書き込むことで、デバイスと直接通信します。

ただし、多くの場合、デバイスは PCI バスに直接接続されません。 代わりに、デバイスは PCI バスに接続されているホスト バス アダプターに接続します。 たとえば、USB トースターは、PCI バスに接続されているホスト バス アダプター (USB ホスト コントローラーと呼ばれます) に接続します。 USB トースターにはファンクション ドライバーがあり、USB ホスト コントローラーにはファンクション ドライバーもあります。 トースターのファンクション ドライバーは、USB ホスト コントローラーのファンクション ドライバーに要求を送信することによって、トースターと間接的に通信します。 その後、USB ホスト コントローラーのファンクション ドライバーは、トースターと通信する USB ホスト コントローラー ハードウェアと直接通信します。

USB トースター ドライバー、USB ホスト コントローラー ドライバー、および PCI バスの間の相互作用を示す図。