linux-2.6用カーネルモジュールを作ろう

linux-2.6になってMakefileがかなり改良されたみたい.いろいろ試してみる.

まず,linux-2.6用カーネルモジュール(ドライバ)の build に必要なファイルは,だいたい以下の通り.

/usr/src/linux/Makefile
/usr/src/linux/arch/i386/Makefile
/usr/src/linux/scripts/
/usr/src/linux/include/
/usr/src/linux/.config


たとえば,dummy.c から driver.ko を生成する場合だと,まず次のような Makefile を用意して

EXTRA_CFLAGS += -Wall

obj-m += driver.o

driver-objs := dummy.o

dummy.c をさくっと書く.

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


MODULE_AUTHOR("hoge FUGA <foo@example.com>");
MODULE_DESCRIPTION("dummy Driver");
MODULE_LICENSE("GPL");

static int __init dummy_init(void)
{
        printk(KERN_DEBUG "dummy: init\n");
        return 0;
}

static void __exit dummy_cleanup (void)
{
        printk(KERN_DEBUG "dummy: cleanup\n");
}


module_init(dummy_init);
module_exit(dummy_cleanup);


あとは,build するだけ.

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

ついでに,make clean は次のようにする.

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

すげー便利.

また以下のようなオプションも提供される.

  make V=0|1 [targets] 0 => quiet build (default), 1 => verbose build
  make O=dir [targets] Locate all output files in "dir", including .config
  make C=1   [targets] Check all c source with checker tool

デバッグ中は V=1 は必須.

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

詳細は make help でみることができる.