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

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

Makefile作る

$ echo "obj-m := mymod.o" >Makefile

モジュール作る

$ vi mymod.c

内容

#include
#include
#includestatic int sec=5;
module_param(sec, int, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(sec,"Set the interval.");

static void mymod_timer(unsigned long data);

static DEFINE_TIMER(timer,mymod_timer,0,0);

static void mymod_timer(unsigned long data)
{
    printk(KERN_INFO "mymod: timer\n");
	mod_timer(&timer,jiffies + sec * HZ);
}

static int mymod_init(void)
{
	printk(KERN_INFO "mymod: init\n");
	if (sec

makeする

$ make -C /lib/modules/`uname -r`/build M=`pwd`

モジュール情報を参照する

$ modinfo mymod.ko
filename:       mymod.ko
description:    My module
license:        GPL
author:         testauther
srcversion:     50B6B0B23BAEBE637023B86
depends:        
vermagic:       3.0.0-24-generic-pae SMP mod_unload modversions 686 
parm:           sec:Set the interval. (int)

モジュールを組み込む

$ sudo insmod mymod.ko

dmesgにモジュールの実行結果が出力されている!

$ dmesg | tail
[ 7154.226058] mymod: init

/sysにディレクトリできてる

$ ls /sys/module/mymod 
holders  initstate  notes  parameters  refcnt  sections  srcversion

パラメータ情報を取得

$ cat /sys/module/mymod/parameters/sec 
5