monolithic kernel

Linuxのカーネルモジュールを書いてみる

Linuxのカーネルモジュールを書いてみるメモ。ここで作るのはLoadable Kernel Module(LKM)と呼ばれるものです。

なお、確認はUbuntu 11.04上で行っています。

ヘッダのインストール

カーネルモジュールのコンパイルに必要なヘッダをインストールします。

sudo apt-get install linux-headers-`uname -r`

何もしないカーネルモジュール

読み込み時と終了時にメッセージを表示するだけで何もしないカーネルモジュールを書いてみます。

vi hellolkm.c
vi Makefile

hellolkm.c

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

static int on_init(void) {
    printk("module_init\n");
    return 0;
}

static void on_exit(void) {
    printk("module_exit\n");
}

module_init(on_init);
module_exit(on_exit);

Makefile

obj-m := hellolkm.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

all:
  $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

clean:
  rm -rf *.o *.ko *.mod.c *~

動作確認

makeでモジュールを生成し、insmodで読み込み、rmmodで除去を行います。モジュール内でprintk関数を利用して出力した内容は/var/log/syslogで確認できます。

make
sudo insmod hellolkm.ko
sudo rmmod hellolkm
sudo tail /var/log/syslog
Jun 10 19:46:33 ubuntu-desktop64 kernel: [  363.989941] module_init
Jun 10 19:46:37 ubuntu-desktop64 kernel: [  368.370531] module_exit

参考