#author("2016-08-06T21:39:01+09:00","default:afuruta","afuruta")
* Hello World [#p0df494b]
ほぼ何もしない "Hello World" プログラムを作って Linux Kernel に組み込む単純なモジュールの作り方を見ていきます。まだ、デバイスドライバには遠いです。
** ソースコード [#r86823f5]
&ref(hello_world.tar.gz,,添付ファイル); に一式をまとめておきます。C 言語で実行部を、Makefile で構築手順を書きます。Makefile を書かずにコンパイルできるかというと、自分では試したことがないです。煩雑な記述をした割には得るものが無いでしょう。 
*** 実行部 [#h10ff46b]
#code(c,hello_world.c)
*** Makefile [#o9dc2a8d]
#code(Makefile)
** userland アプリ・ケーションと違うところ [#yb45c026]
*** module_init, module_exit [#d8f36181]
main() はありません。モジュールは Kernel に組み込まれる時 &ogdefs(module_init(),module_init,init.h); で指定した関数を実行します。モジュールが Kernel から外されるとき &ogdefs(module_exit(),module_exit,init.h); で指定した関数を実行します。

モジュールが「組み込まれた」、「外された」時に呼ばれる仕掛けを作ることができるのは分りました。デバイス・ドライバを構成するには足りません。「ハードウエアにドライバが対応するデバイスが追加されたら」、あるいは、「モジュールが組み込まれた時点で既にドライバが対応するハードウエアが存在したら」、呼び出される様な仕掛けをまだ作っていません。

*** printk [#w0e5feae]
&ogdefs(printk); は printf に相当する関数です。&ogfileone(書式文字列, Documentation/printk-formats.txt);を指定して変数内容を表示します。書式文字列は printf とよく似ています。興味深く注意が必要な拡張は %p とその派生書式です。ここでは printk のヘッダファイル読み込みに &ogfileone(linux/kernel.h,include/linux/kernel.h); を使用しました。もちろん、&ogfileone(linux/printk.h,include/linux/printk.h); を直接インクルードするのも良いでしょう。
#textbox(note,printk に浮動小数点形式の書式が無いようだが...){{
printkの書式に浮動小数点形式はありません。kernel の中では double, float とその派生型は使えません。自分は実施したことが無いのですが、浮動小数点レジスタの値とこれに関係するコンテキストを保存・復帰すれば使えるはずです。ただし、処理の出入り口に実装する程度の簡単なことではなく、suspend/resume、コンテキスト・スイッチ、プロセッサ active/idle の状況などを細かに意識する必要が有ります。実装に問題があるとアプリケーションで行っている計算結果が不意にとんでもない値になるなど問題追跡が難しい状況に陥ります。
}}
*** __init, __exit [#f0e4c8af]

** Linux Kernel に動的に組み込むモジュールとして作成する [#rafbd0e4]
*** Makefile を書く [#kea9666f]
** Linux Kernel に組み込む [#i3d8ce65]
*** 何も起きない? dmesg で確かめよう [#v37a74c8]
*** printk は何処と結合しているの? [#g9da7396]
*** 多重に組み込めない [#c6e7352f]
* Hello Friend [#x7542c70]
** パラメータを入力する [#a8504c49]
** エラーを返してみよう [#fca65edf]

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS