总体目标:由于fedora10 linux发行版中自带的linux2.6.xx内核源码规模太庞大了,对于想通读内核源码的爱好者来说太困难了,因此选择了linux2.4.20内核来进行测试(最终是希望能够实现linux1.0内核的源码完全编译和测试)。
实施步骤:根据redhat9发行版的gcc和binutils版本,在fedora10中构建相同的编译环境并进行linux2.4.20内核的编译和测试,制作2.4.20内核的软盘启动盘,然后通过虚拟机启动,能够看到linux2.4.20内核启动成功。后续低内核版本也按照低gcc版本和对应的binutils版本来构建编译环境进行内核的编译测试。
编译linux2.4.20内核的时候,我的内核源码时放在win10的主机上,通过wmware10文件共享功能fedora10虚拟机共享内核源代码,然后利用fedora10中安装的编译环境来编译内核,由于ln命令不支持跨文件系统建立软硬连接,所以修改makefile文件,注释了箭头指示的两个地方,然后直接在内核源码include目录中按照所需要编译的目标系统,拷贝一份,将文件夹名字修改为asm。

内核编译或者make dep操作出现错误:"/mnt/hgfs/linux-2.4.20/include/linux/kernel.h:10:20: stdarg.h: 没有那个文件或目录",但系统上能够查询到此文件

我的解决方法:因为我用的是gcc-3.2.2编译器,源程序在/home目录,安装在/opt/目录,因此我直接将/home/gcc-build/gcc/include/stdarg.h文件拷贝到内核源码目录linux-2.4.20/include中,能够顺利编译和通过make dep。
Linux2.4.20内核编译过程中出现汇编错误如下解决:后面在fedora10中将安装的as-2.13.2.1拷贝到/usr/bin目录中更名为as,发行版自带的as先备份为as_bak,后续准备创建一个封闭的gcc3.2.2+as-2.13.2.1编译环境,不影响发行版的编译环境。

出现这个汇编错误,是因为as的版本跟gcc的版本不配套导致的,redhat9 linux的发行版里面gcc和as版本如下,编译没有问题:gcc3.2.2+as 2.13.90+ld 2.13.90。

目前我使用的fedora10 linux发行版自带的gcc和as版本是:gcc4.3.2+as 2.18.50+ld 2.18.50


解决办法是在fedora10 linux发行版中安装gcc3.2.2+as 2.13.90+ld 2.13.90编译环境。
Gcc的安装如下,网络搜索了安装方法,有通过YUM工具进行安装,因为linux发行版的原因,这种方式一般都不能安装到自己需要的gcc版本,yum工具搜索到的都是跟发行版接近的版本;因此我先用fedora10的yum工具安装gcc3.4,Index of /gnu/binutils上直接下载gcc3.2.2源码,再用gcc3.4编译gcc3.2.2并安装gcc3.2.2。

通过上面的步骤,将gcc3.2.2安装到了/opt/gcc-3.2.2目录,这样系统中就有了多个版本的gcc编译器。

Fedora10下yum安装低版本gcc
- Fedora10下gcc位置及其版本如下:

2、根据需要,要安装低版本的gcc,如果直接用"yum install gcc"安装时默认是安装最新版本的gcc。
3.可先通过"yum list compat-gcc*"查看版本,然后再利用"yum install compat-gccXXX"安装,如下:


4.接下来指定要安装的版本进行安装:



5.输入y就开始下载并自动安装,并在目录"/usr/bin/"目录下生成如下gcc34:

6.接下来进行测试,在命令终端查看gcc版本,"gcc -v"和"gcc34 -v":

多个版本gcc并实现快捷切换
在实际生成过程中可能需要不同gcc版本来完成编译工作。可以在环境中配置好不同版本的gcc,方便快捷的实现版本的切换。Fedora10发行版中gcc是4.3.2版本,名字就是gcc,如果有多个版本的时候不好区分,后面将默认的gcc修改为gcc43。
linux下gcc默认保存路径:/usr/bin,有两个版本的gcc,gcc3.4.6和gcc4.3.2如下:

通过update-alternatives工具实现不同版本gcc之间的快捷切换
1、不同版本gcc的配置与切换
update-alternatives是ubuntu系统中专门维护系统命令链接符的工具,通过它可以很方便的设置系统默认使用哪个命令、哪个软件版本。设置多个版本gcc可用选择调用:
设置多个版本的gcc可供选择。70,60数字代表的是不同版本的优先级,默认最大数字版本的优先级:
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc 70
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc34 60

这里通过update-alternatives用alternatives也行,设置了gcc3.4.6和gcc4.3.2两个版本的gcc。因为gcc4.3.2的优先级更高,所以默认是gcc4.3.2。
切换gcc版本:alternatives --config gcc

通过输入版本序号就能方便快捷的实现gcc版本的切换了。将发行版默认的gcc修改为gcc43方便区分。


由于系统默认的安装目录是/usr/bin,运行时都是在这些目录中寻找可执行文件,将gcc安装到其他目录后需要设置环境变量才能使用新安装的gcc文件。




下面是进行binutils工具的安装(包含as,ld)。下载地址:Index of /gnu/binutils



从服务器上下载源代码,用gcc3.2.2编译安装,在配置的时候提示CC错误,如下设置CC变量,并安装到/opt/binutils-2.13.2.1目录中。





创建binutils-2.13.2.1源文件makefile成功,然后执行make;make install


下图所示为不同版本的binutils中的as的管理和切换:

通过make menuconfig;make bzImage配置和编译一个最小内核,使用虚拟机设置里面的创建软盘功能,创建一个名为:boot2.4.20的flp类型的软盘来作为内核2.4.20的启动盘,在fedora10中连接这个软盘,然后执行make bzdisk,创建启动盘,在一个新的测试虚拟机中直接冲软盘引导,启动linux2.4.20内核,如下图所示:



