■Windows XPでは,「Windows Driver Model」というデバイス・ドライバの仕組みが採用されている。この仕組みは,2006年末に登場する予定の「Windows Vista」で一新される予定だ。
■Windowsにはなぜ,デバイス・ドライバのような仕組みが必要なのだろうか。また,マイクロソフトはなぜVistaでドライバの仕組みを一新するのか。Windowsのデバイス・ドライバの歴史を紐解きながら,その詳しい仕組みを解説する。

(中島 省吾=メディアプラネット)



 最終回となる今回は,デバイス・ドライバを取り上げる。Windowsのデバイス・ドライバについては,2006年末に登場予定のWindows Vistaで仕様が変更される。

 Windowsのデバイス・ドライバの仕様は,過去にも大きく変更されたことがあった。1996年に発表された「Win32 Driver Model」である。Windowsのドライバを統一しようとするこの仕組みは,紆余曲折の末「Windows Driver Model」へと変更された。基本的な構造は現在のWindows XPでも変わっていない。

 マイクロソフトは,なぜWindows Vistaでデバイス・ドライバの仕様を変更するのだろうか。そもそも,なぜデバイス・ドライバというソフトがWindowsに必要なのだろうか。今回は,Windowsのデバイス・ドライバの歴史を紐解きながら,その詳しい仕組みを解説する。

OSとデバイスを駆動するソフトを切り離す

 パソコンに詳しい人なら,初心者から「デバイス・ドライバって何?」と聞かれたら,「OSとハードウエアの間に入るプログラムのことだ」というような答えを返すだろう。「ハードウエア」のことを「デバイス」と呼び,そのデバイスを「動かす」つまり「ドライブ」するから「デバイス・ドライバ」なのだが,実際の詳しい仕組みとなると難しい。そもそも「ハードウエア」といってもその範囲は広いし,なぜデバイス・ドライバが必要なのかはWindowsがデバイスを制御する仕組みを知らなければ分からない。

 今回取り上げる「デバイス」は,ディスプレイやプリンタ,デイスク装置など,コンピュータに後から追加するハードウエアを指している。これらのデバイスを動かすには,先ほどの「ドライバ」というソフトが必要になる。


△ 図をクリックすると拡大されます
図1●新しいハードウエアの追加を容易にするデバイス・ドライバ

△ 図をクリックすると拡大されます
図2●Windows 95における仮想デバイス・ドライバの仕組み
 こう聞くと「OSとデバイス・ドライバを一体化しておけばいいのではないか」と思うかもしれない。確かにWindowsには,あらかじめ数多くのデバイス・ドライバがインストールされている。しかし,デバイス・ドライバは後から追加できるように,OSと分離しておく方が便利だ。デバイス・ドライバを後から追加できれば,Windowsはすべてのドライバがそろうのを待たずに出荷できる。またハードウエア・メーカーも,OSが発売された後に新しい周辺機器を発売できる(図1)。

「OSとデバイスを駆動するソフトを切り離す」という仕組みは,MS-DOSのときからあった。しかし,マルチタスク処理が必要なWindowsでは,MS-DOSのようなドライバの作り方では動作しない。そこで「仮想デバイス・ドライバ」という仕組みに変更された。仮想デバイス・ドライバはWindows 3.1/9xにおいて,複数のプログラムが1つのデバイスを共有できるように調整する役割を担う。

 この機能は,CPUが備えている仮想86モードのI/Oトラップ機構を利用して実装されている。この仕組みによって,プログラムのデバイスへのアクセスを仮想デバイス・ドライバが横取りできる。例えば,Windows 95には「VMM32.VXD」という仮想デバイス・ドライバが実装されている。これは,各ハードウエアの仮想デバイス・ドライバをロードし統合管理する(図2)。

 図2はWindows 95を例にしているが,Windows 3.1では「WIN386.EXE」が,仮想デバイス・ドライバを統合管理していた。どちらにしても「仮想デバイス・ドライバ」によって,複数のプログラムが同じデバイスを共有できるようになった。ただここで重要なのは「マルチタスクが可能になった」ことではなく,「デバイス・ドライバを管理するデバイス・ドライバ」が登場した点にある。この「複数のドライバを組み合わせる」という手法は,次に登場する「WDM」で,非常に重要な意味を持つことになる。

Windows 9xとWindows NTのドライバを統合するWDM

 Windows 95では仮想デバイス・ドライバを使って,デバイスをマルチタスク環境で利用できるようになった。しかし当時は,MS-DOSとの互換性を重視して16ビット部分を残していたWindows 9xと,完全な32ビットOSのWindows NTという2種類のWindowsがあり,デバイス・ドライバはこれら2つのWindowsの間で互換性がなかった。信頼性や可用性に優れる,完全な32ビットのWindows NTを普及させたいマイクロソフトは,Windows 95によってアプリケーションを32ビットに移行させ,アプリケーションのWindows NT対応化を進めたが,デバイス・ドライバのWindows NT対応はなかなか進まなかった。

 そこで,Windows 9xとWindows NTのデバイス・ドライバの統一規格である「Win32 Driver Model」が発表された。

 ただ実際には,目標としていたWindows NTとWindows 9xのデバイス・ドライバを,マシン語レベルで完全に統一することはできなかった。これは今でもWindows 9x用,Windows 2000/XP用に,それぞれドライバが提供されていることからも分かる。結局マイクロソフトは「WDM」を,いつしか「Windows Driver Model」と改め,ソース・コード・レベルでの互換性へと内容を変更してしまった。

クラス・ドライバとミニ・ドライバを組み合わせる


△ 図をクリックすると拡大されます
図3●WMDの仕組み
 次に「WDM」によって,デバイスを制御する仕組みを説明していこう。まずWDMでは,大きく2つのドライバを利用する。1つは「クラス・ドライバ(またはポート・ドライバと呼ぶ)」,もう1つが「ミニ・ドライバ(またはミニ・ポート・ドライバと呼ぶ)」である。クラス・ドライバとは,デバイスの種類を特定し,汎用的な処理を受け持つドライバだ。そして,実際にデバイスにアクセスするのが「ミニ・ドライバ」である。一般に,クラス・ドライバはマイクロソフトが提供する。周辺機器メーカーは,クラス・ドライバからの命令をデバイスへとマッピングする「ミニ・ドライバ」の部分を提供するだけでよい(図3)。WDMでは,異なるメーカーのハードウエアでも,種類が同じデバイスなら同じクラス・ドライバの管理下に入る。

 さらに,USBのように機器を階層構造で管理するデバイスの場合には,「バス・クラス・ドライバ」や「バス・ミニ・ドライバ」と呼ぶドライバが存在する。バス・ドライバは,PCIやUSBのように,ほかのデバイスを接続するためのドライバである。

 このような階層構造を持つデバイス・ドライバで重要なことは,下位のミニ・ドライバを上位のクラス・ドライバが抽象化している点だ。これはいわゆる「オブジェクト指向」の考え方である。上位ドライバは抽象的,汎用的な要求を処理し,具体的な処理は下位のドライバに任せる。このような構造を採っているため,さらに上位に位置するアプリケーションからは,物理的な構造を全く意識せずに,データの読み書きを命令できるのである。