ひさびさ
環境構築云々は同時並行で、と言いつつ businesscard なソレが無ひ。
とりあえず教科書にしているのはピアソンの実習 Linux カーネルなんですが、材料が 2.2 系だったりするんですが構わずヤッてみます。
順番としては
というカンジでナニ。
とりあえず
今から中身を確認して取りかかる手筈ではあるのですが、2.6 なモジュールのソレをおさらいしておく事に。参考にしたコンテンツは_Linux Kernel 2.6.x プログラミングガイド_ッス。
ええと、とりあえず適当なディレクトリを掘って hello.c を作成。
#include <linux/module.h> // required by all modules #include <linux/kernel.h> // required by printk() #include <linux/init.h> MODULE_LICENSE("GPL"); MODULE_AUTHOR("Zoe"); // Start/Init function static int hello_init(void) { printk(KERN_ALERT "Hello world!\n"); return 0; } // End/Cleanup function static void hello_exit(void) { printk(KERN_ALERT "Goodbye world!\n"); } module_init(hello_init); module_exit(hello_exit);
ええと、module_{init, exit} は include/linux/init.h で定義されている模様。
#define module_init(x) __initcall(x); #define module_exit(x) __exitcall(x);
で、色々探そうとしたら GTAGS が無い、と emacs が言いやがる。確かに無いなぁ。とりあえず init.h 見てみたら微妙なマクロが満載だったのでとりあえずスルー。
以下の Makefile を作成し
obj-m := hello.o KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
make してみた。
$ LANG=C make make -C /lib/modules/2.6.20/build SUBDIRS=/home/rms/kernel/kernel_exercise/1.kernel_module modules make[1]: Entering directory `/home/rms/kernel/linux-2.6.20' CC [M] /home/rms/kernel/kernel_exercise/1.kernel_module/hello.o Building modules, stage 2. MODPOST 1 modules CC /home/rms/kernel/kernel_exercise/1.kernel_module/hello.mod.o LD [M] /home/rms/kernel/kernel_exercise/1.kernel_module/hello.ko make[1]: Leaving directory `/home/rms/kernel/linux-2.6.20' $ ls Makefile Module.symvers hello.c hello.ko hello.mod.c hello.mod.o hello.o $
で、indmod して rmmod した時の log が以下
Jul 29 22:30:49 debian kernel: Hello world! Jul 29 22:31:00 debian kernel: Goodbye world!
以上の know-how を元にカーネルモジュールの章を再読予定。
げ
中身のナニが丸出しやっさ。
そりゃ良いのですが
gtags -v が終わらなひ。