デバイスドライバ
Windowsでは、デバイスドライバはカーネルモード(x86 CPU のリング0)またはユーザーモード(x86 CPU のリング3)で動作する。ドライバをユーザーモードで動作させる最大の利点は安定性の向上であり、ユーザーモードのデバイスドライバは品質が悪くてもカーネルメモリを上書きしてシステムをクラッシュさせるということがない。一方、カーネルモードからユーザーモードに移行させると性能が低下するので、性能が要求されるデバイスドライバはユーザーモードに移行できない。
ユーザーモードのモジュールはシステムコールを使わないとカーネル空間にアクセスできない。
ドライバは、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だけで行う、という実装も良く用いられる。
アプリケーションソフトウェアとは違い、デバイスドライバはハードウェアのアーキテクチャや仕様が公開されていなければ作成が困難であるため、オープンソース版のドライバ開発はクローズドソース版と比較して活発でなかったり機能や性能が劣ったりすることが多い。
プリンター: CUPS
RAID: CCISS
スキャナー: SANE(英語版)
ビデオ: Vidix(英語版)、ダイレクト・レンダリング・インフラストラクチャ
Linux用AMD Radeonグラフィックスドライバ
Linux用インテルグラフィックスドライバ
Linux用NVIDIAグラフィクスドライバnouveau