こうした構造は、現在のハードウェアではごく普通であり、そのためデバイスドライバーを何段も重ねて処理させる「ドライバースタック」、あるいは「レイヤードドライバー」という仕組みが導入されている(図3)。
これは、あるデバイスに必要なドライバーを連続して実行させるような仕組みになっており、キーボードを読み出したいのなら、前記のような順番でドライバーを実行して、接続しているデバイスへとコマンドを送ったり、データを読み書きする。
全体をひとつのドライバーにしてしまわずに、レイヤー構成に分けるのは、個別のデバイスは変更される可能性もあるからだ。例えばUSBの場合、現時点ではUSB 2.0ホストとUSB 3.0ホストがあり、同じUSBでも違うコントローラーを使ってアクセスしなければならない。レイヤー状の構成にしておけば、接続先によってUSBホスト部分は2.0か3.0ドライバーを変えるかわりに、他の部分は同じドライバーが利用できるようになる。
また、同じFATファイルシステムを使うストレージでも、USB接続のHDDもあれば、SATA接続やIEEE1394接続という可能性もある。ドライバーをレイヤー状にしておき、実際の接続に合わせてドライバースタックを構成することで、さまざまな接続やデバイスの組み合わせに対処できるようになるわけだ。
実際には、このドライバースタックに含まれるドライバーは、前述のクラスドライバーとミニポートドライバーである。どちらもレイヤー状に積み重なるように、一連のドライバーのつながりとして動作するようになっている。
層構造のドライバーを動かす仕組み
DDIとIRP
こうしたレイヤー状のドライバーのつながりを実現するためには、デバイスドライバーの被制御側(ドライバー自体を制御するインターフェース、OS側)と、ドライバーの制御側(デバイス側、下の層を制御するためのインターフェース側)がお互いに、きちんと接続できるようになっていなければならない。ちょうどブロック玩具で差し込む側と差し込まれる側の凹凸が、一致しているような感じだ。コネクターのオスメスのような関係と言ってもいい。このドライバー同士の接続の仕組みを、Windowsでは「DDI」(Device Driver Interface)と読んでいる。
そして、統一的にドライバースタックを動かすためにWindowsが採用した仕組みが、「IRP」(I/O Request Packet)である。IRPはデバイスを制御するためのコマンドなどを格納する、ひとまとまりのデータだ。各ドライバー間でIRPの中身を解釈して実行していくことで、ドライバースタックを順次実行していく仕組みとなっている。
イメージ的には、上流からパケットを渡されたらこれを処理して、下のドライバーに回すという感じだ。名前が「パケット」なので、このデータがドライバースタックという経路を流れていくようなイメージがあるが、実際にはIRPはコピーされたりはせず、メモリーのある場所から動くことはない。パケット内のデータを示すメモリーアドレスだけが次々と渡されていく。
こうした処理を行なうのが、Windowsのカーネルモードで動作する「I/Oマネージャー」だ。またデバイス自体の管理は、「Plug&Playマネージャー」が担当している。デバイスが装着・着脱されたというイベントを受け取り、ドライバースタックがどうなるかを組み立てるのがその役目だ。
Windowsのドライバーは、大きく3つに分類できる。ひとつはデバイスに対応して何らかの機能を実現しているドライバーで、これを「ファンクションドライバー」という。もうひとつは、デバイスが接続されるバス(例えばUSB)を管理するドライバーで、これは「バスドライバー」と呼ばれる。
3つめは「フィルタードライバー」と呼ばれるもので、ドライバースタックの間に入り、ドライバースタックの動作を変更するためのドライバーである。例えば、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の仕事はハードウェアをアプリから「隠す」こと? - この連載の一覧へ