linux 内核代码学习(八)

总体目标:由于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

  1. 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内核,如下图所示:

相关推荐
AlanBruce2 小时前
摩尔信使MThings功能综述与应用使用指南
linux·自动化·plc·mthings·摩尔信使
小弥儿4 小时前
GitHub今日热榜 | 2026-09-15:AI 智能体与本地生成工具领跑
学习·开源
susplus4 小时前
【初识ARM】ARM相关基础概念
学习·arm
XiHongShi20165 小时前
键盘大小写指示器(代替键盘灯)
学习·计算机
斯维赤6 小时前
AI Agent学习之路 | Prompt Engineering(提示词工程)的三板斧核心技巧
人工智能·学习·prompt
陈陈CHENCHEN7 小时前
【Linux】服务器根目录磁盘扩容操作记录
linux·运维·服务器
GeW8 小时前
RHCE快速拿证全攻略:考点拆解+实验强化+时间规划,一次通关
linux
2301_802651088 小时前
imx6ull裸机开发:UART
学习
沸速存储9 小时前
AI 机器人靠哪些内存与存储驱动整机运行?
服务器·科技·嵌入式硬件·电脑
码农小韩9 小时前
Linux应用开发(八)——TCP/IP网络编程基础
linux·嵌入式软件开发·linux操作系统·嵌入式操作系统·linux网络编程·linux应用