ハードウェア製品の動作を支えるデバイスドライバー開発(後編)
こんにちは、小野です。
前回のブログ記事では、デバイスドライバーの役割や、Windowsのユーザーモードとカーネルモード、専用ドライバーが必要になる場面、開発環境などについて紹介しました。前編をまだご覧になっていない方はぜひこちらもご覧ください。
前回ご説明したように、デバイスドライバーは、OSとハードウェアの間をつなぎ、アプリケーションやOSからの要求に応じて、ハードウェアを制御するソフトウェアです。
後編ではいよいよ、Windowsデバイスドライバーの具体的な開発方法に迫ります。設計、実装、テスト、デバッグ、認証テスト、デジタル署名の取得まで、実際の開発工程に沿って解説します。最後に、OKIアイディエスが開発したPCI Expressボード向けDMA制御ドライバーの事例を紹介します。
本編の最後に、番外編としてぐんまプログラミングアワード2026の出展報告もありますので、ぜひ最後までご覧ください。
Windowsデバイスドライバー開発の全体像
前編では、デバイスドライバーの役割や、開発に必要な環境について教えてもらいました。実際の開発の流れについてもっと詳しく教えてください!
OK!Windowsデバイスドライバーの開発は、大きく分けると、設計、実装、テスト、リリースの4つのフェーズで進める。下の図を見てほしい。

前回のブログでも解説してくれましたが、まず設計フェーズでは、製品に求められる機能や性能、ハードウェアの制御方法を整理し、ドライバーの構成を決めます。アプリケーションに対して、「どのような機能を提供する必要があるか」「どのような性能が求められるか」を明確にするんですよね。
実装フェーズでは、Visual StudioとWDK(Windows Driver Kit)を使って、I/O処理や割り込み処理、DMA処理などを実装するんだ。
テストフェーズでは、INFファイルを作成してドライバーをインストールし、実機で動作を確認する。問題があれば、WinDbgなどを使って原因を調査し、ドライバーを修正するよ。
リリースフェーズでは、認証テストを実施し、Microsoftの署名を取得する、と前回解説してくれました。この署名が何なのか知りたいんですよ。
まあまあ、慌てなさんな。製品としてドライバーを配布する場合は、対象となるWindowsのドライバー署名要件を確認し、必要なテストや申請を行ったうえで、Microsoftによる署名を取得する必要があるんだ。後で詳しく紹介するので、まずは各開発工程について順番に説明していこう。
設計フェーズで決めること
そういえば前回、要件整理では、「どんな機能を実装するのか」「データの処理速度や応答性として何が求められるのか」を確認していましたよね。他にはどのようなことを決めるのでしょうか?
そのとおり。他にはたとえば、ハードウェアマニュアルを確認し、レジスタ構造やDMAエンジンの仕組みを把握する。割り込み方式としてMSI(Message Signaled Interrupt)やMSI-Xを使うのか、高速なデータ転送のためにDMA(Direct Memory Access)が必要なのかといった点も検討するんだ。
DMAを使うかどうかも、設計段階で決めるのですね。CPUがデータを1つずつ転送するより、DMAを利用したほうが効率的にデータ転送できる場合もありますよね。
次に、I/O方式を確認する。Memory-Mapped I/Oを使うのか、Port I/Oを使うのかによって、レジスタへのアクセス方法が変わるんだ。
Memory-Mapped I/Oでは、レジスタをメモリー上のアドレスとして扱い、メモリーへアクセスするように読み書きする。一方、Port I/Oでは、I/Oポート専用のアドレス空間を使ってレジスタへアクセスするんだ。
アプリケーションとの通信方式としてIOCTL(I/O制御要求)が必要かどうか、DMAを利用する場合は、バッファサイズやアライメントに制約があるかといった点も確認するよ。
利用する機能だけでなく、その機能を使うために必要な条件まで確認しておくことが大事なんですね。
そのとおり。最後に、I/O処理、割り込み処理、タイマーによる周期処理、キャンセル処理などをどのように構成するのかを設計する。
実装に入る前にドライバーの方向性を決めておくことで、後工程での手戻りも抑えやすくなるんだ。
実装フェーズで行う主な処理
設計が終わったら、ドライバーの実装に進むよ。Visual StudioとWDKを使ってプロジェクトを作成し、ドライバーの土台を用意する。DriverEntryは、Windowsがドライバーを読み込んだときに最初に呼び出すエントリーポイントで、ドライバー全体の初期設定を行うんだ。その後、デバイスをWindowsから利用できるように初期化する処理や、アプリケーションからの要求を受け付ける処理などを実装していくんだ。
アプリケーションからの要求を受け付ける処理とは、どのようなものですか?
データの読み込みや書き込み、設定変更などの要求を処理する部分だね。たとえば、アプリケーションからデータの読み出し要求を受けると、ドライバーがハードウェアへ指示を出し、取得したデータをアプリケーションへ渡すんだ。
なるほど。ドライバーは要求の内容に応じてハードウェアを制御し、処理が完了すると、その結果やデータが、アプリケーションへ返されるんですね。

