今回はデバイスドライバの開発方法について記載いたします。
デバイスドライバといってもイメージが湧かない方もいらっしゃるのではないでしょうか。
購入したばかりのUSBメモリをPCに挿した時、「画面右下にドライバをインストール中です」というポップアップが表示されたのを見た経験をした方も多いでしょう。
この時、インストール中のものがデバイスドライバといわれるもので、れっきとしたソフトウェアの仲間です。
Windowsパソコンの場合、例えば、次のフォルダの中にxxx.sysなるファイルがたくさんありますが、これこそドライバファイルの本体です。(アプリケーションのexeファイルに相当します。)
C:\Windows\System32\drivers
Linuxパソコンの場合、拡張子がsysではなくko(xxx.ko)となります。
ただし、同じソフトウェアといっても、Windowsアプリやスマートフォンアプリ、サーバアプリとは大きく性質が異なるソフトウェアです。
このため単独でご説明するより普段、よく利用するアプリケーションと比較したほうが、わかりやすいでしょう。
デバイスドライバとアプリケーションの比較
動作するためのメモリ空間
- アプリケーションの場合
ユーザー空間といわれるメモリ上に存在する。 - デバイスドライバの場合
カーネル空間といわれるメモリ上に存在する。
ユーザー空間、カーネル空間といってもイメージは難しいと思いますので、実社会で例えてみましょう。
地球の表面で私たち人類や動物が生活する空間(陸、川、山、湖、海)がユーザー空間、私たち人類がまだ立ち入ったことがない地球奥深くのマントルや核といわれるマグマ渦巻く空間がカーネル空間というイメージです。
カーネル空間はOS(Windows/Linux)が動作するための専用の空間です。なおOSの定義もまちまちで、OSのより狭義での意味合いでカーネルと呼ばれることもあります。
それと同じカーネル空間上にデバイスドライバは存在します。このためドライバとはOSの一部とも言えます。
ハードウェアへのダイレクトなアクセスの可否
- アプリケーションの場合
不可 - ドライバの場合
可能、このため、ドライバはアプリケーションがハードウェアを制御したい時の橋渡しの役目を担います。
開発方法
- アプリケーションの場合
様々なIDE(Visual Studio, Eclipse等々)が豊富に存在する。
視覚的、直観的に開発でき、開発言語(Java,C#等々)も多種多様。 - ドライバの場合
昔からほとんど変わらない伝統的な開発環境で行う(コンパイラや標準出力などソフトウェア開発で最低限必須のものしか利用できないと考えて置くぐらいがちょうど良い)。
開発言語はC言語、アセンブリ言語と限られる。
習得期間
- アプリケーションの場合
開発手順についての情報には困ることはなくその人のやる気次第では数日の学習で作れたりします。
- ドライバの場合
デバイスドライバの開発にはハードウェアの知識・感覚が必要で、それは独学で身につけることは難しく、相応のハードウェア制御関連のアプリケーション開発経験(最低3年?)がスタートラインに立つために必要です。
しかし、近道もあります。
組み込みソフトウェア開発者(ファームウェア開発者)を最初から目指した場合です。
組み込みソフトウェアは開発言語はC言語でハードウェアに直接アクセスすることにより制御を行うため、動作空間(組み込みソフトウェアはユーザ空間、デバイスドライバはカーネル空間)以外は共通することが多いためです。
デバイスドライバ特有の特徴
デバイスドライバのソースコードの特殊性
デバイスドライバのソースコードを見た時、C言語で書かれていることは理解できるでしょう。
しかしその内容はアプリケーションとは全く異なり、はじめての人はコードからは全く処理内容がイメージできない方が多いと思います。そして自分には無理だとすぐ心が折れてしまうかもしれません。
でも安心してください。
デバイスドライバの開発はとても難しいことは否定しません。
とはいえ、一方で何十年も前から開発環境、プログラミング方法(お作法といっても過言でないぐらいです)はほとんど変わっていません。
ドライバの開発手順は、何十年も前から確立されたものが今でも使用されています。
私はかつてドライバ開発エンジニアを見て羨ましいと思うことがありました。
日々、技術の生まれ変わりが激しいIT業界にも関わらず、デバイスドライバの開発は生きた化石"シーラカンスのように昔から変わらなくて済むのですから(言いすぎかな?経験者の方、何かコメント頂ければ、幸いです)。
その参考としてデバイスドライバ関連の書籍は多くないのですが、私が利用していたものをご紹介させていただきます。
Windowsドライバ開発関連では、Windows Vistaデバイスドライバプログラミング(SoftBank Creative社)、一択。
つづいて、Linuxドライバ開発関連では、Linuxデバイスドライバ 第3版(オライリージャパン社)
いずれも、古い本ですが、内容は今でもほとんど十分に使えるものです。
デバイスドライバの基本概要
将来、ドライバ開発に携わった際に思い出して頂ければと思います。
デバイスファイルの種類
- ブロック型デバイス(ハードディスクやusbメモリ等)
- キャラクタ型デバイス(プリンタやモデム等)等々
システムコールの種類
アプリケーション(ユーザ空間)からデバイスドライバ(カーネル空間)を呼び出すためにOSが用意した関数は「システムコール」と言われる。
デバイスドライバの呼び出し関連としては代表的なものに下記5つがある。
- Open
- Close
- Read
- Write
- ioctrl
アプリケーションから上記のシステムコールを呼ぶことで、ドライバを介して、ハードウェアを制御できるという流れです。
同時にドライバ開発は上記システムコールの中身を作ることともいえます。
私が経験してきた会社ではデバイスドライバ開発はハードウェア開発者が手掛けることも多かったです。
しかし、ハードウェア開発者以外でもデバイスドライバの開発を経験することはハードウェアを制御するために必要なことの理解をより一層深めてくれるのでITエンジニアとしてのレベルを確実に一段階、底上げしてくれると確信しています。
是非、将来、何年後に機会があれば挑戦してみてください。