ひさびさ

環境構築云々は同時並行で、と言いつつ 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 が終わらなひ。