デバイスドライバ

出典: フリー百科事典『ウィキペディア(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では、Windows 98以降、様々なバージョンの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などの開発現場では、ハードウェアの仕様をできるだけ同じにすることでデバイスドライバの開発の手間を省く、という方針が採用されているケースもある。

[編集] 関連項目

個人用ツール
名前空間
変種
操作
案内
ヘルプ
ツールボックス
他の言語