はじめに

[| ]  最終更新: 2023/02/14 18:33:37

このページの目的

このページは、「デバイスドライバを作ることになってしまった方」を対象にした、解説ページです。

純粋なソフト屋さんが「つくることになってしまった」ということは普通はないでしょうし、そもそもロボット制御屋が書いているので、対象は「ハードの制御屋さん」に片寄ってます。

対象は Linux 2.0, 2.2 で、同時に対応できるドライバを目指します。
(いま、2.0系列、どのくらい需要があるんでしょうか... というか時代は2.4, 2.6時代)

おおよそ、世のハードウェアのドライバを書くために必須な情報はそろえたつもりですが、ときどき追加、FIXは行われます。
(という予定が2.4以降放置。あまり変わっていないはずですが)

個人的趣味では select ははずせません。特にハードウェアのドライバとしては、select でデバイスまとめて全部待機、というのが非常に便利です。


構成

デバイスドライバに頼らないハードウェア操作

「ハードウェアにドライバがない。使えないじゃないか。ドライバつくらなきゃ」という直感的(私もですが)な理由でドライバをつくることにした方に思い止まって頂くページです。

それ以外にも、ドライバの心臓部のデバッグ作業を普通のプロセスで行うために必要な情報を提供します。

早い話が「Linuxはふつうのプロセスで十分ハードを触れます」です。

モジュールをつくる

Linuxではデバイスドライバをつくるのに、カーネルにしっかり組み込んでしまう方法と、モジュールとして必要なときにロードする方法があります。 もちろん、簡単なのは後者で、ふつうは後者で済みます。その簡単なつくりかたを解説します。

簡単なキャラクタデバイスをつくる

ここでは、読み書き機能のあるキャラクタ型デバイスをつくります。 最初は open/close のみ対応、次に read, write 機能について述べます。 ただドライバをつくる、というだけなら、最低限これらの機能があればいいでしょう。 Linux 2.0 でも 2.2 でもコンパイル可能なソースつき。

ドライバ作成のための小ネタ

キャラクタデバイスを拡張する前に、知っていて損はない、ハードウエアのデバイスドライバをつくるときに便利な手法を示します。

PCIデバイスの検出

なぜか、ここでPCIがはさまってますが、PCI上のデバイスを扱うための情報収集法です。

IOCTLをつかう

ioctl というと、案外マイナーな存在ですが、ハード制御のためのデバイスドライバを作るときには、実はかなり便利です。 ドライバをつくってみて、初めてioctl に親しみが沸きました。

ブロックとSelect

ハードウェアに対して情報をやり取りするときには、ハードの読み書きの準備が出来ているかどうかを確認することが必要なこともあります。 そのようなとき、ioctlなどで調べるのもひとつですが、read/write を準備ができるまで待たせた上で読み書き実行するようにするブロック、読み書きの準備が出来るまで休眠させるselectについてここでは述べます。 selectについては、他のデバイス(キー入力、ネットワーク等)とまとめて待機できるので、使い道の幅が広がります。

割り込みを使う

ハードウェア割り込みというと、割り込みコントローラの設定やら、割り込みハンドラの書き方やら、面倒というイメージがありますが、Linux の割り込み機能は簡単です。 関数ひとつ登録すればいいのです。 さすがに、割り込みの実験は若干危そうなのですが、やはり実験で体験するのがいいでしょう。 select と併用することで、ただのユーザプロセスで割り込みを受け取るような仕掛けをつくることも可能です。


このページの由来

もともと、ロボット制御屋である私は、長いことMS-DOSで制御をしてきたのですが、一念発起して Linux への移行を決断しました(すでに論文作成などではつかっていたのですが)。

そこで、壁になったのが、ハードへのアクセスです。とりあえず、デバイスドライバなしでもある程度使えることはわかっていたので、無理だったらあきらめる覚悟でドライバをつくってみることにしました。 それも、ISAが滅びるこれからの時代に対応できるようにPCIバス対応の。 そのために、先生(当時は学生)にPCIのPIOボードを買って頂いていじり始めたのでした。
(Linux で制御っていったらRT-Linuxでは? という疑問に対してはこちら。)

もし、そのときに、オーム社の「LINUXデバイスドライバ」(山崎康宏・山崎邦子 共訳)をみつけていたら、たぶんこのページ(の前身)を書こうとは思いませんでした。 私がいじり始めたのが1999年の2月ころ、本(第一版)が出たのは1998年12月、微妙なタイミングです。 いじり始めたときには適当な情報源がなく、WWWでもページを2つほどみつけただけでした。 これらのページは情報としては覚え書き的性格のもので、そのままドライバ作成に直結するものではありませんでしたが、非常によい取っ掛かりにはなりました。 そのあとはひたすら試行錯誤&カーネル解析の連続でした。 そのときの「やっぱり Linux のソースはいい参考書だ」としみじみ思ったものです。

せっかくドライバを書いたので、それを公開し、かつ、解説をつくることにしました。それが本ページの前身です。 内容的には(たぶん)まちがってはいなかったのですが、なんていうか今見ると見辛いです(笑)。 それでも、複数の方が参考にしてくださり、幸せになって頂きました。 あまつさえ、デバイスドライバの講演依頼まで来てしまい、これはもっと情報を拡充せねば、ということで、書き直しです。

「LINUXデバイスドライバ」があるのになぜまた?、というところですが、世の中にはあまたのC言語の入門書と「プログラミング言語C」があります。 「LINUXデバイスドライバ」が「プログラミング言語C」にあたり、バイブルです。このページは入門書で、面倒なことは省いたり、細かい解説抜きだったりしますが、とっかかりにはなるように、自分が学んだ過程をたどります。

ちなみに、やるからには(講演会で)嘘教えてはいけないので、「バイブル」はこのあいだ買ってきました。 しばらく前に見たときには、ちらっとみて「あ、この内容なら、しってるからいらないや」と買わずに済ませてたんですけど。 ただ、本を買ったら今度はブロック型デバイスがつくりたくなって不穏です。
#そんな暇ないのに。

と、いうところから、もう3年が流れて、勤務先も移り、Linuxのカーネルもまもなく2.6という時代です。 それなのに、2.2時代のページを残しておくのは、いまだに多くのアクセスがあるからで、なぜ2.2のままなのかというと、2.4以降は忙しくなって、あまりいじれなかったからです(言い訳)。 ただ、もしかして、もしかすると、1年以内くらいに何かの拍子に2.6対応ページになっているかもしれません(笑)。 その願いをこめて、リニューアルしました@030831。

なお、その途中で、雑誌記事になりました。そちらもご参考に。配布資料置き場に記事PDFもおいておきました。 ご参考になれば幸いです。


このページは

HTMLとTeXの中間をめざした、独自開発のページフォーマッタ formHTMLを使用しています。 「ここの色がなんとかならんか」という要望は1分で解決できますので、いい色使いの案をお待ちしております。


熊谷正朗 [→連絡]
東北学院大学 工学部 機械知能工学科 RDE
[| ]