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
下面就可以进行编译自己的内核模块了,举个例子:
(Hello.c)
#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);
(Makefile)
obj-m := hello.o
KDIR := /usr/src/linux
PWD := $(shell pwd)
ndefault:
$(MAKE) -C $(KDIR) M=$(PWD) modules
执行命令:
make
加载内核模块:
insmod hello.ko
卸载模块:
rmmod hello