| この記事は
??可能
な
?考文?や出典
が全く示されていないか、不十分です。
出典を追加
して記事の信?性向上にご協力ください。
(
このテンプレ?トの使い方
)
出典?索
?
:
"デバイスドライバ"
?
ニュ?ス
·
書籍
·
スカラ?
·
CiNii
·
J-STAGE
·
NDL
·
dlib.jp
·
ジャパンサ?チ
·
TWL
(
2021年5月
)
|
デバイスドライバ
(
英
:
device driver
)とは、コンピュ?タの
デバイス
(
ハ?ドウェア
類。たとえば
ディスプレイ
、
プリンタ?
、
イ?サネット
ボ?ド、
?張カ?ド
、その他
周?機器
など)を
オペレ?ティングシステム
(OS) が制御するための
ソフトウェア
である。しばしば略して
ドライバ
あるいは
ドライバ?
と呼ばれる。
?要
[
編集
]
デバイスドライバは、一般に
バス
や通信サブシステムを?由してそこに接?している
周?機器
と
通信
する。プログラムからドライバ?の
ル?チン
を呼び出すと、ドライバが周?機器に?してコマンドを?行する。周?機器がドライバに?してデ?タを送り返してきたら、ドライバは元の呼び出したプログラム?のル?チンを呼び出すなどする。ドライバはハ?ドウェアに依存し、OS?に異なる。非同期なハ?ドウェアインタ?フェイスに??するため、
割り?み
?理を提供していることが多い。
ワ?プロソフト
や
表計算ソフト
などの
アプリケ?ション
などが、モニタ?、プリンタ?、ネットワ?クカ?ドなどの
デバイス
を利用する際、OSが提供する共通化されたAPI(
アプリケ?ション?プログラミング?インタ?フェイス
)によってデバイスの機能を利用できるようにしておく。そして、抽象化されたAPIとハ?ドウェアとの間の??を、各ハ?ドウェア用のデバイスドライバが受け持つ。
このような仕組みを採用することで、結果的にハ?ドウェアの差異を吸?することができる。ソフトウェアプログラマは、特定のハ?ドウェアに??する細?としたソフトウェアを書かずとも、APIにあわせたアプリケ?ションプログラムを作ることで、作成したソフトウェアから不特定多?のハ?ドウェアを利用することができる。
デバイスドライバは基本的にOSが使うソフトウェアであり、人間(コンピュ?タのユ?ザ)が直接使うソフトウェアのたぐいではないので、通常これ自?は人間用のユ?ザインタフェ?ス?面は持たない。
なお近年は多くの機器が
プラグアンドプレイ
に??しており、機器を接?した直後に、標準ドライバが自動でインスト?ルされるため、ユ?ザ?がデバイスドライバの存在を意識することは少なくなってきている。ユ?ザが意識せずにドライバが組み?まれることを「ドライバレス」や「ドライバ不要」と呼ぶ場合もある
[1]
。(つまりこれは、ドライバがコンピュ?タ?に存在しないという意味では決してなく、あくまで以前のようにユ?ザが意識的に自分の手でドライバをインスト?ルする手間は必要なくなった、というようなニュアンスで言っているにすぎない。)
標準ドライバ
[
編集
]
?く共通化が進んだハ?ドウェア(
キ?ボ?ド
、
マウス
、
USB
など)では、OS?部に標準ドライバ(ジェネリックドライバ)が含まれている場合が多い。標準ドライバがサポ?トしないハ?ドウェアに?しては、一般に、そのハ?ドウェアを提供するメ?カ?(ベンダ?)が、デバイスドライバを製品に
フロッピ?ディスク
や
CD-ROM
で添付するか、あるいはインタ?ネット上で配布する。
プリンタ?や
グラフィックスカ?ド
など一部の製品では、ベンダ?の提供するドライバと標準ドライバの?方が用意されている場合がある。標準ドライバは最低限の機能を有する安定したドライバ、ベンダ?提供のドライバはそのハ?ドウェアのもつ機能を最大限利用できる最適化されたドライバである場合が多い。
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を行うと、何も行われない場合がほとんどである
[2]
。read, writeでは何もせずに、?際の入出力をioctlだけで行う、という??も良く用いられる。
?部構成
[
編集
]
デバイスドライバの一般的な?部プログラムの構成は、アプリケ?ションのAPI呼び出しをきっかけに起動されるディスパッチコ?ドと、
ハ?ドウェア割り?み
により起動される
割り?み
?理コ?ド、の2つからなる。
割り?みに?してはさらに、純?な割り?み
ル?チン
と、OSの
タスクスイッチング
のタイミングで呼び出される後?理コ?ドの、2段階に分けて??する作りになっているケ?スが多い。これは、ハ?ドウェア割り?みル?チンからは、可能な限り早く復?して欲しいという要望があるため(そうしないと、他のハ?ドウェア割り?みが入れなくなる)、多少時間がかかっても良い?理は、カ?ネル?で余裕ができたタイミングまで後回しにして?行しよう、という考えに基づいた構成手法である。(後?理コ?ドは、Windowsでは、
DPC
(
英語版
)
(Deferred Procedure Call) 、Linuxでは、softirqあるいはTaskletと呼ばれる部分に相?する。また、過去のLinuxの??では、Bottom Halfと呼ばれた部分である。)
最近
[
いつ?
]
のOSでは、ハ?ドウェア同士で機能が似たものは、まとめてひとつのクラス(
デバイスクラス
)として扱う仕組みも存在する。この場合のドライバはドライバモジュ?ルによる
階層構造
になっており、あるデバイスクラスで共通の?理をする
クラスドライバ
(
英
:
Class Driver
)はOS側で供給され、デバイスベンダ?が各デバイス固有の
ミニドライバ
(
英
:
Minidriver
)を作製する
[3]
。これにより、ドライバの開?工?を削減できるようになっている。上位/下位のドライバペアは他の名?としてポ?トドライバ/ミニポ?トドライバ、クラスドライバ/ミニクラスドライバなどと呼ばれる場合もある
[4]
。
例えば、
シリアルポ?ト
では
XON/XOFF
(
英語版
)
のようにシリアルポ?ト全般に共通する標準通信プロトコルに??する必要がある。これはシリアルポ?トの論理層(クラスドライバ)で管理することになる。しかし、物理層(ミニドライバ)は特定のシリアルポ?トのチップと通信できなければならない。
16550 UART
というハ?ドウェアはPL011
[5]
とは異なる。物理層はそういったチップ固有の差異に??している。慣例的に、OSからの要求はまず論理層に?して行われる。そして論理層から物理層が呼び出され、OSの要求をハ?ドウェアが理解できる形にして?行する。逆にハ?ドウェア周?機器がOSに返答しなければならないとき、まず物理層が??して論理層を呼び出す。
デバイスドライバがクラスごとに共通化されることで、特定のハ?ドウェアが?自に持っている機能が使えなくなる、あるいは使いにくくなるという欠点もある。新規技術開?で出現したハ?ドウェアでは、その機能をどのようにOSが抽象化するか(クラス化するか)が決まるまで、ミニドライバの開?が待たされることもある。この場合は、ハ?ドウェア?にネイティブなデバイスドライバを、階層化されないドライバ(
モノリシック ドライバ
)として作成すれば、早期にドライバを提供することができる。
モノリシックドライバでは、ioctlに、そのハ?ドウェア?自の機能を使うための仕掛けを組み入れることも可能であり、これをあやつる?用のアプリケ?ションを作れば、さらにきめ細かなハ?ドウェア制御を?現することもできる。
デバイスドライバの?部構造は、OSごとに大きく異なる。
Windows
では、
Windows 98
以降、??なバ?ジョンのWindowsごとにドライバを書く手間を省くために、Win32 ドライバモデル (
WDM
) ア?キテクチャが導入された。
Windowsでは、ドライバの最下層にハ?ドウェアを抽象化する層である
Hardware Abstraction Layer
(
HAL
) を設けて、プラットフォ?ムによる違いを吸?する仕組みも存在する(386, 486, Pentium, Alpha, SPARC, IA-32, IA-64, EM64Tなどといった、CPUの違い、CPUア?キテクチャの進化を吸?する)。
Linux
では、デバイスドライバを
Linuxカ?ネル
の一部として構築することもできるし、Linuxカ?ネルとは別の
モジュ?ル
として構築することもできる。MakedevにはLinuxでの周?機器の一?が含まれており、ttyS(端末)、lp(
パラレルポ?ト
)、hd(ディスク)、loop(
ル?プデバイス
(
英語版
)
)、sound(
mixer
(
英語版
)
、
sequencer
、
dsp
、audio を含む)など??な周?機器が定義されている
[6]
。
ロ?ド可能なデバイスドライバは、Windowsでは ".sys"、Linuxでは ".ko" という?張子のファイルになっている。この形のデバイスドライバは必要なときだけロ?ドできるという利点があり、カ?ネルメモリの節約につながる。
以上は、ハ?ドウェアに合わせて、ドライバを各種OSに?して用意するという方針である。これとは逆に、
PDA
などの開?現場では、ハ?ドウェアの仕?をできるだけ同じにすることでデバイスドライバの開?の手間を省く、という方針が採用されているケ?スもある。
開?
[
編集
]
デバイスドライバ開?には、その
プラットフォ?ム
でのハ?ドウェアとソフトウェアについて詳細まで理解している必要がある。ドライバは高い特?を?えられた環境で動作するので、間違った動作をすると破?的な結果を招く。?照的に現代の
オペレ?ティングシステム
でのユ?ザ?レベルのソフトウェアは、システムの他の部分に影響せずに停止することができる。
ユ?ザ?モ?ド
で動作するデバイスドライバであっても、バグがあればシステムをクラッシュさせることがある。そういった要因から、問題の診?も困難で危?なものとなる。
したがってドライバを書く仕事は、ハ?ドウェア開?企業のソフトウェア技術者の仕事となることが多い。これは、部外者よりもハ?ドウェア開?元の方がそのデザインに?する情報をより多く得られるためである。さらに言えば、デバイスドライバを提供することで製品を最適な方法で使えることを保?するという意味もある。一般に論理層(クラスドライバ)はOSベンダ?が書き、物理層(ミニドライバ)は周?機器ベンダ?が書く。しかし最近では
FLOSS
OS
で使用するためにベンダ?以外の者がデバイスドライバを書くことも?えている。その場合、ハ?ドウェア製造業者がその周?機器のインタ?フェイス仕?について情報を提供することが重要となる。
リバ?スエンジニアリング
でそういった情報を解明することもできるが、??ソフトウェアが全くない?態ではそれも難しくなる。
マイクロソフト
は品質の低いデバイスドライバによってシステムの安定性が損なわれるのを防ぐため、ドライバ開?の新たなフレ?ムワ?ク
Windows Driver Foundation
(WDF) を開?した。WDFには
User-Mode Driver Framework
(UMDF) と
Kernel-Mode Driver Framework
(KMDF) がある。UMDFはユ?ザ?モ?ドで動作するドライバ開?用のフレ?ムワ?クで、UMDFを使ったユ?ザ?モ?ドのドライバにバグがあったとしても、システム安定性に影響を?えない。KMDFはカ?ネルモ?ドで動作するデバイスドライバ開?を扱うが、I/O操作のキャンセル、パワ?マネジメント、プラグ?アンド?プレイのサポ?トなど問題を起こしやすい機能の標準的??を提供している。
Apple
は
macOS
用のドライバ開?のオ?プンソ?ス?フレ?ムワ?ク
I/O Kit
(
英語版
)
を提供している。
カ?ネルモ?ドとユ?ザ?モ?ド
[
編集
]
Windowsでは、デバイスドライバは
カ?ネルモ?ド
(
x86 CPU のリング0
)または
ユ?ザ?モ?ド
(x86 CPU のリング3)で動作する
[7]
。ドライバをユ?ザ?モ?ドで動作させる最大の利点は安定性の向上であり、ユ?ザ?モ?ドのデバイスドライバは品質が?くてもカ?ネルメモリを上書きしてシステムをクラッシュさせるということがない
[8]
。一方、カ?ネルモ?ドからユ?ザ?モ?ドに移行させると性能が低下するので、性能が要求されるデバイスドライバはユ?ザ?モ?ドに移行できない。
ユ?ザ?モ?ドのモジュ?ルは
システムコ?ル
を使わないとカ?ネル空間にアクセスできない。
?想デバイスドライバ
[
編集
]
?想デバイスドライバはハ?ドウェア周?機器をエミュレ?トするもので、特に
?想化
環境で使われる。例えば、Windowsの動作しているコンピュ?タ上で
MS-DOS
プログラムを?行する場合や、
Xen
などの上で動作するゲストOSの場合である。ゲストOSがハ?ドウェアと直接やりとりできるようにするのではなく、?想デバイスドライバがハ?ドウェアをエミュレ?トすることで、
VM
?で動作するゲストOS(とその中のデバイスドライバ)が?際のハ?ドウェアにアクセスしているかのような幻影を生じさせる。ゲストOSがハ?ドウェアにアクセスしようとしたとき、ホストOS?の?想デバイスドライバがそれに??して呼び出される。?想デバイスドライバはまた、VM?に
割り?み
などのプロセッサレベルのイベントを擬似的に?生させることができる。
?想化環境以外でも?想デバイスが使われることがある。例えば、
Virtual Private Network
では?想
ネットワ?クカ?ド
が使われ、
iSCSI
では?想
ディスク
デバイスが使われる。?想デバイスドライバの好例として
Daemon Tools
などがある。
オ?プンなドライバ
[
編集
]
アプリケ?ションソフトウェアとは違い、デバイスドライバはハ?ドウェアのア?キテクチャや仕?が公開されていなければ作成が困難であるため、
オ?プンソ?ス
版のドライバ開?はクロ?ズドソ?ス版と比較して活?でなかったり機能や性能が劣ったりすることが多い。
デバイスドライバ?連のAPIや規格
[
編集
]
Windows
[
編集
]
脚注
[
編集
]
?連項目
[
編集
]
外部リンク
[
編集
]