|
○ はじめに
本文書では、筆者が Linux® でデバイスドライバを作成しようとした際に、カーネルに動的に追加機能を組み込むことが出来るカーネルモジュールの書き方について勉強したことを説明していきたいと思います。
筆者は、コンピュータでハードウェアを制御するプログラムを作りたいと思いながら社会人になったのですが、会社でそういう仕事がどんどん減ってしまって全然機会がありませんでした。しかし、雑誌等でデバイスドライバを作成して自作のハードウェアを制御する記事を読む度に、自分もやりたいという気持ちが大きくなっていきました。
そしてある日、「電子工作を勉強して自分のハードウェアを作り、それを動かすためのソフトウェアを書こう!」と決意しました。Linux でデバイスドライバを作成するには、カーネルに最初から組み込んでしまう方法と、動的に追加機能を組み込むことが出来るカーネルモジュールという形式で作成する方法があります。カーネルモジュールについて知っておけば、デバイスドライバのみならずカーネルに対する独自の拡張機能を簡単に組み込むことも出来るため、とても便利です。
最初に思い立ってからいつの間にか 3 年程たってしまい Linux カーネルも 2.6 がリリースされているわけですが、2.4 用の知識が全く無駄になってしまうわけではない(はず)なので参考になればと思っています。
本文書へのリンクは御自由にどうぞ。本サイト内の文章に関して何かご意見などがありましたら、ページ最下部にあるアドレスまで、あるいはここからお願いします。なお、本文書において使用しているサンプルコードを tar 形式で圧縮したものをsrc.tar.gz として置いてます。展開して得られる各ソースコードは EUC で書かれています。各ファイル名にはそのコードを使用した Lecture の番号が付加されています。このソースコードの使用に関しては、免責事項の記述を了承していただければ自由に使っていただいて構いません。
また、ソースコードを含めた文書全体のアーカイブ( tar 形式 )を driver24_doc.tar.gzとして置いてます。こちらも EUC で書かれています。
○ 前堤環境
Linux kernel 2.4.x で動作するカーネルモジュールを作成しますので、Linux kernel 2.4.x を使用していることを前提とします。また、途中ハードウェア制御の練習をするつもりですが、その際はプリンタポート ( パラレルポート ) を使用する予定です。ですので、プリンタポートが搭載されている PC である方が都合が良いです。
○ 免責事項
本サイトで公開している内容については可能な限り正確を期する様に心掛けていますが、著者の知識不足から技術的な誤りもしくは不適切な表現や誤植を含む可能性があります。これらの内容を使用することによって生 じる可能性のあるいかなる被害/損害に対して、著者は一切の責任を負えません。よって、ご利用になられる際はみなさん各自の責任で内容確認/動作確認を行って下さい。
なお、本サイト ( Linux Kernel Module programming ( Kernel 2.4 ) ) に掲載しているサンプルプログラムについては GNU General Public License version 2 (GPL v2) に従うこととします。GPL の公式サイトは http://www.gnu.org/licenses/gpl.htmlです。
○ 商標
- Linux は Linus Torvalds 氏の日本及びその他の国における登録商標または商標です。
- UNIX は The Open Group の米国及びその他の国における登録商標です。
- その他、本サイトの文書中に記載されている会社名や製品名は、一般に各社の商標または登録商標です。
- なお、本サイトの文書中では TM および R マークを明記していませんが、権利を侵害する意思や目的等は一切ありません。
○ 参考情報(文献、リンク)
- LINUX デバイスドライバ 第 2 版 Linux 2.4 対応, O'REILLY, 2002, ISBN-4-87311-081-5
Linux でのデバイスドライバ作成について、とても詳細に説明されています。 デバイスドライバ作成時には、一冊手元に置いておくことをお薦めします。 ただ、網羅しているがために初心者には流れが分かりにくい気がしますので、 当サイトや別のページ等で基本を勉強した後に再読する方が良いかもしれません。 Linux Device Drivers,2nd Edition: Online Bookで PDF が公開されています。
- Linux カーネルソースコード (配布サイト:
The Linux Kernel Archives)
言うまでもなく、現物を見ることが一番の勉強になるでしょう。 drivers ディレクトリ内部のコードを参照すれば、どの様にデバイスドライバを 実装しているのかが良く分かりますし、カーネル内部でどの様な仕組みで 実際に動作しているのか、調べれば調べる程分かって来ます。