デバイスドライバー
読み:デバイスドライバー
外語:device driver
デバイス
を、
ソフトウェア
から操作できるように用意した汎用ライブラリのこと。音引きを略して「デバイスドライバ」、あるいは単に「ドライバー」「ドライバ」ともいう。略称「デバドラ」。
目次
概要
特徴
内部構造
動作環境
Linux
種類
ブロックデバイス
キャラクターデバイス
構造
構成方法
初期化ルーチン
トップハーフ
ボトムハーフ
アプリケーションとのインターフェイス
Android
概要
ハードウェア
を
アプリケーション
から利用したい場合、アプリケーションから直接操作せず、一旦デバイスドライバーと呼ばれるソフトウェア群を緩衝的に用意して利用する。
例えばディスプレイドライバーの場合、その
オペレーティングシステム
(OS)の画面描画に関するAPIからドライバーが呼び出され、呼び出されたAPI通りの画面処理をグラフィックプロセッサーに対して与える処理を行なう。
通常はOSが提供する標準化に則った仕様とすることで、ハードウェアが変わっても、アプリケーションソフトウェアには手を加えること無く継続利用可能というメリットが享受できる。
特徴
内部構造
デバイスドライバーの内部構造は、OSの仕様が反映されるため、OSごとに大きく異なる。
Windowsひとつとっても、16ビットの時代、32ビットの時代、64ビットの時代で違いがある。また32ビットでも環境により差がある。
VxD
‐ Windows 3.0〜95まで
WDM
‐ Windows 98/2000〜XP
WDF(Windows Driver Foundation) ‐ Windows Vista〜
UDI
‐ Intelが提唱した、OSを問わない標準仕様
動作環境
現役の多くのOSでは、
μITRON
のように
ユーザー空間
と
カーネル空間
の区別がないものを除いて、デバイスドライバーはカーネル空間で動作する。
このため、ユーザー空間用の
標準Cライブラリ
などが提供する機能の一切が使えない。
UNIX互換システムを例とすると、ユーザー空間でなら使えるような、open(2)も、printf(3)も、malloc(3)も、使うことができない。
Linuxでは代替として、
printk(9)
、kmalloc(9)などを用意している。
Linux
種類
ブロックデバイス
決められた単位(ブロック)単位でデータを入出力するデバイス
ファイルシステムを構築でき、mount(8)できるもの。
キャラクターデバイス
1バイト単位でデータを入出力するデバイス
一般にはこのスタイルが多く使われている。
構造
構成方法
Linuxのドライバーは、3種類の部分から構成される。構成方法は伝統的なUNIXと同様である。
初期化ルーチン
トップハーフ ‐ 入出力要求に対するサービスルーチン
ボトムハーフ ‐
割り込みハンドラー
割り込みベクターテーブルには、ボトムハーフハンドラーが登録されることになる。
初期化ルーチン
起動時および終了時の初期化処理である。
モジュールがロードされた時(OS起動時など)にinit_module()が呼び出され、モジュールがアンロードされたとき(rmmodされたとき)にcleanup_module()が呼びされる。
init_module()でハードウェアのチェックなどを自身で行ない、自分自身をデバイスドライバーとしてOSに登録する。
cleanup_module()では、OSに登録した自分自身を削除する。
トップハーフ
アプリケーションがopen(2) read(2) write(2) ioctl(2) close(2)などのシステムを発行すると、カーネル経由でこのルーチンが呼び出される。
具体的には、初期化ルーチンでregister_chrdevとしてキャラクターデバイスを登録する際に対応する処理関数へのポインターの
配列
を
引数
に渡す。
ボトムハーフ
タイマー割り込み
などの割り込みハンドラー
ハンドラーだが、実際はカーネルスレッドという形態である。
アプリケーションとのインターフェイス
アプリケーションは、OSが用意しているインターフェイスである
システムコール
経由で、ファイル単位の入出力要求をおこなう。
アプリケーションからデバイスドライバーを直接見る方法はない。
/dev
の下に仮想化されたスペシャルファイルが見えるだけである。
アプリケーションは、これをopen(2)でオープンし、あとはファイルのように扱う。
Android
AndroidはLinuxカーネル 2.6の上にミドルウェアが搭載された環境である。
どのレイヤーで開発するかで、次の二種類が存在する。
HAL
Linuxドライバー
再検索