「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。
ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ
この度、Windows XP用デバイスドライバの開発を担当させていただきました。通常のWindowsアプリケーションの開発と、一味の違う経験となりましたので、基本的な知識や注意点を含めて簡単に紹介させていただきたいと思います。
まず、デバイスドライバとは何のことでしょうか?
Microsoft社の説明によると、オペレーティングシステム(以下OS)が、ディスクデバイス、ディスプレイアダプタ、マウスやトラックボールなどの入力デバイス、モデム、FAX、プリンタといったハードウェアを管理するのに使用するコードのことです。
Windowsに限らずLinuxやMac OSなど各種OSにおいても、デバイスドライバは周辺機器を動作させ、OSが周辺機器を制御するための橋渡しを行うために不可欠の存在です。
デバイスドライバを説明するためには、下記Windows XPアーキテクチャイメージから見てみましょう。(Microsoft社WDKドキュメントの図を元に一部変更)
図1. Windows XPアーキテクチャ
ソフトウェアの動作モードには、ユーザーモードとカーネルモードが含まれています。弊社で多く開発してきたアプリケーションやDLLなどは、ユーザーモードで動作するソフトウェアです。
一方、デバイスドライバはカーネルモードのソフトウェアで、IOマネージャを介してユーザーモードの上位ソフトウェアとのやり取りを、HAL(Hardware Abstraction Layer)を介してハードウェアとのアクセスを行います。また、直接データをやり取りする手段を持たないデバイスドライバに対して、IOマネージャが「IRP(I/O Request Packet)」と呼ぶ通信を行い、データのリクエストと応答を実現しています。
メモリのみアクセス可能で周辺装置へのアクセスが制限されるユーザーモードに対して、カーネルモードは周辺機器、メモリ、IO空間の全てにアクセスが可能です。そのため、デバイスドライバはアクセスが制限されていない反面、システムに影響する動作も実行できてしまい、システム破壊につながるリスクもあります。十分に注意を払いながら開発を進める必要があります。
デバイスドライバの開発には、開発対象となるハードウェアはもちろんのこと、PCなどのハードウェア環境と開発用ソフトウェア一式が必要です。
デバイスドライバの開発は、デバイスドライバが動作するシステムと違うシステム上で開発する「クロス開発」で行うのが基本です。
そのため、開発環境と実行環境2台のPCが必要となります。コンパイル・ビルドおよびデバッグを行うPC環境を「ホスト環境」、実際にハードウェアを設置し、ドライバを動作させるPC環境を「ターゲット環境」と呼びます。
図2. クロス開発環境
2台のPCの間に、シリアルクロスケーブルで、若しくは専用USBデバッグケーブルで接続することとなります。しかし、残念ながら、要件を満たすUSBデバッグケーブルは日本国内では発売されていないため、USBポートでデバッグする場合は海外からケーブルを購入する必要があります。また、シリアルポートでデバッグする場合でも、ターゲット環境にUSB-RS232C変換ケーブルが利用できません。
Microsoft から無償で提供されるDDK (Driver Development Kit) /WDK (Windows Driver Kit) を使用して開発することとなります。ドライバ開発に必要なコンパイラとデバッガ、ヘルプ・サンプルソースおよび各種ツールが含まれています
下表のように、DDK/WDKのバージョンによってサポートするホスト環境/ターゲット環境が異なります(各OSサービスパックの詳細を省略させていただいています)。本質的に違いがありませんが、バグ修正済み・機能向上やサンプル・ドキュメント・ツールが充実している理由から、最新版WDKの使用が勧められています。また、Window2000用のドライバを作成したいなど特別の事情がない限りは、最新版Windows7用のWDKを利用するのが一般的です。
開発キット | ホスト環境 | ターゲット環境 | |
---|---|---|---|
DDK for Windows Server 2003 SP1 | Windows Vista Windows Server 2003 Windows XP Windows 2000 |
Windows Vista Windows Server 2003 Windows XP Windows 2000 |
|
WDK for Windows Server 2008 SP1 (6001.18002) |
Windows Server 2008 Windows Vista Windows Server 2003 Windows XP |
Windows Server 2008 Windows Vista Windows Server 2003 Windows XP Windows 2000 |
|
WDK for Windows 7 RTM (7600) | Windows 7 Windows Server 2008 Windows Vista Windows Server 2003 Windows XP |
Windows 7 Windows Server 2008 Windows Vista Windows Server 2003 Windows XP |
表1. 開発キットサポート環境
開発環境一式を揃ったところで、いざデバイスドライバの開発を始めようとしたところ、どこから着手すれば良いでしょうか?
ここから、開発の流れと手順を簡単に紹介させていただきます。
デバイスドライバの開発は、何もかも一から自力で作成する必要がありません。前述のように、開発キットであるWDKには大量のサンプルソースが含まれています。その中から、開発対象に一番近いサンプルを見つけて不要なコードを削除して、ベースとして開発をスタートするのが早いです。
たとえばUSBドライバを開発する場合、「usbsamp」サンプルをベースとして利用すれば、ドライバエントリーやデバイス初期設定をそのまま流用でき、データ読み書き機能だけを開発対象のUSBハードウェアに合わせて書き直せばいいです。また、今回担当させていただいたPCIバスのドライバに関しては、「pcidrv」サンプルの初期化設定・電源管理やDMA転送などの機能を流用してアレンジすることで開発がスムーズに進めることができました。
デバイスドライバは上位ソフトウェアとIRP通信することでデータのやり取りを行います。この場合、上位ソフトウェアからは、下記5つのAPIしか使用できません。
そのため、すべての制御や問合せ処理を上記インターフェースのみで実現しなければなりません。また、APIが呼び出された場合、デバイスドライバは上位ソフトウェアからIRP要求を受け付け、処理が完了した後、IRP要求に対して実行結果やデータを応答するように作成する必要があります。IOコントロールだけでもデータの書き込みができ、すべての処理を実現できますが、大量のデータを頻繁に扱う場合はReadFile/WriteFileインターフェースを利用すると効率的です。
一方、デバイスドライバからハードウェアへの制御は、開発キットで提供されるレジスタ読み書きやDMAコントロールのインターフェースを呼び出すことで実現できます。また、下位ドライバが存在する場合(USBデバイスの場合はUSBバスコントローラドライバ、PCIデバイスの場合はPCIバスコントローラドライバに当たる)、デバイス初期化や電源管理などの処理を下位ドライバへ通知し、行ってもらうことだけで作成できます。
ドライバのソースコードを作成した後、ファイルパスや設定を記述するmakefileとsourcesファイルを用意し、開発キットのビルド環境で実行すればよいです。ただし、ターゲット対象のWindowsバージョンとCPUに合わせてビルド環境を選択することを注意しなければなりません。
また、WDK for Windows 7 RTMから「OACR(Windows Auto Code Review)」というツールが提供されていて、ビルド完了後、内在している問題点をリストアップしてくれますので、バグの発見に役立ちます。
デバイスドライバファイル(*.sysファイル)を作成して動作させたいと思いますが、その前にターゲット環境へセットアップするステップがあります。
そのため、デバイスドライバのベンダID/プロダクトIDおよびコピー先のパスなどの情報を含む設定ファイル(*.infファイル)を作成しておく必要があります。設定ファイルを作成したら、デバイスマネージャを起動し対象ハードウェアのドライバソフトウェアの更新を行い、デバイスマネージャに問題なく反映されたら成功です。
難しいと思われるデバイスドライバの開発は、開発キットを上手に利用できれば思ったよりずっと簡単です。しかし、それはただ動くだけのデバイスドライバの話です。今回は、実際の開発を通じて、開発用の知識以外もコミュニケーション能力が求められていることを痛感しました。
冒頭で紹介させていただいたように、デバイスドライバはハードウェアを制御するための橋渡しであり、上位ソフトウェアに機能を提供するための存在です。その意味では、ハードウェア開発側との連携が不可欠です。ハードウェアにどのようなIOやレジスタが実装されている?割り込みやDMA転送機能が具備されている?などなどの資料やデータシートを提供してもらい、ハードウェア仕様を理解したうえで、初めてデバイスドライバの開発が進められるようになります。
そのため、ハードウェア設計完了の段階からデバイスドライバの開発をスタートさせるのが望ましいです。しかし、現実的にそれを実現するのが難しく、今回の開発でも、諸事情によりハードウェアの設計と平行でデバイスドライバ・上位ソフトウェアの開発を進めました。結果からみると、認識の不一致や仕様の変更などで無駄な作業がどうしても生じましたが、打合せや仕様の検討などを頻繁に実施することで要求仕様に満たす製品とすることができました。
ハードウェアとソフトウェアの間に位置づけるデバイスドライバの開発には、割り込み処理やDMA転送を正しく扱うハードウェアの知識とOSやアプリケーションに関わるソフトウェアの知識が要求されています。幸い、弊社にはWindowsアプリケーションおよび組み込みソフトウェアの開発実績があります。私自身も入社してから両方の開発を担当させていただいたおかげで、大きな問題がなく開発を進められるようになりました。
ほかに、意外なことで英語力も非常に要求されています。開発キットに含まれるドキュメントやサンプルのコメントは英語のみとなっています。また、デバイスドライバ開発に関連する資料や情報が英語で記載されているものがほとんどです。今回の開発では、必要の情報を検索し確認するためにも一苦労しました。
拙い文章ですが、今回の開発を通じて経験させていただいた内容を一通り紹介させていただきました。
Windowsデバイスドライバの開発は、Microsoft社の開発キットを利用することで煩雑の処理を簡略化することができ、だいぶ楽になります。しかし、一方、Windowsの仕組みとハードウェアの仕様を十分に理解したうえで開発を進める必要があります。
(R.R.)
関連ページへのリンク
関連するソフテックだより