安装内核源码包:
1.# rpm –Uvh kernel-2.6.11-1.1369_FC4.src.rpm
这个命令将 RPM 内容写到路径
/usr/src/redhat/SOURSE
和
/usr/src/redhat/SPECS
2. 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
3. 配置内核:
Fedora Core 附带的内核配置文件在
~/kernel-2.6.11.686/configs/ 目录。
1.# rpm –Uvh kernel-2.6.11-1.1369_FC4.src.rpm
这个命令将 RPM 内容写到路径
/usr/src/redhat/SOURSE
和
/usr/src/redhat/SPECS
2. 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
3. 配置内核:
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 menuconfi
g调出内核配置菜单):u
Loadable module support --->
[*] Enable loadable module support
[*] Module unloading
[ ] Module versioning support (EXPERIMENTAL)
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 menuconfi
g调出内核配置菜单):u
Loadable module support --->
[*] Enable loadable module support
[*] Module unloading
[ ] Module versioning support (EXPERIMENTAL)
[*] Automatic kernel module loading
4. 稍微更改一下Makefile:
每个内核的名字都包含了它的版本号,这也是 uname -r 命令显示
的值。内核Makefile 的前四行定义了内核的名字。为了保护官方的
内核不被破坏,Makefile
经过了修改,以生成一个与运行中的内核不同的名字。在一个模块插
4. 稍微更改一下Makefile:
每个内核的名字都包含了它的版本号,这也是 uname -r 命令显示
的值。内核Makefile 的前四行定义了内核的名字。为了保护官方的
内核不被破坏,Makefile
经过了修改,以生成一个与运行中的内核不同的名字。在一个模块插
入运行中的内核前,这个模块必须针对运行中的内核进行编译。为此,
您必须编辑内核的Makefile。
例如,如果 uname -r 返回字符串 2.6.11-1.1369_FC4,就将 EX
TRAVERSION 定义从:
EXTRAVERSION = -prep
修改为:
EXTRAVERSION = -1.1369_FC4
也就是最后一个连字符后面的所有内容。
5. 编译内核:
跟普遍的编译方法一样了:
# make bzImage 编译内核
# make modules 编译模块
# make modules_install 安装编译
6. 完成“内核树”的安装:
目录“/usr/src/redhat/BUILD/kernel-2.6.11/kernel-2.6.11.686/”
中就是所谓的“内核代码树”
但是“/lib/modules/2.6.11-1.1369_FC4/build”是个符号链接,也
指向这个目录,所以这里也可以叫做“内核代码树”
7. 编写内核模块源文件:
您必须编辑内核的Makefile。
例如,如果 uname -r 返回字符串 2.6.11-1.1369_FC4,就将 EX
TRAVERSION 定义从:
EXTRAVERSION = -prep
修改为:
EXTRAVERSION = -1.1369_FC4
也就是最后一个连字符后面的所有内容。
5. 编译内核:
跟普遍的编译方法一样了:
# make bzImage 编译内核
# make modules 编译模块
# make modules_install 安装编译
6. 完成“内核树”的安装:
目录“/usr/src/redhat/BUILD/kernel-2.6.11/kernel-2.6.11.686/”
中就是所谓的“内核代码树”
但是“/lib/modules/2.6.11-1.1369_FC4/build”是个符号链接,也
指向这个目录,所以这里也可以叫做“内核代码树”
7. 编写内核模块源文件:
// hello.c
#include <linux/init.h>
#include <linux/module.h>
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");
}
#include <linux/init.h>
#include <linux/module.h>
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
module_exit(hello_exit);
编写makefile
ifneq ($(KERNELRELEASE),) //别把逗号忘了;
obj-m := hello.o
else
KERNELDIR ?= /lib/modules/$(shell 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
运行命令:
obj-m := hello.o
else
KERNELDIR ?= /lib/modules/$(shell 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!
应该可以看到返回的信息:Hello, world
然后再运行命令:
# rmmod hello
应该可以看到返回的信息:Goodbye, cruel world
小提示:如果没有看到信息到/var/log/messages中你就会看到,
bye!