关于在linux 2.6下编译内核模块的方法
在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 模块了