ドライバースタックはどうやってできる?
デバイスをアクセスしようとしたときに、必要となるドライバーはどうやって決まるのだろうか?
例えば、USBデバイスがパソコンに装着された場合を考えてみよう。デバイスが装着されたことはUSBコントローラーが検出して、これをWindows側に通知する。この時点で、追加されたデバイスにどうやってアクセスするかが確定する。
これは、USBインターフェースそのもの(例えばExpressカードタイプのUSB 3.0インターフェース)であっても事情は同じで、デバイスが装着されたことが、PCI Express側(ソフトウェア上はPCIとほぼ同じ)から通知されるだけで、接続されたUSB 3.0のコントローラーにどうアクセスするのかは、この時点で決まっている。
そこでWindowsは、新たに接続されたデバイスのためにデバイススタックを構成する。このときに、必要に応じてドライバーがインストールされる。このあたりの処理はPlug&Playマネージャーの担当だ。デバイスドライバーがロードされれば、デバイスドライバー内部の初期化ルーチンが必要な設定をして、内部にある処理関数のアドレスなどをOSに登録していく。
デバイススタックがどう構成されているのかという情報は、IRPのヘッダ部分に登録されている。IRPが作られると、I/Oマネージャーがヘッダを見ながら、必要なドライバーを順次呼び出していく(図4)。
カーネルモードドライバーと
ユーザーモードドライバー
Windowsのドライバーには、大きく「カーネルモードドライバー」と「ユーザーモードドライバー」がある。なぜ2種類あるのかというと、カーネルモードではプログラム上の小さなミスが、システム全体のクラッシュを引き起こす可能性があるからだ。そのためカーネルモードで動作させる必要がないなら、デバイスドライバーであってもユーザーモード側で動作させたほうが安全である。
ただしユーザーモード側のドライバーは、カーネルモード側に比べると処理効率が悪くなる。ユーザーモード側は、メモリーアドレスが仮想アドレスであり、必ずしも確保しているメモリーが物理メモリー上にない可能性があること。またスケジューリングにより、必ずしも一定時間内に処理が完了するとは限らない可能性があることなどが原因だ。
そのため、Windows 2000のときに作られたWDM(Windows Driver Model)では、仕組みとしてはユーザーモードドライバーを作れたが、実際にはカーネルモードドライバーのみだっだ。というのも、作成に必要なサンプルやドキュメントが未整備であったり、「何をカーネルモードドライバーとすべきか」という指針もなかったからである。
また、Windowsでのデバイスドライバーは、カーネルのみが実行可能な機能を利用するための仕組みとしても利用されてきたという経緯もあり、カーネルモードドライバーのみが作られる原因ともなった。例えばHDD上のマスターブートレコード(MBR)へのアクセスするためには、カーネルモードからしか利用できない領域を読み出す必要があるが、そのために専用のドライバーが作られるなどしていた。
実際にマイクロソフトが発行していた技術誌「Microsoft System Journal」にも、そのような記事が掲載されていたくらいで、「カーネル機能を使うための方法としてのデバイスドライバー」という使われ方は、かなり頻繁に行なわれていたようだ。
この連載の記事
-
第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の仕事はハードウェアをアプリから「隠す」こと? - この連載の一覧へ