誰でもわかるデバイスドライバ講座（２）　デバイスドライバとは


##はじめに
デバドラ講座の最初のテーマとして、デバイスドライバとは何か。どのように使用されているのかについて説明します。

まず、はじめにですが、私はこの会社に入るまでは、デバイスドライバという存在を意識することはありませんでした。入社後に学んでいくと、デバイスドライバはPCやスマホ※などを操作する際に必ず動作しているソフトウェアであることを知りました。

 ※ 本講座ではスマホ用のデバイスドライバは取り扱いません

デバイスドライバを一番身近に感じられるものとしては、プリンタがわかりやすいです。
みなさんがPCに初めてプリンタを接続したときにプリンタが認識せずに、使用できなかった。という経験はありませんか？

この時に、そのプリンタ用のソフトウェアをインストールすると思います。そのソフトウェアがデバイスドライバです。
デバイスドライバというものがどういうものかを理解すると、無くてはならないものであることに気づきました。デバイスドライバは、普段意識をしていないだけで、PCを操作するときに常に動作しているソフトウェアであり、様々なデバイスを使用するためには必要不可欠な、縁の下の力持ちともいえるソフトウェアであるということを皆さんに伝えていければと思います。

## デバイスドライバとは何か
デバイスドライバとは、PCと周辺機器(デバイス)の橋渡しを役割とするソフトウェアです。しばしばドライバと略されます。
デバイスドライバの役割は、タクシーのドライバに似ています。タクシーでは客が行き先を告げ、言われた通りにドライバが車を動かし目的地に向かいます。
PCでは、 アプリケーションが指示を与え、それに従ってデバイスドライバがデバイスを動かします。

<div align="center">
<img src=https://user-images.githubusercontent.com/73565470/106231549-509a2480-6235-11eb-9edc-e5b5e6e73fa1.png>
</div>

例えば、新しくデジタルカメラを買って、撮った写真をパソコンに取り込もうとしたとします。USBを使ってパソコンに接続してもそのままでは使えなかった経験はありませんか？
最近ではデバイスドライバの標準化が進んできてそのような場面も少なくなってきましたが、少し前のカメラや古いOSを使用した場合には、購入時に付属されているCD-ROMやWebからダウンロードしたソフトウェアをインストールする必要があります。
このインストールされるソフトウェアにそのカメラ用のデバイスドライバが含まれています。
デバイスドライバは、専用のアプリケーションからカメラを使用できるようにしたり、他の一般的なアプリケーションからも操作ができる共通インターフェースを公開したりして、アプリケーションからの要求を中継してカメラと直接やり取りを行います。

マウスやキーボード、USBメモリなどよく使われるデバイスでは、デバイスドライバを新たにインストールする必要がないものもあります。
これらはOSにあらかじめインストールされている標準ドライバを使用するため、標準ドライバにて対応しているデバイスは、ケーブルを差し込むだけですぐに使えるようになります。

Windows10などの最新のOSでは標準ドライバが充実してきており、デジタルカメラやWebカメラ、スマホなどもケーブルを接続するだけで、中の画像を見たり、撮影を開始したりすることができるようになりました。

デバイスドライバには様々な種類があります。種類ごとにデバイスクラスと呼ばれる区分に分かれます。
デバイスクラスごとに標準ドライバが組み込まれていますが、全てのデバイスクラスに標準ドライバがあるわけではありません。
また、標準ドライバを使用するためには、デバイス側でその決められた仕様にすべて対応する必要があります。しかし、標準ドライバに準拠できないデバイスや、その標準ドライバだけでは対応できない高機能なデバイスを使用する際には独自のデバイスドライバを開発することになります。


## ソフトウェアインターフェース

ソフトウェアインターフェースはデバイスドライバとアプリケーションがやり取りするためのインターフェースです。
OSが提供するWin32APIやデバイスドライバとセットで開発されるライブラリが提供する専用APIによりデバイスドライバとアプリケーションがやり取りを行います。

APIはユーザーモードのアプリケーションから呼ばれ、アプリケーションの要求をOSの中核であるカーネルに渡します。カーネルはアプリケーションの要求をデバイスドライバに送り、最終的にハードウェアへ要求を伝えます。アプリケーションからデバイスを操作する際、カーネルに命令を渡すAPIは欠かすことができません。
<div align="center">
<img src=https://user-images.githubusercontent.com/73565470/106257110-776d5080-625f-11eb-97b6-674d96d4080a.png>
</div>

デバイスドライバ開発におけるAPIの提供方法としては、大きく2つあります。
OSで取り決められているデバイスクラスに対応する「デバイスインターフェース」と、独自に公開する「専用API」です。

デバイスインターフェースは、OSにより決められたインターフェースに則り、対応するWin32APIや.NETなどのOSが提供するライブラリを介してデバイスとやり取りを行います。
デバイスドライバは、OSにより決められているインターフェースに準拠するように処理を行います。

専用APIはそのデバイスドライバ固有に決めたインターフェースであり、ユーザーモード層からはCreateFile、WriteFile、ReadFile、DeviceIoControlなどの特定のAPIにてデバイスドライバとやり取りを行います。一般的には、カーネル層とアプリケーションの間に、デバイスドライバとやり取りを行うためのライブラリを開発し、そのライブラリからアプリケーションにAPIを提供します。

これらAPIを理解し、正しく使用することはとても重要です。まず、APIの引数が出力か入力かをきちんと理解する必要があります。また、APIが正常に実行されたかを確認するために、アプリケーションではAPIの戻り値をチェックする必要もあります。


## ハードウェアインターフェース

ハードウェアインターフェースはデバイスとPCを接続するためのインターフェースです。
ハードウェアインターフェース毎に規格が定められ、さらにデバイスの種類に応じてプロトコルなどの仕様が異なります。デバイスとやり取るするには、その仕様に対応するデバイスドライバが必要となり、デバイスドライバはアプリケーションからの要求を適切にハンドリングして、インターフェースに合わせて変換することでデバイスを操作します。そのため、デバイスドライバの開発者はその対応するインターフェースについて理解する必要があります。

皆さんが普段使用しているPCには、ほぼ必ずと言って良いと思いますがUSBポートが付いていると思います。他には、モニターを接続するためのHDMIポートやD-subポート、オーディオを接続するためのオーディオ端子(マイク/スピーカー)、インターネット接続のためのLANポートなどを見かけることが多いと思います。
今では少なくはなりましたが一応現役のキーボードやマウスを接続するためのPS/2ポートや、今ではほとんど見かけないIEEE1394やPCカード、シリアルポート、パラレルポートなどがあります。

ハードウェアインターフェースは、今では超高速化したUSBに置き換えられてしまいましたが、過去に使用されていたインターフェースについてもそのうちまとめて見たいと思います。



## まとめ
今回は「デバイスドライバとは」をテーマにデバイスドライバの役割や標準ドライバについて説明しました。また、アプリケーションがデバイスドライバと通信するために必要なソフトウェアインターフェースやデバイスとPCを接続するためのハードウェアインターフェースについても触れました。普段意識することは少ないかもしれませんが、デバイスドライバが私たちの生活に深く関わっていることをご理解いただけたと思います。

次回以降はデバイスドライバの開発に関する内容について説明していこうと思いますのでよろしくお願いいたします。