ハードウェア製品の動作を支えるデバイスドライバー開発
こんにちは、小野です。
普段はあまり意識しませんが、PCに接続した機器、たとえばキーボードやマウス、プリンターなどを使えるようにするために欠かせないのが、デバイスドライバーです。
今回は、「デバイスドライバーってそもそも何?」「なんのために必要なの?」という疑問にお答えしながら、OKIアイディエスがデバイスドライバーを開発する際に重視しているポイントをご紹介します。
ハードウェアの仕様整理から設計、実装、検証、署名取得まで、どのような工程で開発を進め、製品の品質や安定性を確保しているのかを解説していきます。
PCにカメラやプリンターを接続すると、アプリケーションのインストールに加えて、ドライバーのインストールを求められることがありますよね。あれって、何のために必要なんですか?
簡単に言うと、デバイスドライバーはOSとハードウェアの間を橋渡しするソフトウェアなんだ。
機器を動かすには、OSだけでも、ハードウェアだけでも足りない。そこでドライバーが、OSから受け取った指示をハードウェアが理解できる形に変換し、機器の入出力を制御しているんだよ。
なるほど。ユーザーが操作するアプリケーションからの指示が、OSとデバイスドライバーを経由してハードウェアに伝わるんですね。
そう。ハードウェアごとに、レジスタの構成やデータの転送方法、初期化の手順などが異なるから、OSに組み込まれた標準ドライバーだけでは機器を制御できないこともあるんだ。
そんなときは、ハードウェアメーカーが機器の仕様にあわせて専用のデバイスドライバーを開発するんだ。OSによって内部構造やドライバーの仕組みも異なるから、対象とするOSの仕様を確認したうえで設計する必要があるよ。
へぇ、デバイスドライバーを開発するときは、ハードウェアの仕様だけでなく、対象とするOSの仕組みも理解しておくことが大切なんですね。OKIアイディエスでも、こうした開発をしているんですか?
うん。OKIアイディエスでは、ハードウェアの仕様整理から、デバイスドライバーの設計、実装、検証や署名取得まで、受託開発として行っているよ。
デバイスドライバーは、Linux、macOS、Androidなど、OSによって開発の考え方や必要な技術が異なる。今回は、PCのOSとして広く利用されているWindowsを例に、デバイスドライバーの役割と、OKIアイディエスがどのような工程で開発しているのかを解説していくよ。
デバイスドライバーがハードウェア製品の動作を支える仕組み
デバイスドライバーって、OSとハードウェアの間をつなぐソフトウェアだと教えてもらいましたが、もう少し具体的な役割を知りたいです。
アプリケーションは、通常、ハードウェアを直接操作するのではなく、OSが提供する仕組みを介して機器を動かしているんだ。そのOSとハードウェアの間で、デバイスドライバーが機器ごとの制御方法にあわせて、データの受け渡しや入出力処理を行っている。つまり、アプリケーションからの指示をハードウェアに伝え、ハードウェアから受け取ったデータをOSやアプリケーションに渡す役割を担っているんだよ。
つまり、ユーザーはアプリケーションを操作しているだけでも、その裏側ではデバイスドライバーがOSとハードウェアの間でデータをやりとりしているんですね。
そう。たとえば、ユーザーがキーボードを押すと、キーボードから入力された情報がキーボードドライバーを経由してOSに伝わり、アプリケーションで利用できるようになる。
アプリケーションから印刷を指示した場合は、プリンタードライバーが印刷データをプリンターが処理できる形式に整え、プリンターへ送信する。カメラでは、キャプチャードライバーが映像データを受け取り、アプリケーションへ渡す。サウンドドライバーは、アプリケーションから受け取った再生データをオーディオ機器へ送り、音声を再生するんだ。
なるほど!ユーザーが意識しないところで、機器ごとに異なるデータの受け渡しや制御をドライバーが担っているんですね。デバイスドライバーは、ハードウェア製品をOS上で安定して動作させるための土台なんですね。
安全性と安定性を支えるWindowsのユーザーモードとカーネルモード
デバイスドライバーがどのような役割を担っているのか理解できました。次は、Windows向けのデバイスドライバーをどのように開発するのか知りたいです。
その前にWindowsの動作構造について説明しておこう。Windowsの構造を理解すると、デバイスドライバーがなぜ必要なのか、どの領域で動作するのか、どのような点に注意して開発するのかが見えてくるんだ。
そういえば、Windowsって普段から使っていますが、内部の構造について考えたこともなかったです。どうなっているんだろう。ぜひそこのところを教えてください。
オッケー!Windowsは、大きくユーザーモードとカーネルモードに分かれて動作しているんだ。
それぞれどんなものなんですか?あと、なぜ2つのモードに分かれているんですか?
ユーザーモードは、一般的なアプリケーションが動作する領域で、OSの中核機能やハードウェアへの直接的なアクセスが制限されている。一方、カーネルモードは、OSの中核機能や一部のデバイスドライバーが動作する、より大きな権限を持つ領域なんだ。
なるほど。アプリケーションとOSの中核機能を、異なる領域で動かしているんですね。
そう。2つのモードに分かれているのは、安全性と安定性を保つためだね。ユーザーモードのアプリケーションで問題が起きても、影響をそのアプリケーションの範囲に抑えやすい。一方、カーネルモードで問題が起きると、OS全体に影響し、システム停止やブルースクリーンにつながる可能性があるんだ。
なるほど!Windowsを安全かつ安定して動かすために、処理を実行する領域を分けているんですね。デバイスドライバーの開発では、この構造を理解しておくことが重要なんですね。
そのとおり。特にカーネルモードで動作するデバイスドライバーは、ユーザーモードのプログラムよりも、処理の正しさや複数の処理の同期、メモリーの扱いを慎重に設計する必要があるんだ。
OKIアイディエスでは、こうしたカーネルモード特有のリスクを踏まえ、ハードウェアの仕様やデータの流れを確認しながら、ドライバーの設計と検証を進めている。これにより、製品を安定して動作させるための品質確保につなげているんだ。
次は、この構造の中でデバイスドライバーがどの領域で動作するのかを見ていこう。そうすると、ドライバーの役割がさらにわかりやすくなるよ。
専用デバイスドライバーが必要になる場面
最初に話していたように、PCにはさまざまなデバイスドライバーがあらかじめ組み込まれていますよね。どのような場合に、専用のデバイスドライバーをインストールする必要があるんですか?
たとえば、プリンターやPCI Expressボードなど、新しいハードウェアをPCに追加したときだね。
OSに、そのハードウェアを制御する標準ドライバーが組み込まれていれば追加のドライバーをインストールせずに使える場合もある。一方で、機器固有の制御が必要な場合は、専用ドライバーを用意する必要があるんだ。
具体的には、I/Oレジスターの操作、割り込み処理、データ転送の制御、ハードウェアの状態監視などがある。これらの処理方法はハードウェアごとに異なるため、機器の仕様に合わせてドライバーを設計しなければならない。
USBメモリーのように、OSに組み込まれた標準ドライバーで動作する機器もありますが、機器特有の制御が必要なハードウェアには、専用ドライバーが必要になるんですね。
そう。OSに、そのハードウェアを制御するドライバーが組み込まれていない場合は、ハードウェアメーカーが専用ドライバーを開発して提供することになる。OKIアイディエスでは、専用ドライバーの開発にあたり、ハードウェアの仕様やデータ転送方法、割り込み処理などを確認し、製品の要求に沿って設計・実装・検証を進めているんだ。ハードウェアの仕様が固まる前の段階でも、ドライバー開発に必要な条件を整理しながら、仕様の整合を図っていくことができるよ。
品質を確保するためのデバイスドライバー開発環境と準備
Windowsの構造についても少しずつわかってきました。実際にデバイスドライバーを開発するとなると、何から始めればいいんでしょう?
デバイスドライバーの開発には、ユーザーモードのアプリケーション開発とは異なる手順・開発環境や検証手順が必要だよ。
特に、ハードウェアの仕様を正しく理解し、専用の開発ツールやテスト環境を準備することが重要なんだ。必要なものを、開発の流れに沿って整理してみよう。
- デバイス仕様書
制御対象となるハードウェアの仕様を確認する。
(例:レジスタ、割り込み、通信方法、初期化手順…etc)
- 開発環境
ドライバーを作成・ビルド・検証するための環境を準備する。
(Windows のバージョン、管理者権限、必要な SDK/ツール類…etc)
- WDK(Windows Driver Kit):
ドライバー開発に必要なヘッダーファイル、ライブラリ、サンプル、ビルド用のツールなどを含む開発キット。
- Visual Studio
ソースコードの編集、ビルド、デバッグを行う統合開発環境(IDE:Integrated Development Environment)。
- テスト用PC
開発したドライバーをインストールし、実際のハードウェアを接続して動作を確認するためのPC。
- デバッグツール:
ドライバーの動作を確認し、問題が発生した場合に原因を調査するためのツール。WinDbgなどを使用する。
- 署名に関する設定と手続き
開発中のドライバーをテスト環境へインストールするためのテスト署名や、製品として配布するための正式な署名について確認する。
いろいろな準備が必要なんですね。
ところで、署名設定って?サインでも必要になるんですか?
名前を書くサインとは違うんだ。デバイスドライバーの署名は、ドライバーの発行元や改変されていないことを確認するための電子署名だよ。
開発したデバイスドライバーが、Microsoftの認証テストにPassしていることが証明される。すると、OSにデバイスドライバーをインストールすることができ、ハードウェアを認識することができるんだ。
署名は、ドライバーをお客様の製品に組み込み、利用者のPCへ安全にインストールするための重要な工程だよ。大きなポイントになるから、後で詳しく説明しよう。お楽しみに!
品質と安定性を確保するデバイスドライバー開発の流れ
実際にデバイスドライバーを開発するときは、どんな流れで進めるんですか?
まずは、お客様が実現したい機能や性能、ハードウェアの制御方法、動作対象とするOSなどを整理するんだ。その後、設計、実装、ビルド、検証、評価、署名取得へと進めていく。
この中でも、開発の方向性を決める要件整理と、品質や安定性を確認する検証が特に重要だよ。流れを表にまとめてみた。
| No |
工程 |
実施内容 |
| 1 |
要件整理 |
機能/性能、装置制御、省電力管理、対応OSを確認 |
| 2 |
設計 (INF・ドライバー) |
INFファイル、構成の設計(ドライバースタック、インストール方法を決定 |
| 3 |
ドライバーを実装 |
初期化、I/O制御、割り込み、同期、メモリー管理を実装 |
| 4 |
ビルド |
WDK/Visual Studioでビルド |
| 5 |
テスト署名を付与 |
テスト環境に導入するためのテスト署名を付与 |
| 6 |
検証 |
テスト環境でWinDbg、Driver Verifierなどで検証
問題を解析・修正と再検証
|
| 7 |
評価 |
設計した機能/性能の確認 |
| 8 |
正式署名取得 |
認証テストの実施、Microsoftへ署名申請/署名付与 |
要件整理と検証は、どういうところが重要なんですか?
- 機能要件:ドライバーにどのような機能を実装するのか
- 性能要件:処理速度や応答性など、製品にどのような性能が求められるのか
最初に「どのような機能が必要か」と「製品にどのような性能が求められるか」を明確にするんですね。
そう。ここが曖昧だと、後の設計や実装で判断が分かれたり、開発の途中で仕様を見直したりすることになる。だからOKIアイディエスでは、開発の初期段階でお客様の要求を確認し、機能と性能の目標を具体化しているんだ。
それから、検証では主に3つの観点で確認するんだ。
- 品質検証:異常時の処理、同時処理の時に問題が起きないかを確認
- 性能検証:要求通りの性能が出ているか。動作時のCPU負荷やメモリー使用量に問題がないかを確認
- 安定性検証:長時間動作させても問題が起きないかを確認
なるほど。ドライバーは単に機器が動けば良いというわけではなく、機能、性能、異常時の動作、長時間動作時の安定性まで確認することが重要なんですね。問題が発生した場合は、ログなどから原因を調べるのでしょうか?
そう。もし問題が発生した場合は、デバッグによって原因を究明する。原因を特定したうえで、ドライバーを修正し、再度検証するんだ。
次は、デバイスドライバーの開発とデバッグで特に注意するポイントを解説するよ。
不具合を未然に防ぐ設計と原因を追跡するデバッグ
カーネルモードで動くデバイスドライバーに不具合が起きると、システムの停止やブルースクリーンにつながることがある。だから、まずは不具合が起きないように、処理の正しさや複数の処理の同期、メモリーの扱いを慎重に設計し、十分に検証することが重要なんだ。
そのうえで、どれだけ慎重に設計・検証しても、すべての不具合を完全に防げるとは限らない。万一問題が発生した場合に備え、原因を追跡できるログ設計やダンプ解析の仕組みも、開発の初期段階から組み込んでおく必要があるんだよ。
PCを使っているときに、何度かブルースクリーンになったことがあります。あの状態では、ユーザーからはどう復旧していいか全くわからないですよ。不具合を防ぐため、また発生した場合に調査するためには、どのような点に注意するんですか?
まずはログ設計を最初から考えておくこと。ログ設計とは、不具合発生時にどのタイミングでログを取得するのか、どこに記録するのか、どのレベルのログを残せるようにしておくのかを考えて、デバイスドライバーにログ機能を組み込んでおくことなんだ。
カーネル障害が発生したとき、処理がどこまで進んでいたのか、内部で異常が発生していたのかを確認できれば、原因の特定に役立ちますね。
OKIアイディエスでは、メモリー上にリングバッファを作成し、そこに実行処理のログを蓄積しているよ。障害が発生した場合は、そのログをダンプから回収して解析しているんだ。
print文を使ったログ設計だと、print文の出力負荷により、処理の実行タイミングが変わってしまい、現象が再現しなくなることもある。そのため、処理への影響を抑えやすいメモリー上のログを活用しているよ。
さらに、ログだけでは原因を特定できない場合もある。そうした場合は、WinDbgを使ってクラッシュダンプやメモリーダンプを解析し、停止した箇所やメモリーの状態、処理の流れを確認するんだ。
OKIアイディエスが提供するデバイスドライバー開発
OKIアイディエスでは、デバイスドライバー開発にも力を入れているんですね。ハードウェアの仕様整理から設計、実装、検証、署名取得まで、幅広い知識と工程が必要になります。アプリケーション開発とは異なる専門性が求められるため、社内に必要な知識や開発環境がそろっていない場合、開発を進めることが難しいケースもあります。
そうなんだ。OKIアイディエスでは、ハードウェアの仕様が固まっていない段階からデバイスドライバー開発のご相談をいただくこともあるよ。
その場合は、ハードウェアの制御方法やデータ転送の条件、割り込み処理などを確認し、デバイスドライバーに必要な仕様を整理するところから進めている。開発初期にハードウェアとドライバーの仕様をすり合わせることで、後工程での手戻りを抑えやすくなるんだ。
いくつか開発例を紹介しよう。
たとえば、PCI Express用 DMA ドライバー開発があるよ。PCI ExpressのバスマスターDMAを利用して、ハードウェアとメインメモリーの間で高速にデータを転送するドライバーを開発している。アプリケーションが使用するメモリー領域を活用することで、大容量データを効率よく転送できるんだ。
高速なデータ転送が求められる画像処理や計測装置などに活用できそうですね。他に開発例はありますか?
それからGigE Visionカメラ用の受信ドライバー(フィルタードライバー)も開発しているよ。これは、ネットワークドライバースタック上で画像パケットを処理するフィルタードライバーなんだ。
画像データをアプリケーションへ渡す経路を設計し、データコピーの回数を抑えることで、CPU負荷の軽減や高速な画像取り込みにつなげている。
ハードウェアの仕様だけでなく、Windows内部のデータ処理や性能まで考慮して設計しているんですね。
そう。ほかにも開発事例があるので、デバイスドライバーの開発を検討している方は、ぜひお問い合わせください。
OKIアイディエスでは、Windows向けデバイスドライバーの要件整理、デバイスドライバーの設計、実装、検証、署名取得まで、開発工程に沿って進めることができます。
ハードウェアの仕様を確認し、製品に必要な機能や性能を整理したうえで、実機を使った検証や不具合の原因解析まで行えることが強みです。単にドライバーを動作させるだけでなく、お客様の製品に組み込み、安定して利用できる品質を目指して開発しています。
最後に
さて、今回は、普段は意識しないけれど、PCに接続したハードウェアを動かすうえで欠かせないデバイスドライバーを解説したよ。
デバイスドライバーは、OSとハードウェアの間でデータを受け渡し、機器を制御するソフトウェアなんだ。OKIアイディエスでは、ハードウェアの仕様整理から設計、実装、検証、署名取得まで、製品の要求に沿って開発を進めているよ。
後で説明するって言っていたデバイスドライバーの署名って…?
色々説明していたら、長くなったので話しきれなかったんだ…。署名ってただサインを書くとかではなく、実は奥が深いんだ。
でしたら、次回のブログで、デバイスドライバーの署名の考え方や具体的にどのように進めるのかを詳しく紹介してください!お願いします!!?
もちろん!Windowsデバイスドライバーの配布や署名取得について知りたい方は、ぜひ次回もチェックしてね!
そうそう、当社主催のWebセミナーでデバイスドライバー開発の基礎と全体像について解説したときのアーカイブ動画がYoutubeで公開されたんだよ。
こちらの動画も要チェックですね!
当ブログで説明しきれなかった部分も説明しているので、気になる方は上記YouTubeリンク先からぜひご覧ください!
次回のブログ更新は10月を
予定しています。お楽しみに!
- ※記載されている会社名、製品名は、各社の商標または登録商標です。
- ※ここに記載されている仕様、デザインなどは予告なしに変更する場合があります。