デバイスドライバ
デバイスドライバは、一般にバスや通信サブシステムを経由してそこに接続している周辺機器と通信する。プログラムからドライバ内のルーチンを呼び出すと、ドライバが周辺機器に対してコマンドを発行する。周辺機器がドライバに対してデータを送り返してきたら、ドライバは元の呼び出したプログラム内のルーチンを呼び出すなどする。ドライバはハードウェアに依存し、OS毎に異なる。非同期なハードウェアインターフェイスに対応するため、割り込み処理を提供していることが多い。
ワープロソフトや表計算ソフトなどのアプリケーションなどが、モニター、プリンター、ネットワークカードなどのデバイスを利用する際、OSが提供する共通化されたAPI(アプリケーション・プログラミング・インターフェイス)によってデバイスの機能を利用できるようにしておく。そして、抽象化されたAPIとハードウェアとの間の対応を、各ハードウェア用のデバイスドライバが受け持つ。
このような仕組みを採用することで、結果的にハードウェアの差異を吸収することができる。ソフトウェアプログラマは、特定のハードウェアに対応する細々としたソフトウェアを書かずとも、APIにあわせたアプリケーションプログラムを作ることで、作成したソフトウェアから不特定多数のハードウェアを利用することができる。
デバイスドライバの一般的な内部プログラムの構成は、アプリケーションのAPI呼び出しをきっかけに起動されるディスパッチコードと、ハードウェア割り込みにより起動される割り込み処理コード、の2つからなる。 割り込みに対してはさらに、純粋な割り込みルーチンと、OSのタスクスイッチングのタイミングで呼び出される後処理コードの、2段階に分けて実装する作りになっているケースが多い。これは、ハードウェア割り込みルーチンからは、可能な限り早く復帰して欲しいという要望があるため(そうしないと、他のハードウェア割り込みが入れなくなる)、多少時間がかかっても良い処理は、カーネル内で余裕ができたタイミングまで後回しにして実行しよう、という考えに基づいた構成手法である。(後処理コードは、Windowsでは、DPC(英語版) (Deferred Procedure Call) 、Linuxでは、softirqあるいはTaskletと呼ばれる部分に相当する。また、過去のLinuxの実装では、Bottom Halfと呼ばれた部分である。)
最近のOSでは、ハードウェア同士で機能が似たものは、まとめてひとつのクラス(デバイスクラス)として扱う仕組みも存在する。この場合のドライバはドライバモジュールによる階層構造になっており、あるデバイスクラスで共通の処理をするクラスドライバ(英: Class Driver)はOS側で供給され、デバイスベンダーが各デバイス固有のミニドライバ(英: Minidriver)を作製する。これにより、ドライバの開発工数を削減できるようになっている。上位/下位のドライバペアは他の名称としてポートドライバ/ミニポートドライバ、クラスドライバ/ミニクラスドライバなどと呼ばれる場合もある。