《Linux内存管理:实验驱动的深度探索》【附录】【实验环境搭建 3】【Qemu 运行 低版本linux内核注意事项】

我们在学习内核时, 为了搞清楚某一个模块 的来龙去脉时,需要找低版本的内核来学习对比。 但是此时好多内核时跑不起来的, 但是有迫切需要 跑起来, 那我们该注意那些内容呢? 这里我们拿 linux 5.4 内核编译举例。

1. GCC 版本的选择

gcc 版本选择成功与否,其实就已经解决了大部分问题了。 有些问题解决不了,最终还是回归到 gcc 版本不对导致的。所以 gcc 版本选择是 重点。

1.1 Linux 内核编译所需的 GCC 版本

Linux 内核版本 最低支持 GCC 版本 推荐 GCC 版本 备注
2.6.x 2.95 3.4 - 4.9 已淘汰,较旧的工具链
3.x 3.2 4.4 - 5.5 仍在部分嵌入式设备上使用
4.0 - 4.9 3.2 4.9 - 7.x 较旧的长期支持版本
4.10 - 4.19 4.4 5.x - 8.x 仍被部分 LTS 发行版使用
5.0 - 5.10 5.1 6.x - 10.x 现代 LTS 版本
5.11 - 5.15 6.1 7.x - 11.x 现代 LTS 版本
5.16 - 5.19 7.1 8.x - 12.x 需要较新编译器
6.0 - 6.5 8.1 9.x - 13.x 支持较新硬件
6.6+ (最新) 9.1 10.x - 13.x 需要现代 GCC 版本

1.2 QEMU 编译所需要的 GCC 版本

QEMU 版本 最低 GCC 版本 推荐 GCC 版本 备注
≤ 4.0 4.8+ 5.x - 7.x 旧系统支持
4.1 - 5.2 5.1+ 7.x - 9.x 支持现代 CPU 架构
6.0 - 7.2 7.2+ 9.x - 11.x 启用更多优化
8.0+(最新) 7.2+ 10.x - 13.x 支持 TCG、多核、HV 功能

1.3 BusyBox编译所需要的 GCC 版本

BusyBox 版本 最低 GCC 版本 推荐 GCC 版本 备注
≤ 1.30 3.x+ 4.8 - 6.x 超轻量级支持
1.31 - 1.34 4.9+ 6.x - 9.x 适配常见工具链
1.35+ 5.1+ 7.x - 11.x 兼容现代嵌入式架构
最新(1.36+) 6.0+ 9.x - 12.x 可在 GCC 13 编译,但建议不要太新

2. 内核配置

2.1 必须打开的配置

qemu 允许时需要确保 如下3 个内核配置是使能的:

CONFIG_VIRTIO=y
CONFIG_SERIAL_AMBA_PL011=y
CONFIG_BLK_DEV_INITRD=y
配置选项 作用 不启用的后果
CONFIG_VIRTIO 支持 VirtIO 虚拟设备(磁盘、网络) 磁盘/网络不可用,启动卡死
CONFIG_SERIAL_AMBA_PL011 提供串口控制台输出 无日志输出,无法交互
CONFIG_BLK_DEV_INITRD 加载 initramfs 临时根文件系统 内核无法执行 /init,触发 Kernel Panic

这些配置是 QEMU virt 平台 + ARM64 的黄金组合,缺一不可!

2.2 其他配置

# 架构和平台
CONFIG_ARM64=y
CONFIG_ARM64_VIRT=y # 可有可无

# 设备驱动
CONFIG_SERIAL_AMBA_PL011=y
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
CONFIG_VIRTIO=y
CONFIG_VIRTIO_BLK=y
CONFIG_VIRTIO_NET=y
CONFIG_VIRTIO_PCI=y

# 文件系统和 initramfs
CONFIG_BLK_DEV_INITRD=y
CONFIG_EXT4_FS=y

# 中断和时钟
CONFIG_ARM_GIC=y
CONFIG_ARM_ARCH_TIMER=y

3. 各个版本软件选择:

软件 版本
主机选择 ubuntu 22.04
linux 5.4
qemu 7.2.0
busybox 1.35.0
aarch64-gcc 9.5.0

4. 交叉工具链安装

我们在之前的文章中,按照了最新的 aarch64-linux-gnu-gcc-11

$ aarch64-linux-gnu-gcc-11 --version

aarch64-linux-gnu-gcc-11 (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

如果不降低 gcc 版本直接编译 linux5.4 将遇到如下错误

4.1 报错一:

/usr/bin/ld: scripts/dtc/dtc-parser.tab.o:(.bss+0x20): multiple definition of `yylloc'; scripts/dtc/dtc-lexer.lex.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status

解决方案一:

  • 修改scripts/dtc目录下的scripts/dtc/dtc-lexer.l文件中找到 YYLTYPE yyloc这一行,在之前面加上extern 保存退出, make 编译 正常编译

方案二:

  • 将 gcc 降级

4.2 报错二:

../include/linux/compiler.h:350:45: error: call to ‘__compiletime_assert_653’ declared with attribute error: BUILD_BUG_ON failed: (((0x0ffULL) + (1ULL << (__builtin_ffsll(0x0ffULL) - 1))) & (((0x0ffULL) + (1ULL << (__builtin_ffsll(0x0ffULL) - 1))) - 1)) != 0



  • 只能是降级 gcc 版本

4.3 降级 gcc 版本

由于我们要编译 linux 5.4 所以这里需要 将 aarch64-gcc 换为 9.5

# 安装 aarch64-linux-gnu-gcc-9
sudo apt install gcc-9-aarch64-linux-gnu g++-9-aarch64-linux-gnu

#切换默认 aarch64-linux-gnu-gcc 版本
#如果系统中有多个 GCC 版本,可以手动设置:

sudo update-alternatives --install /usr/bin/aarch64-linux-gnu-gcc aarch64-linux-gnu-gcc /usr/bin/aarch64-linux-gnu-gcc-9 90 

sudo update-alternatives --install /usr/bin/aarch64-linux-gnu-g++ aarch64-linux-gnu-g++ /usr/bin/aarch64-linux-gnu-g++-9 90

5. 编译 linux5.4

5.1 报错一

ake[2]: *** 没有规则可制作目标“debian/canonical-certs.pem”,由“certs/x509_certificate_list” 需求。 停止。
make[2]: *** 正在等待未完成的任务....

cd build

vim .config


CONFIG_SYSTEM_TRUSTED_KEYS="debian/canonical-certs.pem"
# 将其 修改为 

CONFIG_SYSTEM_TRUSTED_KEYS=""

6. 其他步骤

由于 qemu 和 busybos 在使用 aarch-gcc-9.5上编译没有遇到错误,这里不再重复记录操作步骤,请参照之前。

其他步骤参考这篇文章执行。

《Linux内存管理:实验驱动的深度探索》【附录】【实验环境搭建 3】【Qemu 运行 低版本linux内核注意事项】_第1张图片

你可能感兴趣的:(linux,内存管理,linux,qemu)