(转载)2.6内核的编译及内核树的建立---fedora core 5

来源:互联网 发布:java返回json字符串 编辑:程序博客网 时间:2024/06/05 02:13

这段话说出了2.4和2.6两种版本的驱动模块的编写的一个不同之处。问题来自,我用的操作系统是Fedora Core 5。FC5在安装时是不安装源代码树在PC上的。所以我必须在我的FC5上建立内核源代码树。最好在构造内核模块时运行的恰好是目标内核。书上的例子是在版本2.6.10中构造的,用命令uname -r查看,FC5的版本信息为:2.6.15-1.2054_FC5。所以我要建立的内核源代码树的版本为2.6.15。下面详细介绍其建立过程。

1。  下载内核rpm包
rpm包名称:kernel-2.6.15-1.2054_FC5.src.rpm
下载地址:http://download.fedora.redhat.com/pub/fedora/linux/core/5/source/SRPMS/
kernel-2.6.15-1.2054_FC5.src.rpm


2。   安装rpm包
以root身份登陆,以下步骤都以root身份执行。进入保存rpm包的目录下,运行命令:
#rpm -Uvh kernel-2.6.15-1.2054_FC5.src.rpm
该命令将rpm的内容写到路径/usr/src/redhat/SOURSE和/usr/src/redhat/SPECS下。


3。   build源码包
#cd /usr/src/redhat/SPECS
#rpmbuild -bp --target i686 kernel-2.6.spec

该命令将会把内核源码树放到目录
/usr/src/redhat/BUILD/kernel-2.6.15/kernel-2.6.15.686

4。    配置内核
Fedora Core 5附带的内核配置文件在内核源码树
的configs/目录下。
例如,i686 SMP 配置文件被命名为
configs/kernel-version-i686-smp.config。

但我的PC机为i686,单CPU,所以不是SMP,应该选的内核配置文件是:kernel-2.6.15-i686.config

注意:如果你的PC是单CPU的,而选
configs/kernel-version-i686-smp.config进行内核配置,则在建立代码树后运行后面的insmod hello.ko会失败,失败原因我在文件/var/log/messages中找到如下:
Nov 23 04:55:02 localhost kernel: hello: version magic '2.6.15-1.2054_FC5 SMP 686 REGPARM 4KSTACKS gcc-4.1' should be '2.6.15-1.2054_FC5 686 REGPARM 4KSTACKS gcc-4.1'
一对比:
'2.6.15-1.2054_FC5 SMP 686 REGPARM 4KSTACKS gcc-4.1'
'2.6.15-1.2054_FC5 686 REGPARM 4KSTACKS gcc-4.1‘
看出区别了吧,原因是我选的配置文件不对。
我一开始就犯了这个错误错误,结果不得不又从头开始进行漫长的编译。

使用下列命令来将需要的配置文件复制到合适的位置,用来编译:
#cd /usr/src/redhat/BUILD/kernel-2.6.15/linux-2.6.15.i686

#cp configs/kernel-version-i686.config .config
你也可以在 /lib/modules/version/build/.config 这个位置找到与您当前的内核匹配的 .config 文件。因为build是个连接,其连接目标就是/usr/src/redhat/BUILD/kernel-2.6.15/linux-2.6.15.i686

用以下命令调出内核配置菜单。
#make menuconfig
配置如下:
Loadable module support --->
[*] Enable loadable module support
[*] Module unloading
[ ] Module versioning support (EXPERIMENTAL)
[*] Automatic kernel module loading

5。    修改Makefile
每个内核的名字都包含了它的版本号,这也是 uname -r 命令显示的值。内核Makefile 的前四行定义了内核的名字。为了保护官方的内核不被破坏,Makefile经过了修改,以生成一个与运行中的内核不同的名字。在一个模块插入运行中的内核前,这个模块必须针对运行中的内核进行编译。为此,你必须编辑内核的Makefile。
例如,如果 uname -r 返回字符串 2.6.15-1.2054_FC5,就将 EXTRAVERSION 定义从:
EXTRAVERSION = -prep
修改为:
EXTRAVERSION = -1.2054_FC5
也就是最后一个连字符后面的所有内容。

6。   编译内核
在目录/usr/src/redhat/BUILD/kernel-2.6.15/linux-2.6.15.i686下即Makefile所在的目录使用下面命令编译内核:
#make bzImage           编译内核
#make modules           编译模块
#make modules_install   安装模块
这一步可是一个漫长的过程啊,花去我差不多一个小时

7。    完成“内核树”的安装
以上这一步如果没什么错误,到此就完成了内核代码树的建立。
目录“/usr/src/redhat/BUILD/kernel-2.6.15/kernel-2.6.15.686/”中就是所谓的“内核代码树”,同时“/lib/modules/2.6.15-1.2054_FC5/build”是个符号链接,也指向这个目录,所以这里也可以叫做“内核代码树”。
本文来自:
http://blog.chinaunix.net/u1/51650/showart_428982.html  《linux设备驱动程序》学习笔记(2)

原创粉丝点击