「自分が Linux Kernel Driver を書いてきた経験を整理したい」という目的でこのページを書く予定です。既に世の中には数多くの Linux Kernel Driver を書くための参考書があります。このページがこれらの参考書より優れた記述になる自信はありません。Linux Kernel Driver を書こうとするとき、様々な疑問や気になることをフラフラしながら書いていく予定です。
Driver を書く上で知っていれば良い範囲で Linux Kernel を読んでいきます。多くの Kernel 解説書で触れているような 起動処理、排他制御、リソース管理(メモリ、ディスク、他)、プロセス・スレッド管理/スケジューリング、ファイルシステム等は軽く触れるだけにします。
全体を通してソースコードを追跡できる環境を使って Linux Kernel を読み進め、理解を深めるやり方で進めます。ソースコードを追跡する環境は web page として用意します。説明の各所でソースコード中のシンボルとそれに関連するソースコートを読めるリンクを張ります。一々リンクを辿るのは面倒かもしれません。それでも、ソースコードを読んでいくことを強く希望します。自分は Linux Kernel はソース自体が仕様書だと思っています。1 行、1 行、あるいはもっと細かく 1 演算子に相当する処理であっても、なぜその順で処理していくのか。いくつかの計算方法から、なぜその方法を選んだのか意図が込められている箇所があります。人間の言葉では書ききれない仕様です。
仮想環境を使い、Linux Kernel の基礎を理解していく予定です。driver を書き始める前に理解し、慣れることが多くあります。あまりにも多いので飽きてしまったり、実務のために必要な時間が少なくなってしまうかもしれません。
beagle bone black と実際のデバイスを使用して driver を開発していく予定です。
手短に言えば Linux あるいは POSIX 相当環境で、C 言語によるアプリケーション開発経験があると期待しています。最低限 2,000 行程度のアプリケーションを 4, 5 本は書いたという程度です。man page section 2 にある system call を使った経験がある。
恐らく仕事でコーディングルールが決まっている。あるいは教育機関で「良い」とされるコーディングルールを習ったと思います。Linux Kernel には独自のコーディングルールがあります(追記予定)。これらは、アプリケーションプログラマにとって衝撃的なルールでしょう。いくつかの例をみていくと。
文字の字体や記号、段落の背景色を使い文書の意図や背景を表現する箇所があります。記述が進むにつれ、表現は追加され、継続して読むのに問題が起きない範囲で若干の修正を加えるかもしれません。
字体と記号を使って、単語や文字列の由来や表現する内容を次のようにします。
表現内容 | 表現例 | 説明 |
---|---|---|
キーボード操作 | [Ctrl] + [Alt] + [Del] | キーボードを押す操作を表現します。 |
GUI コントロール | xterm | GUI の ウインドウ・タイトル、テキスト・ボックス、チェック・ボックスの様なコントロールを表現します。 |
可変要素 | major_number | 環境や状況によって変化する内容を表現します。 |
コンソール入力 | gcc -Wall -O -o main main.c | コンソールの入力を表現します。 |
コンソール出力 | Hello world. | コンソールの出力を表現します。 |
コンソール入力の可変要素 | down_loaded_directory | コンソールの入力の可変要素を表現します。 |
コンソール出力の可変要素 | 12:34:56 | コンソール出力の可変要素のうち注目が必要な部分を表現します。Kernel Log のタイムスタンプなど当たり前に変化し、話題の中では気にする必要がない部分はこの装飾を施しません。 |
コード断片 | if (likely(condition)) | 文章中のコード断片を表現します。関数名のようなシンボルはフォントを変えず、そのまま表記します。 |
本文の流れに付け加えるような参考になる情報、注意を要する事、深刻な問題を起こすような事項は囲みを使って表現します。表現内容が短い場合は、背景色だけ違う段落を用いて表現します。
ノート
付け加えて参考になる情報を緑色の囲みで書きます。応用できる事項、関連する事項、詳細や背景を説明します。
注意
注意が必要な情報を黄色の囲みで書きます。予測に反して起きる事柄、応用や修正が思ったほどには上手く行かない場合、深くソースコードの読解や挙動の把握が必要な場合を説明します。
警告
ほぼ禁止事項に関する内容を赤色の囲みで書きます。復旧困難な問題、追跡・解析が難しい問題、動作に不具合を起こす問題など、深刻な問題について説明します。
Linux Kernel 対する理解を深めるにはソースを読むことです。このページで説明を加えようとしているのは自己矛盾かもしれません。ソースコードは膨大な量です。何処を読めばよいのか、grep でシンボルを探しても見つからない。といった理解を困難にする問題もできる限り解決できるようにしていきます。