デバイスドライバ
出典: フリー百科事典『ウィキペディア(Wikipedia)』
デバイスドライバは、グラフィックディスプレイ、プリンタやイーサネットボードなど、ある特定の入出力デバイス(ハードウェア)を制御し、アプリケーションソフトウェアに対して抽象化したインターフェースを提供するためのソフトウェア。「デバドラ」「ドライバ」とも略される。
目次 |
[編集] 概要
ワープロや表計算などのアプリケーションなどから、グラフィックディスプレイ、プリンタ、ネットワークカードなどのデバイスを利用する時には、OSが提供する共通化されたAPI(アプリケーション・プログラミング・インターフェイス)により利用でき、抽象化されたAPIとハードウェアとの間の対応は各ハードウェア用のデバイスドライバが処理する。
このような仕組みにすれば、ハードウェアの差異を吸収することができ、特定のハードウェアに対応するソフトウェアを書かなくても、APIにあわせたアプリケーションプログラムを作ることで、ソフトウェアは不特定多数のハードウェアを利用することができる。
広く共通化が進んだハードウェア(キーボード、マウス、USBなど)では、OS内部に標準ドライバが含まれている場合が多い。標準ドライバがサポートしないハードウェアに関しては、一般に、そのハードウェアを提供するメーカが、デバイスドライバを製品に添付するか、あるいはインターネット上で配布する。
[編集] APIとの関係
ドライバは、オペレーティングシステム(OS)の一部として機能する。 ユーザプロセスでのAPI呼び出しをきっかけに、ドライバのコードが呼び出されるが、ドライバのコード自身は、ユーザプロセスではなく、カーネルコードの一部として動作する。
上で言う抽象化されたAPIとは、ほとんどの近代的なOSでは、open, read, write, ioctl, close というAPIに統一化されている。歴史的にいうと、これらのAPIは、記憶装置上のファイルにアクセスするためのAPIであるが、これがデバイスに対してもアクセス可能なように拡張された形で提供されているのが、一般的な作りである。すなわち、デバイスに対して、入出力の準備をするopen処理、デバイスからデータを入力するためのread処理、デバイスにデータを出力するためのwrite処理、デバイスに対して特別な処理を行うためのioctl処理、入出力処理を終えるためのclose処理、などである。
read,writeで実際に何が行われるかは、デバイスごとに異なる。例えば、プリンタに対してwriteを行うと印字されるが、サウンドデバイスに対してwriteを行うと、音が鳴る。マウスに対してreadを行うと、マウスの移動量が読み出せる。デバイスによっては、read、writeの片方にしか意味がない場合も多い。例えば、プリンタに対してreadを行うと、何も行われない場合がほとんどである。(ペーパーエンプティ状態が読める、という実装もあり得るが。)read,writeでは何もせずに、実際の入出力をioctlだけで行う、という実装も良く用いられる。
[編集] 内部構成
デバイスドライバの一般的な内部構成は、アプリケーションのAPI呼び出しをきっかけに起動されるディスパッチコードと、ハードウェア割り込みにより起動される割り込み処理コード、の2つからなる。 割り込みに対してはさらに、純粋な割り込みルーチンと、OSのタスクスイッチングのタイミングで呼び出される後処理コードの、2段階に分けて実装する作りになっているケースが多い。これは、ハードウェア割り込みルーチンからは、可能な限り早く復帰して欲しいという要望があるため(そうしないと、他のハードウェア割り込みが入れなくなるので)、多少時間がかかっても良い処理は、カーネル内で余裕ができたタイミングまで後回しにして実行しよう、という考えに基づいた構成手法である。(後処理コードは、Windowsでは、DPC (Deferred Procedure Call) 、Linuxでは、softirqあるいはTaskletと呼ばれる部分に相当する。また、過去のLinuxの実装では、Bottom Halfと呼ばれた部分である。)
最近のOSでは、ハードウェア同士で機能が似たものは、まとめてひとつのクラス(デバイスクラス)として扱う機構も存在する。この場合のドライバは階層構造になっており、あるデバイスクラスで共通の処理をする上位ドライバ(クラスドライバ)はOS側で供給され、ハードウェアを提供するメーカでは、下位のドライバを、デバイス個別のミニドライバとして作製する。これにより、ドライバの開発工数を削減できるようになっている。
デバイスドライバがクラスごとに共通化されることで、特定のハードウェアが独自に持っている機能が使えなくなる、あるいは使いにくくなるという欠点もある。新規技術開発で出現したハードウェアでは、その機能をどのようにOSが抽象化するか(クラス化するか)が決まるまで、ミニドライバの開発が待たされることもある。この場合は、ハードウェア毎にネイティブなデバイスドライバを、階層化されないドライバ(モノリシック ドライバ)として作成すれば、早期にドライバを提供することができる。
モノリシックドライバでは、ioctlに、そのハードウェア独自の機能を使うための仕掛けを組み入れることも可能であり、これをあやつる専用のアプリケーションを作れば、さらにきめ細かなハードウェア制御を実現することもできる。
デバイスドライバの内部構造は、OSごとに大きく異なる。
Windowsでは、Windows98以降、様々なバージョンのWindowsごとにドライバを書く手間を省くために、Win32 ドライバモデル (WDM) アーキテクチャが導入された。 Windowsでは、ドライバの最下層にハードウェアを抽象化する層であるHardware Abstract Layer (HAL) を設けて、プラットホームによる違いを吸収する仕組みも存在する(386,486,pentium,alpha,SPARC,IA-32,IA-64,EM64Tなどといった、CPUの違い、CPUアーキテクチャの進化を吸収する)。 さらに、Windows,UNIXなどのOSの枠を越えて、複数のOSに対して共通のドライバを1本書けば、どのOSでも動作可能なようにすべく Uniform Driver Interface (UDI) という手法も試みられている。
以上は、ハードに合わせて、ドライバを各種OSに対して用意するという方針であるが、PDAなどでは、逆にハードウェアの仕様をできるだけ同じにすることで、デバイスドライバの開発の手間を省く、という方針で開発を進めているケースもある。