初心者向けデバイスドライバ講座(6)
サイエンスパーク株式会社 大島 光人
1
Copyright@2020 SciencePark Corp.
ID:aohshima
名前:大島 光人(オオシマ アキト)
東京電機大学理工学部電子機械工学科卒業
今年4月にサイエンスパーク株式会社に就職
プラットフォーム開発部:デバイスドライバ課所属
⇒デバイスドライバ初心者が学んだ内容を発表していきます。
自己紹介
2
・割込みについて
→通常の処理中に割込み要求が発生した場合に、通常の処理より優先して処理を行う。
・割込みサービスルーチン
→割込み要求が発生した場合に、管理デバイスかどうかの判定、DPCルーチンの実行ス
ケジュールの登録等を行う※
※必要最低限の処理のみを実行する。
・DPCルーチン
実際に割込み要求が発生した時に行われるメイン処理を実装する。
前回までの概要
3
4月になり新入社員も来たので・・・
→改めて、ドライバについての概要を復習する。
今回の目標
4
OSと周辺機器の橋渡しの役割をするソフトウェア。
1つの周辺機器を動かすだけでも、たくさんのデバイスドライバが必要。
デバイスドライバとは
PC
周辺機器
5
バスドライバ
クラスドライバ
ファンクションドライバ
ミニポートドライバ
6
例:実際にUSBメモリを接続した場合
USBクラスドライバ
USBバスドライバ
PCIバスドライバ
ハードウェア
ソフトウェア
マウスのドライバを見てみる。
7
一つのデバイスに対して
複数のドライバがロードされていることがわかる
SCM(Service Control Managerへの登録状況)
8
デバイスドライバの基本構成
10
ドライバはC言語をベースとして書かれているが、main()関数は存在しない。
ドライバはルーチン(関数)によって構成され、これらのルーチンはI/Oマネージャか
ら呼び出される。
• ドライバエントリルーチン
• アンロードルーチン
• ディスパッチルーチン
• 割り込みサービスルーチン
• DPCルーチン
• 特別処理、特別種類ドライバのみ適応ルーチン
I/Oマネージャ
11
• ユーザーモードのアプリケーションからド
ライバにアクセスするにはI/Oマネージャ
を通す必要がある。
• I/Oマネージャ内でドライバは階層構造と
なっていて、高いレベルの順に以下のよう
になっている
ファイルシステムドライバ
クラスドライバ
ポートドライバ
ミニポートドライバ
I/Oリクエストによって通過する階層は異な
る。
ドライバの処理過程
12
ディスパッチルーチン
13
IRP_MJ_CREATE
IRP_MJ_CLOSE
IRP_MJ_READ
IRP_MJ_WRITE
IRP_MJ_DEVICE_CONTROL
IRP_MJ_PNP
IRP_MJ_POWER
ドライバエントリ内でアプリケーションからのデバイスに対する要求を処理する
最上位のドライバのディスパッチルーチンはユーザーモードのアプリケーションのI/O要求を直接処理する
その下の中間ドライバや物理ドライバのディスパッチルーチンは一つ上のドライバからのI/O要求を処理する。
I/O処理要求があった際、ディスパッチルーチンはI/Oマネージャによって呼び出される
どのディスパッチルーチンを呼ぶかは、I/Oメジャー機能コードによって管理される。
また、ディスパッチルーチンはドライバエントリ処理が終了してから呼び出される。
メジャー機能コード
User App
Driver A
Driver B
基本的なドライバ処理の流れ①
14
ドライバのインストール(Infスクリプト実行)
Sysファイルをサービスとして登録
DriverEntry
各ルーチンの登録
ドライバロード処理
ドライバインストール要求
基本的なドライバ処理の流れ②
15
ドライバ処理要求
対応したルーチンがコールバックされる
予め登録しておいたルーチン処理が実行
基本的にはユーザーアプリケーションで定義したサービスと動作は変わらない
まとめ
16
・単純なドライバであれば、フレームワークによる実装の仕方ぐらいでサービスアプリ
ケーションと処理過程は変わらない
・デバイス側に近づくにつれて、カーネルモードへの意識等必要
・とりあえずは、ユーザーモードで動作するドライバを作成してみることで練習になる
かも?
ご清聴ありがとうございました。
SP2004-E02-01

初心者向けデバイスドライバ講座(6)