Chinaunix首页 | 论坛 | 博客
  • 博客访问: 636039
  • 博文数量: 205
  • 博客积分: 7891
  • 博客等级: 少将
  • 技术积分: 2168
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-29 13:16
文章分类

全部博文(205)

文章存档

2015年(4)

2014年(5)

2013年(1)

2012年(4)

2011年(51)

2010年(86)

2009年(45)

2008年(9)

分类: 嵌入式

2009-10-10 08:36:55

在Fedora6中测试
安装内核源码包:
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 menuconfig调出内核配置菜单):u
Loadable module support --->
[*] Enable loadable module support
[*] Module unloading
[ ] Module versioning support (EXPERIMENTAL)
[*] Automatic kernel module loading
4. 稍微更改一下Makefile:
每个内核的名字都包含了它的版本号,这也是 uname -r 命令显示
的值。内核Makefile 的前四行定义了内核的名字。为了保护官方的
内核不被破坏,Makefile
经过了修改,以生成一个与运行中的内核不同的名字。在一个模块插
入运行中的内核前,这个模块必须针对运行中的内核进行编译。为此,
您必须编辑内核的Makefile。
例如,如果 uname -r 返回字符串 2.6.11-1.1369_FC4,就将 EXTRAVERSION 定义从:
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
#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/$(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
注:如果重复安装 会提示File exist 错误 

然后再运行命令:
# rmmod hello
应该可以看到返回的信息:Goodbye, cruel world
 小提示:如果没有看到信息到/var/log/messages中你就会看到,
bye!
阅读(801) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~