分类: LINUX
2009-04-27 11:01:52
安装源码包:
# rpm –Uvh kernel-2.6.11-1.1369_FC4.src.rpm
这个将 RPM 内容写到路径
/usr/src/redhat/SOURSE
和
/usr/src/redhat/SPECS
build源码包:
# cd /usr/src/redhat/SPECS
# rpmbuild -bp --target i686 kernel-2.6.spec
这个命令将会把内核源码树放到
/usr/src/redhat/BUILD/kernel-2.6.11/kernel-2.6.11.686
配置内核:
Fedora Core 附带的内核配置在
~/kernel-2.6.11.686/configs/ 目录。
例如,i686 SMP 配置文件被命名为
configs/kernel-version-i686-smp.config。
使用下列命令来将需要的配置文件复制到合适的位置,用来编译:
# cd /usr/src/redhat/BUILD/kernel-2.6.15/linux-2.6.15.i686
# cp configs/kernel-version-i686-smp.config .config //记住要养成备份的好习惯!
您也可以在 /lib/modules/version/build/.config 这个位置找到与您当前的内核匹配的 .config 文件。
注意:
您的内核必须已经启用这些选项进行了编译(用make menuconfig调出内核配置菜单):u
Loadable module support --->
[*] Enable loadable module support
[*] Module unloading
[ ] Module versioning support (EXPERIMENTAL)
[*] Automatic kernel module loading
稍微更改一下Makefile:
每个内核的名字都包含了它的版本号,这也是 uname -r 命令显示的值。内核Makefile 的前四行定义了内核的名字。为了保护官方的内核不被破坏,Makefile
经过了修改,以生成一个与运行中的内核不同的名字。在一个模块插入运行中的内核前,这个模块必须针对运行中的内核进行编译。为此,您必须编辑内核的
Makefile。
例如,如果 uname -r 返回字符串 2.6.11-1.1369_FC4,就将 EXTRAVERSION 定义从:
EXTRAVERSION = -prep
修改为:
EXTRAVERSION = -1.1369_FC4
也就是最后一个连字符后面的所有内容。
编译内核:
跟普遍的编译方法一样了:
# make bzImage 编译内核
# make modules 编译模块
# make modules_install 安装编译
完成“内核树”的安装:
目录“/usr/src/redhat/BUILD/kernel-2.6.11/kernel-2.6.11.686/”中就是所谓的“内核代码树”
但是“/lib/modules/2.6.11-1.1369_FC4/build”是个符号链接,也指向这个目录,所以这里也可以叫做“内核代码树”
编写内核模块源文件:
// hello.c
#include
#include
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void) {
printk(KERN_ALERT "Hello, world\n");
return 0;
}
static void hello_exit(void) {
printk(KERN_ALERT "Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);
编写makefile
ifneq ($(KERNELRELEASE),) //别把逗号忘了;
obj-m := hello.o
else
KERNELDIR ?= /lib/modules/$( uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules //-c为大写;
endif
10. 执行make命令进行编译就行了, 执行完毕后,会生成几个文件:
hello.ko
hello.mod.c
hello.mod.o
hello.o
运行命令:
# insmod hello.ko
应该可以看到返回的信息:Hello, world
然后再运行命令:
# rmmod hello
应该可以看到返回的信息:Goodbye, cruel world
小提示:如果没有看到信息到/var/log/messages中你就会看到,bye!