さらに、ハードウェアで処理が完了したことをOSへ通知するために、割り込み処理も実装するんだ。割り込みが発生すると、まず割り込みハンドラーが実行される。割り込みハンドラーは実行優先度が高く、ほかの処理への影響を抑える必要があるため、必要最小限の処理だけを短時間で実行し、残りの処理は割り込み処理の終了後に実行するんだ。

割り込みが発生したときの処理を分けることで、システム全体への影響を抑えているんですね。
そのとおり。ドライバーの実装では、初期化処理から、アプリケーションとの通信、割り込み対応、タイマー周期処理、キャンセル処理まで、ハードウェアの仕様に応じて実装する必要があるよ。
テストとデバッグで品質を高める
ドライバーが実装できたら、今度はテストですよね。どのようにテストするのでしょうか?
まず、INFファイルを作成する。INFファイルは、ドライバーをWindowsへインストールする方法を定義する設定ファイルだよ。そうそう、業務用PCへ検証前のドライバーをインストールしてはいけません。バグがあると、PCが起動しなくなることもあるからね。気を付けて。
そういえば、前編ではログ設計について説明してくれましたよね。処理の開始や完了、エラーの発生などを記録しておけば、どこまで処理が進んでいたのか、確認しやすくなるって。
だから、ログ設計は重要なんだ。デバッグはWinDbgというツールを使うよ。WinDbgでは、クラッシュ時に取得したダンプファイルを解析し、システムが停止した箇所やメモリーの状態、処理の流れなどを確認できるよ。開発中は、ドライバーを修正し、再度ビルド、インストール、動作確認を行う。この作業を繰り返しながら、品質を高めていくんだ。
製品提供に欠かせないデジタル署名
いよいよ、開発工程も終盤に差し掛かってきました。前回のブログの最後で、デバイスドライバーの署名について詳しく説明すると予告していたのでずっと気になっていました。署名とは、具体的にどのようなものなのでしょうか?
デバイスドライバーの署名は、ドライバーの発行元やドライバーが改変されていないことを確認するための電子署名だよ。名前を書くサインとは違うんだ。
そりゃそうだよ。Windowsでは、製品として配布するカーネルモードドライバーに署名が求められる。未署名のカーネルモードドライバーは、通常の環境では読み込めないんだ。そのため、製品としてドライバーを提供するには、Windowsの要件に沿った署名を取得する必要があるんだ。ドライバーの種類や配布方法によって、必要な申請や手続きは異なるよ。
開発途中では、その署名は取得できないということですか?それだと、デバイスドライバーの動作確認はできないですよ。
その点は心配ないよ。開発中にドライバーをテスト環境へインストールするためには、テスト署名を使うんだ。
つまり、テスト署名を付与したドライバーをテスト用PCへインストールして検証するんですね。
テスト署名は開発・検証用であり、製品として配布するドライバーには使用できないんだ。製品として配布する場合は、対象となるWindowsの要件を確認し、必要な認証テストの結果やEV証明書を提出して、申請を行ったうえで、署名を取得する必要があるんだ。
EV(Extended Validation)証明書とは、厳格な本人確認を経て発行される証明書で、ドライバー署名に関する手続きで使用される場合があるんだ。必要な証明書や申請方法は、対象となる署名方式やMicrosoftの最新要件を確認する必要があるよ。
また、実際の署名取得に関する手続きでは、タイムスタンプの付与やINFファイルの記載内容の確認も重要になるんだ。
INFファイルはドライバーのインストール方法などが書かれたファイルですよね。タイムスタンプも必要なのはなぜなんですか?
タイムスタンプは、署名がいつ行われたかを証明するためのものだよ。証明書の有効期限が切れた後でも、証明書が有効だった期間に署名されたことを確認できるんだ。
また、Secure Bootが有効な環境では、テスト署名を付けたドライバーは通常の手順で読み込めない場合があるため、注意が必要だね。
開発中にテスト署名で動作していても、それだけでは製品として配布できないんですね。
そのとおり。実装が完了していても、認証テストや署名取得が終わらなければ、利用者の環境へ提供できる状態にはならないんだ。
認証テストで注意すべきこと
認証テストや署名取得では、開発したデバイスドライバーだけでなく、INFファイルや署名に関する情報なども確認されるんですね。
まず、採用するドライバーモデルの設計方針や、Microsoftが定める開発ガイドラインに沿って実装することが重要だよ。
ハードウェアを正しく制御できていても、開発ガイドラインに従っていない部分があると、認証テストに合格しない場合がある。その場合は、設計や実装を見直す必要があるんだ。
開発の最後の段階で不合格が分かると、ショックが大きそうです。手戻りとなって、スケジュールへの影響が心配です。
だから、開発の初期段階から認証テストで確認される項目を把握し、ガイドラインに沿った設計と実装を進めることが大切だよ。
もう1つ注意したいのが、認証テスト環境の事前確認だね。
認証テストやドライバー検証では、ホストPCとテスト対象となるターゲットを接続して試験する構成が必要になる場合がある。接続にはLANを使用することもあるけれど、試験内容によって必要な構成は異なるんだ。条件を満たしていても、実際には通信できない場合がある。そのため、事前に接続を確認し、認証テストを開始できる状態を整えておく必要があるんだ。
テスト環境の準備が整っていないと、ドライバーとは別のところで時間がかかってしまうんですね。
そのとおり。設計の見直しや環境構築に工数が発生したり、スケジュールに影響したりすることもある。署名取得は開発の最後に行う作業だけれど、準備は早い段階から始めておくことが重要だよ。
PCI Expressボード向けDMA制御ドライバーの開発事例
ここまで、設計、実装、テスト、リリースまでの流れを説明してもらいました。ここからは、実際の開発事例を見ていきたいです。
今回は、PCI Express®高速データ転送ソリューション「iDMAC®」を用いた、PCI Expressボード向けDMA制御ドライバーの開発事例を紹介するよ。
iDMACは、CPUやドライバーがデータを1つずつ転送する代わりに、ハードウェアでDMA転送を実行するためのIPですよね。DMAは、CPUを介さずに、PCI Expressボードなどのデバイスとメモリー間でデータを転送する仕組みですよね。

