デバイスドライバは、グラフィックディスプレイ、プリンタやイーサネットボードなど、ある特定の入出力デバイス(拡張カードや周辺機器などのハードウェア)を制御し、アプリケーションソフトウェアに対して抽象化したインターフェースを提供するためのソフトウェア。「デバドラ」「ドライバ」とも略される。 ワープロや表計算などのアプリケーションなどが、グラフィックディスプレイ、プリンタ、ネットワークカードなどのデバイスを利用する際、OSが提供する共通化されたAPI(アプリケーション・プログラミング・インターフェイス)によってデバイスの機能を利用できるようにしておく。そして、抽象化されたAPIとハードウェアとの間の対応を、各ハードウェア用のデバイスドライバが受け持つ。 このような仕組みを採用することで、結果的にハードウェアの差異を吸収することができる。ソフトウェアプログラマは、特定のハードウェアに対応する細々としたソフトウェアを書かずとも、APIにあわせたアプリケーションプログラムを作ることで、作成したソフトウェアから不特定多数のハードウェアを利用することができる。 広く共通化が進んだハードウェア(キーボード、マウス、USBなど)では、OS内部に標準ドライバが含まれている場合が多い。標準ドライバがサポートしないハードウェアに関しては、一般に、そのハードウェアを提供するメーカが、デバイスドライバを製品に添付するか、あるいはインターネット上で配布する。 ドライバは、オペレーティングシステム (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などの開発現場では、ハードウェアの仕様をできるだけ同じにすることでデバイスドライバの開発の手間を省く、という方針が採用されているケースもある。 ソフトウェア(英: Software)とは、コンピュータシステム上で何らかの作業を行うプログラム群、プロシージャ群、それらに関する文書を指す用語である[1]。物理的装置であるハードウェアと対比させて言うときに使う。プログラムとほぼ同義だが範囲は更に広い。日本では一般に略して「ソフト」とも呼ばれる。 ソフトウェアには、ワープロソフトのように生産的な仕事を行うためのアプリケーションソフトウェア、アプリケーションソフトウェアに必要なサービスを提供するハードウェアとのインタフェースとなるオペレーティングシステムのようなシステムソフトウェア、分散システムを制御・管理するミドルウェアなどがある。 日本では、仕事 と対比する用法が転じ、映像や音楽等のコンテンツ(映画、ドラマなどの作品をビデオテープやDVDなどの記録メディアに収録したもの)もソフトウェアと呼ぶ。類似の用法は欧米にもある[2]。 ある機能をもつソフトウェアに対して、「ソフトウェア」という言葉が接頭辞・形容詞的に用いられることがある。エンコードをするソフトウェアを「ソフトウェアエンコーダ」、DVDを再生するソフトウェアを「ソフトウェアDVDプレーヤー」と呼ぶことがある。情報を処理する(DVD再生の場合、DVDに収録されたデジタル画像データを可視化する)際に、当該情報専門の単体のハードウェアで処理されるか、汎用コンピュータ(PC等)用のソフトウェアで処理されるかを区別するためである。 ソフトウェアは、物理的なハードウェアと対比した言葉であり、LSIなどの電子回路そのものは、コンピュータに処理をさせる手順を記述していても、物理的な物であるのでソフトウェアとは呼ばない。ハードウェアでありソフトウェアでもある中間的な存在として、ファームウェアがある。コンピュータにおいて、ソフトウェアはRAMにロードされ、CPUで実行される。最も低いレベルでは、ソフトウェアは特定のプロセッサに固有の機械語で構成されている。機械語はプロセッサへの命令となる2進数の値から構成されていて、それによってコンピュータの状態を次々と変化させる。従ってソフトウェアは、コンピュータハードウェアの状態を変化させる命令列である。通常、機械語よりも人間が使いやすい高級言語で書かれる。高級言語はコンパイラかインタプリタによって機械語のコードに変換される。他にも機械語とほぼ一対一に対応したアセンブリ言語があり、アセンブリ言語で書かれたソフトウェアはアセンブラによって機械語に変換される。 ほとんどのコンピュータはオペレーティングシステムと呼ばれる特別なソフトウェアプログラムでリアルタイムに機械が制御される。ソフトウェアの他の形態にはプログラム言語のアセンブラおよびコンパイラ、企業および家庭向けアプリケーションソフトウェア(分類を参照)がある。 1957年にJohn W. Tukeyがこの意味で「ネットキャッシング 」という用語を最初に使用した[3]。情報工学およびソフトウェア工学では、ソフトウェアはコンピュータシステム、プログラム、データにより処理される情報全般やあらゆる「機械装置以外のもの」を示す。記憶装置に異なる命令群を読み込んで計算を制御する概念は階差機関の一部としてチャールズ・バベッジが考案した。これがほとんどの近代ソフトウェアの基礎となる理論はアラン・チューリングの1935年の論文 Computable numbers with an application to the Entscheidungsproblem で初めて提唱された[4]。 一般のコンピュータシステムでは、ソフトウェアを3つの階層、システムソフトウェア、プログラミングツール、アプリケーションソフトウェアに分けるが、その境界はあいまいである。