在linux 2.4下编译内核模块的方法通常是:

gcc -Wall -DMODULE -D__KERNEL__ -DLINUX -c hello.c

可是在2.6下使用上面的方法编译生成的 hello.o 在加载时会提示:

insmod: error inserting 'hello.o': -1 Invalid module format

在网上搜索了一下,终于找到在2.6下编译模块的方法,现记录在blog中 :p

2.6的模块,扩展名为.ko,而不是2.4下的.o

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

static int dummy_init(void)
{
    printk("hello,world.\n");
    return 0;
}
static void dummy_exit(void)
{
    return;
}

module_init(dummy_init);
module_exit(dummy_exit);

MODULE_LICENSE("GPL")

2.6中编译模块的方法是写一个Makefile,由内核的Kbuild来帮你编译,例如编译上面的hello.c:

obj-m := hello.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules


#make
make -C /lib/modules/linux-2.6.11-gentoo-r6/build SUBDIRS=/home/matthew modules
make[1]: Entering directory `/lib/modules/linux-2.6.11-gentoo-r6'
  CC [M]  /home/matthew/hello.o
  Building modules, stage 2.
  MODPOST
  CC      /home/matthew/hello.mod.o
  LD [M]  /home/matthew/hello.ko
make[1]: Leaving directory `/lib/modules/linux-2.6.11-gentoo-r6'

现在就可以在2.6中正常加载 hello.ko 模块了