オペレーティングシステム(以下OS)は、デバイスを管理しているというのが前回の話だった。一般にOS中で、デバイスを直接操作する部分は「デバイスドライバー」と呼ばれている。OSはデバイスを一定の「形」で扱う。そのルールに沿って、さまざまなデバイスを一定の形に見せるように働くのが、デバイスドライバーだ。
例えば入力機器にはさまざまなものがあるが、「入力が行なわれたか」を通知して、「入力されたデータを読み込む」という形で、OSが入力機器を統一的なやり方で操作できるようにするのが、デバイスドライバーの働きのひとつである。
現在のWindows 7やWindows Server 2008R2では、従来からの「WDM」(Windows Driver Model)型式のデバイスドライバーと、Windows Vistaから追加された「WDF」(Windows Driver Foundation)型式のドライバーがある。今回はWDMを中心に解説して、次回にWDFについて解説しよう。
共通部分と差異部分にわかれる
Windowsのドライバー構成
Windowsのデバイスドライバーは、大半がカーネルモードで動作する。そして、ファイルシステムドライバーとそうでないドライバーがある。ファイルシステムドライバーは特定のデバイスのためのドライバーではなく、「NTFS」や「FAT」といったファイルシステムを操作するためのドライバーである。
これらがデバイスドライバーと同じ構造となっているのは、ファイルシステムの追加(例えばDVD、BDといった光ディスクフォーマットなど)をあとから導入可能とする「インストーラブル・ファイル・システム」(IFS)を実現するためだ(図1)。
世の中にはいろいろなデバイスがあり、中には外側だけ違っていて中身は同じというデバイスもある。逆に中身は多少違うが、制御基板上に乗っているコントローラーが同じ(なので制御の仕方も同じ)という場合だってある。さらにUSBデバイスなどでは、機能が似たデバイス、例えばHDDとメモリーカードリーダーは、どちらも「USB大容量ストレージデバイス」に分類されている。
Windowsでは原則として、デバイスひとつに対してひとつのデバイスドライバーが必要になるが、似たようなデバイスではドライバー内部の共通部分も多い。それをひとつひとつ作り分けていたのでは、ドライバー開発に膨大な時間と手間がかかってしまうし、ドライバーのファイルが大量に必要になる。
そこでWindowsでは、「クラスドライバー」という仕組みを使う(図2)。そして、ある種類のデバイスに対して共通した部分は、クラスドライバーとして共用できるようにしている。
しかし、例えば同じコントローラーチップを使っていても、アクセスするI/Oアドレスが違うなんて場合もある。このような細かい違いに対応するために「ミニポート」ドライバーというものを作り、前述のクラスドライバーと組み合わせてひとつのデバイスを制御している。こうして処理の似通ったドライバーは、共通部分と差違部分に分けることができ、それぞれを適切に組み合わせることで、Windowsは多数のデバイスに対応できるようになる。

この連載の記事
-
第13回
PC
ARM版Windows 8実現の布石となったWindows 7の「MinWin」 -
第12回
PC
アプリがWindowsの機能を使うには? APIとDLLの仕組み -
第11回
PC
マルチコアCPUの消費電力はスケジューリングで変わる? -
第10回
PC
AMD FX向けにパッチで修正 スケジューラーが抱える難題 -
第9回
PC
マルチコアCPUを賢く使いこなす スケジューリングの秘密 -
第8回
PC
意味の違いがわかる? タスクとプロセスとスレッド -
第7回
PC
Windowsのメモリー管理をx86の仕組みから読み解く -
第6回
PC
メモリー不足を根本的に解決する64bit OSの仕組み -
第5回
PC
Windows 8でMetro Styleアプリを動かす「WinRT」 -
第3回
PC
OSの仕事はハードウェアをアプリから「隠す」こと? - この連載の一覧へ