そう。まずアプリケーションからI/O要求が発行されると、ドライバーが転送バッファの準備やアドレスの設定、転送サイズなど、DMA転送に必要な設定を行う。その後、ドライバーがDMAエンジンに転送条件を設定して、転送を開始するんだ。DMAエンジンは、設定されたアドレス情報に基づいて、PCI Expressボードとメモリー間でデータを直接転送するよ。
ドライバーがデータを1つずつ転送するのではなく、転送に必要なバッファやアドレスなどを準備してDMAエンジンを制御し、実際のデータ転送はDMAエンジンが担当するということですね。転送が完了すると、DMAエンジンが割り込みなどでドライバーへ通知するんですね。
そのとおり。これにより、CPUの処理負荷を抑えながら、PCI Expressボードとメモリー間で効率的にデータを転送できるのだよ。
ドライバーは、まずDMAアダプターを取得し、転送対象となるメモリーバッファを管理するんだ。そのうえで、メモリー上の物理アドレスや転送サイズなど、DMA転送に必要なアドレス情報を作成する。メモリーが物理的に連続していない場合は、複数の領域に分かれたアドレス情報をリスト化して、DMAエンジンへ渡すんだ。
メモリーは物理的に連続しているわけではないから、DMAドライバーが分散したメモリー領域を適切に管理し、DMAエンジンが正しくアクセスできるようにする必要があるんですね。
そうだよ。さらに、DMA転送ではメモリー上のアドレス管理だけでなく、CPUキャッシュとの整合性にも注意が必要だ。DMAエンジンはCPUキャッシュを介さずにメモリーへアクセスする場合がある。環境によってはCPUキャッシュ上のデータと実メモリー上のデータに不一致が生じる場合があるんだ。そのため、必要に応じてキャッシュのフラッシュや無効化などの処理をする。
ドライバー側でデータ転送の準備ができたら、実際のデータ転送はハードウェア側のDMAエンジンで実行されるんだ。転送が完了するとDMAエンジンが割り込みを発生させ、ドライバーへ完了を通知するよ。ドライバーは割り込み処理を行い、必要な後処理を実施した後、アプリケーションへ処理完了を通知するんだ。
なるほど。iDMACによるDMA制御は『転送準備 → DMA転送 → 完了通知』という流れで動作しているんですね。DMAエンジンが効率よくデータを転送できるようにするために、DMAを制御するドライバーの設計って重要なんですね。
まさにそうなんだ。DMA転送を開始するタイミングや完了を通知する方法など、APIの仕様を含めて十分に検討したうえで設計を進める必要があるんだ。それと、キャッシュメモリーによるデータの不整合が起きないよう、ドライバーのフレームワークが提供するDMA関連のサービスを正しく扱うことも大事だね。
最後に
今回は、Windowsデバイスドライバー開発の実務的な流れと、PCI Expressボード向けDMA制御ドライバーの開発事例を紹介したよ。
ずっと気になっていたMicrosoftのデジタル署名についてもようやく理解できました。単にサインを付けるだけじゃなくて、ドライバーの発行元や改変されていないことを確認し、安全にインストールするための仕組みだったんですね。
そうだよ。デバイスドライバーはカーネルモードで動作するため、正しく設計・実装されていないと、システム全体を不安定にしたり、最悪の場合は動作不能にしたりする恐れがあるからね。
そんなデバイスドライバーを開発するには、単にドライバーを実装する技術だけでなく、接続するハードウェアの仕様もよく理解しておく必要があるんですね。ハードウェアの仕様を正しく理解したうえで、開発を進めることが大事だとよく分かりました。
そのとおり。OKIアイディエスは、ハードウェア開発とデバイスドライバー開発の両方を手がけている。ハードウェアとソフトウェアの両方を理解したうえで、仕様の確認から開発、検証まで一貫して進めることが重要なんだ。仕様書に少しでも不明点があれば、事前に認識を合わせたうえで開発を進めているよ。
小さな認識違いが、後から複雑な不具合として現れる、というのはあるあるです。そのため、わからないことや小さな不具合があった場合でも、社内でハードウェアとソフトウェアの両面から仕様を確認し、原因を調査できることが当社の強みなんですね。
そのとおり!OKIアイディエスでは、ハードウェア仕様の確認から、Windowsデバイスドライバーの設計、実装、実機検証、デバッグ、認証テスト、署名取得に関する手続きまで、お客様の装置やシステムに合わせて一貫して行っているよ。だから、安心して開発を任せてほしい。
Windowsデバイスドライバーの新規開発や既存ドライバーの改修、PCI Expressなどのハードウェアとの接続、DMA制御でお困りのことがありましたら、ぜひお気軽にお問い合わせください!
おまけ:専門用語解説コーナー
「この記事、専門用語てんこ盛りだな~」と思ったあなたのために、簡単に解説します!
- DMA (Direct Memory Access):CPUを介さず、ハードウェアとメモリーの間でデータを転送する仕組み。CPUの処理負荷を抑えながら、大容量データを効率よく転送できる。
- INFファイル:Windowsがデバイスドライバーをインストールする方法を定義した設定ファイル。
- IOCTL(input/output control):アプリケーションからデバイスドライバーへ、設定変更や特殊な制御を要求するための仕組み。
- WinDbg:Windowsのシステム障害やドライバーの不具合を調査するためのデバッグツール。
- WDK (Windows Driver Kit):Windowsから提供されているデバイスドライバーを開発・ビルド・テストするための開発ツール。
- Secure Boot:起動時に信頼されたソフトウェアだけを実行することで、システムの安全性を高める機能。
- PCI Express:PCと拡張ボードなどを高速に接続するためのインターフェース規格。
番外編:ぐんまプログラミングアワード2026に出展しました
2026年8月30日(日)、前橋市の昌賢学園まえばしホールで開催された、上毛新聞社様主催の「ぐんまプログラミングアワード2026 FINAL STAGE」に出展しました。
ぐんまプログラミングアワードは、主に群馬県内の小中高生や専門学生、大学生などを対象に、アプリケーションやゲーム、アイデアなどのプログラミング作品を表彰するコンテストです。
このたび、主催の上毛新聞社様からお声がけいただき、本コンテストに参加されるお子さんや学生の皆様の挑戦を応援したい、来場される方にもデジタル技術やものづくりに触れていただきたい、という思いから、OKIアイディエスは自社開発の「じゃんけんAIデモ」を展示しました。

