Linux2.6下内核模块编译
经过几天的努力,自己写的内核模块终于可以在linux2.6下编译并加载道内核中了,现在对这几天的努力做个总结。
在旧的版本下(如linux 2.4)linux内核模块的编译只需要有内核的头文件就行了,就可以通过和编译其他程序一样的方法编译成filename.o文件,这个.o文件是直接可以加载道内核中的,加载之后就可以用了,然而在2.6下就截然不同了,在linux 2.6下内核的编译要有系统内核树的支持,至于怎么去构建内核树,现在找到的方法,也估计是最笨的办法,那就是重新编译内核,下面就把2.6内核编译的过程做一纪录:
注:1.version是指内核版本号,可用uname –r命令的到
2.以下命令在root用户下进行
3.以下是以FEDORA CORE5为例
1. 得到linux源文件
从 ftp://ftp.kernel.org/pub/linux/kernel/v2.6 中下载,或从源码包中找(一般名为:kernel-version.src.rpm),要和内核版本一样的
2. 安装kernel-version.src.rpm:到/usr/src/redhat/SOURSE
#rpm –Uvh kernel-2.6.15-1.2054_FC5.src.rpm
3. 准备源码:
#cd /usr/src/redhat/SOURSE
#rpmbuild -bp --target $(uname -m) kernel-2.6.spec
内核源码位于/usr/src/redhat/SOURSE/kernel-version下
4. 做个连接:
#cd /usr/src/
# ln -s ./redhat/BUILD/kernel-version/linux-version.i686/ linux
#cd linux
5. 修改Makefile
例如uneme –r得到的为 2.6.15-1.23_FC5
就将Makefile中EXTRAVERSION = -prep改为:EXTRAVERSION = -1.23_FC5
6. 内核编译选项
#make menuconfig
具体配置略,可按照默认的配置
7. 编译内核
#make bzImage
8. 编译模块
#make modules
9. 安装编译
#make modules_install
下面就可以进行编译自己的内核模块了,举个例子:
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
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);
obj-m := hello.o
KDIR := /usr/src/linux
PWD := $(shell pwd)
ndefault:
$(MAKE) -C $(KDIR) M=$(PWD) modules