软件上市公司排名营销型网站seo
我们在学习内核时, 为了搞清楚某一个模块 的来龙去脉时,需要找低版本的内核来学习对比。 但是此时好多内核时跑不起来的, 但是有迫切需要 跑起来, 那我们该注意那些内容呢? 这里我们拿 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 --versionaarch64-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 buildvim .configCONFIG_SYSTEM_TRUSTED_KEYS="debian/canonical-certs.pem"
# 将其 修改为 CONFIG_SYSTEM_TRUSTED_KEYS=""
6. 其他步骤
由于 qemu 和 busybos 在使用 aarch-gcc-9.5上编译没有遇到错误,这里不再重复记录操作步骤,请参照之前。
其他步骤参考这篇文章执行。