
デバイスドライバをはじめ、デバイスにかかわるお困りごとの際はお気軽にお問い合わせください。
【 デバドラ講座10 : I/Oマネージャ 】
1.I/Oマネージャ
NT Executiveが提供するサービスの中に、I/Oマネージャがあります。ここでは、I/Oマネージャについて説明します。I/Oマネージャ内でドライバは階層構成になっています(図1)。階層は高いレベルの順にファイルシステムドライバ、クラスドライバ、ポートドライバ、ミニポートドライバとなっています。すべてのI/Oリクエストがすべての階層を通過するわけではありません。

ユーザーモードのアプリケーションがハードウェアにアクセスするためには必ずOSを通らなければなりません。OSの中でも、NT ExecutiveのI/Oマネジャーを通る必要があります。アプリケーションはAPI関数(CreateFile, CloseHandle, ReadFile, WriteFile, DeviceIoControl)を呼ぶことでI/OマネージャにI/O操作を要求します。Windows NTシステムでは、アプリケーションから直接ドライバにアクセスすることは許可されていません。必ずAPIを通して行い、このことがシステムの安定性を保つ1つの鍵となっています。
I/Oマネージャはオブジェクトをベースとして構成されています。ここでのオブジェクトはカーネル、HAL、I/Oマネージャによって生成されます。I/Oマネージャにおいて、最も使われるオブジェクトについて表1に示します。
オブジェクトの種類 | 説明 |
---|---|
ファイルオブジェクト | ファイルオブジェクトが生成されると、オブジェクトへのハンドルが作成元のアプリケーションに返されます。 |
ドライバオブジェクト | I/Oマネージャがドライバを最初に起動する際に、I/Oマネージャによって生成されます。ドライバがロードされている場所、ドライバのサイズ、そして主要なエントリポイントが記述されています。 |
デバイスオブジェクト | I/O操作が行える物理デバイス、もしくは論理デバイスが記述されています。Windows NTでは、このオブジェクトはドライバ自身によって生成されます。 |
割り込みオブジェクト | I/Oマネージャによって生成されます。ドライバの割り込みサービスルーチンに接続するために使われます。 |
アダプタオブジェクト | すべてのDMAドライバで使用されます。このオブジェクトはHALによって定義されています。 |
Windows NTのI/Oマネジャーは非同期I/Oを使うことができます。同期I/Oと非同期I/Oの違いを図2に表します。同期I/O処理では、I/O操作の要求が出されたスレッドは、I/O操作が終了するまでそのスレッドはブロックされます。非同期I/O処理は、I/O操作の要求が出されたスレッドは他の処理を重ねて実行することが可能です。この非同期I/O処理では、単体のスレッドが複数のI/O操作を同時進行で実行することができます。

参考資料
- 「NTドライバプログラミング」
- Peter G. Viscarola、W. Anthony Mason著 久保雅俊、三浦秀朗訳 サイエンスパーク株式会社 監修
- Windows NTデバイスドライバプログラミング」
- アート・ベーカー著 WinProgDDK ML和訳プロジェクト訳