デモの様子
このデモでは、USBカメラに映った人間の手の形を、AIエッジ向けのデバイス「Kria™ KR260(AMD社製)」に搭載のAIが認識し、認識した手に勝つグー・チョキ・パーをロボットハンドが出す、AIによる画像認識とロボット制御を組み合わせた、体験型のデモンストレーションです。


ロボットハンドの手(プレイヤーの手の形に応じた手を出す)

イベント当日は、多くの小学生やそのご家族が来場し、会場は大変なにぎわいとなりました。会場入口から近い場所にあった当社のブースでは、ロボットハンドに興味を持った子どもたちが、次々とじゃんけん勝負を楽しんでいました。気づけば、「僕もやりたい!」という子どもたちだけでなく、大人の方も列に加わり、順番待ちができるほどの盛況となりました。
来場者の皆様からは、次のような声や質問をいただきました。
- 「プログラミングでこんなじゃんけんAIを作ってみたい。」
- 「どうしてこんなに速く手の形を認識できるの?」
- 「認識精度を上げるにはどうしたらいいの?」
小学生や中学生からも技術的な質問が多く寄せられ、プログラミングやAI開発が子どもたちにとって身近なものになっていることを実感しました。
このたび出展の機会をくださった上毛新聞社様、ならびに当社ブースへお越しくださった皆様に、心より御礼申し上げます。
当社の「じゃんけんAIデモ」について詳しく知りたい方は、ぜひ以下の記事もご覧ください。
実際のデモの様子を動画でご覧いただけます。百聞は一見に如かず。ぜひご視聴ください。
次回のブログ更新は11月を
予定しています。お楽しみに!
- ※記載されている会社名、製品名は、各社の商標または登録商標です。
- ※ここに記載されている仕様、デザインなどは予告なしに変更する場合があります。