2012年2月23日木曜日

カーネルモジュールの書き方

モジュール名 moduletest のモジュールを作ります。



■使い方
(モジュールの読み込み)
# insmod moduletest.ko
(モジュールの取り外し)
# rmmod moduletest


■C コード
#include <linux/module.h>
#include <linux/kernel.h> // for printk
#include <linux/sched.h>  // for jiffies

// insmod 時に呼ばれる
int init_module()
{
  printk("module being installed at %lu\n", jiffies);
  return 0; // 0 以外の値を返すと、insmod は成功しない
}

// rmmod 時に呼ばれる
void cleanup_module()
{
  printk("module being removed at %lu\n", jiffies);
}

■Makefile
KERNEL_SRCDIR = /usr/src/linux
BUILD_DIR = $(shell pwd)

TARGET = moduletest

obj-m := $(TARGET).o

all:
        make -C $(KERNEL_SRCDIR) M=$(BUILD_DIR) modules

■注1
カーネルのシンボルを使うので、カーネルのヘッダファイルが必要。
apt-get install linux-headers などを行う。

■注2
init_module, cleanup_module という名前を変えるためには、
module_init, module_exit などのマクロを使う。


static int __init modtest_module_init( void )
{
  printk( KERN_INFO "modtest is loaded\n" );
  return 0;
}


static void __exit modtest_module_exit( void )
{
  printk( KERN_INFO "modtest is removed\n" );
}

module_init( modtest_module_init );
module_exit( modtest_module_exit );

■注3
デバッグ出力したいときは、printk を使う。出力は dmesg で確認する。

■注4
モジュールが insmod できたかどうかは lsmod で確認する。

0 件のコメント:

コメントを投稿