ほぼ何もしない "Hello World" プログラムを作って Linux Kernel に組み込む単純なモジュールの作り方を見ていきます。まだ、デバイスドライバには遠いです。
添付ファイル に一式をまとめておきます。C 言語で実行部を、Makefile で構築手順を書きます。Makefile を書かずにコンパイルできるかというと、自分では試したことがないです。煩雑な記述をした割には得るものが無いでしょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | - | | | ! - | ! - | | ! - ! |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | - | | | | | | | | | ! - ! - | |
|
main() はありません。モジュールは Kernel に組み込まれる時 module_init() で指定した関数を実行します。モジュールが Kernel から外されるとき module_exit() で指定した関数を実行します。
モジュールが「組み込まれた」、「外された」時に呼ばれる仕掛けを作ることができるのは分りました。まだ、モジュールにはデバイス・ドライバの機能を実装していません。実装していないので、「ハードウエアにドライバが対応するデバイスが追加されたら」、あるいは、「モジュールが組み込まれた時点で既にドライバが対応するハードウエアが存在したら」、呼び出される様な仕掛けはできていないのです。
printk は printf に相当する関数です。書式文字列を指定して変数内容を表示します。書式文字列は printf とよく似ています。興味深く注意が必要な拡張は %p とその派生書式です。ここでは printk のヘッダファイル読み込みに linux/kernel.h を使用しました。もちろん、linux/printk.h を直接インクルードするのも良いでしょう。
printk に浮動小数点形式の書式が無いようだが...
printkの書式に浮動小数点形式はありません。kernel の中では double, float とその派生型は使えません。自分は実施したことが無いのですが、浮動小数点レジスタの値とこれに関係するコンテキストを保存・復帰すれば使えるはずです。ただし、処理の出入り口に実装する程度の簡単なことではなく、suspend/resume、コンテキスト・スイッチ、プロセッサ active/idle の状況などを細かに意識する必要が有ります。実装に問題があるとアプリケーションで行っている計算結果が不意にとんでもない値になるなど問題追跡が難しい状況に陥ります。