デバイスドライバー
読み:デバイスドライバー
外語:device driver

 デバイスを、ソフトウェアから操作できるように用意した汎用ライブラリのこと。音引きを略して「デバイスドライバ」、あるいは単に「ドライバー」「ドライバ」ともいう。略称「デバドラ」。
目次

概要
 ハードウェアアプリケーションから利用したい場合、アプリケーションから直接操作せず、一旦デバイスドライバーと呼ばれるソフトウェア群を緩衝的に用意して利用する。
 例えばディスプレイドライバーの場合、そのオペレーティングシステム(OS)の画面描画に関するAPIからドライバーが呼び出され、呼び出されたAPI通りの画面処理をグラフィックプロセッサーに対して与える処理を行なう。
 通常はOSが提供する標準化に則った仕様とすることで、ハードウェアが変わっても、アプリケーションソフトウェアには手を加えること無く継続利用可能というメリットが享受できる。

特徴

内部構造
 デバイスドライバーの内部構造は、OSの仕様が反映されるため、OSごとに大きく異なる。
 Windowsひとつとっても、16ビットの時代、32ビットの時代、64ビットの時代で違いがある。また32ビットでも環境により差がある。

動作環境
 現役の多くのOSでは、μITRONのようにユーザー空間カーネル空間の区別がないものを除いて、デバイスドライバーはカーネル空間で動作する。
 このため、ユーザー空間用の標準Cライブラリなどが提供する機能の一切が使えない。
 UNIX互換システムを例とすると、ユーザー空間でなら使えるような、open(2)も、printf(3)も、malloc(3)も、使うことができない。
 Linuxでは代替として、printk(9)、kmalloc(9)などを用意している。

Linux

種類

ブロックデバイス

キャラクターデバイス

構造

構成方法
 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の上にミドルウェアが搭載された環境である。
 どのレイヤーで開発するかで、次の二種類が存在する。

再検索