ドライバーとは
ドライバーは、オペレーティング システムとデバイスが通信できるようにするソフトウェア コンポーネントです。 たとえば、アプリは、デバイスからデータを読み取る必要がある場合に、オペレーティング システムによって実装されている関数を呼び出します。 すると、オペレーティング システムが、ドライバーによって実装されている関数を呼び出します。 一般的にデバイスの製造元によって開発されるドライバーは、データを取得するためにデバイス ハードウェアと通信する方法を認識しています。 ドライバーは、データを取得すると、オペレーティング システムにデータを返します。オペレーティング システムは、このデータをアプリに返します。
定義の拡大
ここでは、ドライバーの概念を簡略化して説明しています。 考慮すべきその他の点を次に示します。
ドライバーの開発は、必ずしもデバイスの製造元が行う必要はありません。 デバイスが公開されているハードウェア標準に従っている場合は Microsoft がドライバーを作成できるため、デバイス デザイナーがドライバーを提供する必要はありません。
すべてのドライバーがデバイスと直接通信するわけではありません。 多くの場合、ドライバー スタックに階層化された複数のドライバーが I/O 要求に関与します。 従来の方法でスタックを視覚化すると、この図に示すように、最初の関連ドライバーが最上部に、最後の関連ドライバーが最下部に配置されます。 スタック内の一部のドライバーは、要求を 1 つの形式から別の形式に変更します。 これらのドライバーは、デバイスと直接通信しません。 代わりに、要求を変更し、スタック内の下位にあるドライバーに渡します。
ファンクション ドライバー: デバイスと直接通信するドライバーは、ファンクション ドライバーと呼ばれます。
フィルター ドライバー: 補助的な処理を行うドライバーは、フィルター ドライバーと呼ばれます。
スタックの詳細については、「ドライバー スタック」を参照してください。
フィルター ドライバーの中には、I/O 要求に関する情報を監視して記録するだけでアクティブに関与しないものもあります。 たとえば、一部のフィルター ドライバーは、検証ツールとして機能し、スタック内の他のドライバーが I/O 要求を正しく処理することを確認します。
ここから、ドライバーの定義を、"オペレーティング システムとデバイス間の通信を監視するか通信に関与する任意のソフトウェア コンポーネント" と精緻化することができます。
ソフトウェア ドライバー
この拡張された定義は、合理的に正確ですが、一部のドライバーはハードウェア デバイスにまったく関連がないため、まだ不完全です。
たとえば、オペレーティング システムのコア データ構造にアクセスするツールを作成する必要がある場合は、ツールを 2 つのコンポーネントに分割できます。 1 つ目のコンポーネントは、ユーザー モードで実行され、ユーザー インターフェイスを表示します。 2 つ目のコンポーネントは、カーネル モードで実行され、コア オペレーティング システム データにアクセスします。 ユーザー モードで実行されるコンポーネントはアプリケーションと呼ばれ、カーネル モードで実行されるコンポーネントはソフトウェア ドライバーと呼ばれます。 ソフトウェア ドライバーは、ハードウェア デバイスに関連付けられません。
この図は、ユーザーモード アプリケーションとカーネルモード ソフトウェア ドライバーの通信を示しています。
ソフトウェア ドライバーは常にカーネル モードで実行されます。 これらは主に、カーネル モードでのみ使用可能な保護されたデータにアクセスするために作成されます。 ただし、すべてのデバイス ドライバーがカーネルモードのデータとリソースにアクセスする必要があるわけではないため、ユーザー モードで実行されるデバイス ドライバーもあります。
プロセッサ モードの詳細については、「ユーザー モードとカーネル モード」を参照してください。
バス ドライバー
もう 1 つの種類のドライバーは、バス ドライバーです。 バス ドライバーを理解するには、デバイス ノードとデバイス ツリーを理解する必要があります。
デバイス ツリー、デバイス ノード、バス ドライバーの詳細については、「デバイス ノードとデバイス スタック」を参照してください。
ファンクション ドライバーの詳細
ここまでの説明では、ファンクション ドライバーの定義が過度に単純化されています。 最初の説明では、デバイスのファンクション ドライバーのことを、デバイスと直接通信するスタック内の 1 つのドライバーと解説しました。 これは、Peripheral Component Interconnect (PCI) バスに直接接続するデバイスに当てはまります。 PCI デバイスのファンクション ドライバーは、デバイス上のポートとメモリ リソースにマップされるアドレスを取得します。 ファンクション ドライバーは、これらのアドレスに書き込むことで、デバイスと直接通信します。
ただし、多くの場合、デバイスは PCI バスに直接接続されません。 代わりに、デバイスは、PCI バスに接続されたホスト バス アダプターに接続されます。 たとえば、USB トースターは、PCI バスに接続されたホスト バス アダプター (USB ホスト コントローラーと呼ばれます) に接続されます。 USB トースターにはファンクション ドライバーがあり、USB ホスト コントローラーにもファンクション ドライバーがあります。 トースターのファンクション ドライバーは、USB ホスト コントローラーのファンクション ドライバーに要求を送信することによって、トースターと間接的に通信します。 その後、USB ホスト コントローラーのファンクション ドライバーは、トースターと通信する USB ホスト コントローラー ハードウェアと直接通信します。