デバイスドライバの種類
今回はデバイスドライバの種類について整理していきます。
デバイスドライバは「PCとデバイスとの橋渡しを役割とするソフトウェア」という話をしましたが、皆さんが実際に触るデバイスとデバイスドライバは1対1の関係ではありません。
例えば、USBメモリの場合、接続するUSBポートにはUSBハブ用のデバイスドライバが存在します。さらに、USBハブが接続されるUSBホストコントローラー用のデバイスドライバ、USBホストコントローラーが接続されるPCIバス用のデバイスドライバと、複数のデバイスドライバが存在します。USBメモリでファイルを読み書きするだけでも、たくさんのデバイスドライバを通過しています。
このようにWindows上でアプリケーションが実際にデバイスを操作するまでにはたくさんのデバイスドライバが階層構造で接続されているのです。
今回は、この階層構造となっているデバイスドライバの種類について説明したいと思います。
Windowsにおけるデバイスドライバは、大きく分けて、「バスドライバ」「ファンクションドライバ」「フィルタドライバ」から構成されます。
これらのドライバの種類について説明します。
バスドライバ
バスドライバとは、PCIバス、PnpISAバス、SCSIバスなどを管理するドライバです。管理の役割の一つにバス上に接続されたデバイスを列挙することがあります。バスドライバは列挙したデバイスをそれぞれ識別し、上位のドライバからの通信を仲介します。他の役割として各バスのコントローラーやアダプタのファンクションドライバとしての役割も果たします。
バスドライバはデバイスのインタフェースごとに存在するため、同じデバイスであってもインターフェースが異なれば使用されるバスドライバも変わってきます。
ファンクションドライバ
ファンクションドライバは、クラスドライバとミニポートドライバに大別されます。
なお、特殊なドライバとして、クラスドライバ、ミニポートドライバのどちらにも属さないファンクションドライバもありますが、今回は割愛します。
クラスドライバ
クラスドライバは前回のデバドラ講座でも書きましたが、デバイスクラスに対応するデバイスドライバです。
クラスごとのDDI(Device Driver Interface)をアプリケーションまたは上位階層のドライバに提供し、デバイス(下位階層のドライバ)対応するデバイスクラスに応じて制御します。
デバイスドライバを作成する場合、大部分がクラスドライバとなると思います。
ミニポートドライバ
ミニポートドライバは、クラスドライバの全体の機能のうち、対象デバイスに特化した部分のみを処理するドライバです。クラスドライバは必要となる全ての機能を実装しますが、ミニポートドライバは共通的な処理はOS側で用意されるポートドライバが処理してくれます。
このポートドライバは、対象クラスに必要となる機能を抽象化した専用のI/Fをポートドライバに提供し、ミニポートドライバはデバイスの固有な部分を処理します。ミニポートドライバとポートドライバを組み合わせて、一つのクラスドライバを形成します。
MicrosoftはWindowsミニポートドライバのサンプルとしてバッテリードライバを公開しています。このドライバはバッテリの充電容量取得、バッテリー内の温度取得機能などへのインターフェースを提供します。
フィルタードライバ
フィルタードライバは補助的なドライバであり、デバイスの動作を変更したり、新たな機能を追加したりすることができます。クラスドライバやバスドライバの上位や下位に挿入され、その役割を果たします。
MicrosoftはWindowsフィルタードライバのサンプルとしてファイルシステムドライバを公開しています。このドライバはファイル内のデータを分析する等の機能を提供します。
##デバイスドライバの階層構造
以下の図にバスドライバ、ファンクションドライバ、フィルタドライバの関係を示します。
WDMドライバは呼び出される順番で階層化されています(これをドライバスタックと呼びます)。この階層化された構造の上位ドライバから下位ドライバへ要求を受け渡す形でデータのやり取りを行っています。
ドライバを開発する際には各ドライバの役割について理解し、自分がどの階層のドライバを作成しようとしているのか把握することが重要です。
参考ページ:
Microsoft「WDMドライバーの種類」
https://docs.microsoft.com/ja-jp/windows-hardware/drivers/kernel/types-of-wdm-drivers
サイエンスパーク「デバドラ講座3:ドライバの種類」
https://sciencepark.co.jp/device_driver/dvdr/report-3/