はわわーっ

はわわわわっ

カーネルモジュールを作ってみる

まず簡単なところから。

#include <linux/init.h>
#include <linux/module.h>

MODULE_LICENSE("GPL");

static int __init hello_init(void)
{
	printk(KERN_ALERT "hello, world\n");
	return 0;
}

static void __exit hello_exit(void)
{
	printk(KERN_ALERT "bye\n");
}

module_init(hello_init);
module_exit(hello_exit);

Makefileはこんな感じ。ROOTDIR にはカーネルのソースがあるディレクトリを設定する。

obj-m := hello.o

ROOTDIR := /home/yomi/kernel/linux-3.11

default:
	$(MAKE) -C $(ROOTDIR) M=$(shell pwd) modules

clean:
	rm -f *.o *.ko

試してみる。

# insmod hello.ko
# rmmod hello
# dmesg
...(snip)
[12983.860538] hello, world
[13002.237657] bye

パラメータを設定してみる。

#include <linux/init.h>
#include <linux/module.h>

MODULE_LICENSE("GPL");

static int howmany = 1;
static char *whom = "world";
module_param(howmany, int, S_IRUGO);
module_param(whom, charp, S_IRUGO);

static int __init hello_init(void)
{
	int i;

	for (i = 0; i < howmany; i++)
		printk(KERN_ALERT "hello, %s\n", whom);

	return 0;
}

static void __exit hello_exit(void)
{
	printk(KERN_ALERT "bye\n");
}

module_init(hello_init);
module_exit(hello_exit);

これで insmod するときにパラメータを渡してやることができる。

# insmod hello.ko
# rmmod hello
# dmesg
...(snip)
[13428.846893] hello, world
[13440.548773] bye
# insmod hello.ko howmany=5 whom=foobar
# rmmod hello
# dmesg
...(snip)
[13503.821566] hello, foobar
[13503.821574] hello, foobar
[13503.821577] hello, foobar
[13503.821580] hello, foobar
[13503.821582] hello, foobar
[13508.280321] bye