当前位置: 首页 > news >正文

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

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

1. GCC 版本的选择

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

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

Linux 内核版本最低支持 GCC 版本推荐 GCC 版本备注
2.6.x2.953.4 - 4.9已淘汰,较旧的工具链
3.x3.24.4 - 5.5仍在部分嵌入式设备上使用
4.0 - 4.93.24.9 - 7.x较旧的长期支持版本
4.10 - 4.194.45.x - 8.x仍被部分 LTS 发行版使用
5.0 - 5.105.16.x - 10.x现代 LTS 版本
5.11 - 5.156.17.x - 11.x现代 LTS 版本
5.16 - 5.197.18.x - 12.x需要较新编译器
6.0 - 6.58.19.x - 13.x支持较新硬件
6.6+ (最新)9.110.x - 13.x需要现代 GCC 版本

1.2 QEMU 编译所需要的 GCC 版本

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

1.3 BusyBox编译所需要的 GCC 版本

BusyBox 版本最低 GCC 版本推荐 GCC 版本备注
≤ 1.303.x+4.8 - 6.x超轻量级支持
1.31 - 1.344.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
linux5.4
qemu7.2.0
busybox1.35.0
aarch64-gcc9.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上编译没有遇到错误,这里不再重复记录操作步骤,请参照之前。

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

在这里插入图片描述

http://www.dtcms.com/a/111693.html

相关文章:

  • Vue2 父子组件数据传递与调用:从 ref 到 $emit
  • Python列表(List)深度解析
  • Java EE期末总结(第二章)
  • CExercise_04_1运算符_4交换两个不同整数的值
  • 算法刷题记录——LeetCode篇(3.2) [第211~212题](持续更新)
  • CExercise_05_1函数_1.1素数(要对键盘录入的数据做参数校验)
  • 游戏引擎学习第204天
  • 使用 .NET 9 和 Azure 构建云原生应用程序:有什么新功能?
  • ArkTs的UI装饰器(自定义组件生命周期、页面组件生命周期、所有UI装饰器使用及示例)
  • C++ | C++11知识点
  • react redux的学习,单个reducer
  • Spring-IOC部分
  • python __init__文件的作用
  • (51单片机)矩阵按键密码锁表白(C语言代码编撰)(矩阵按键教程)(LCD1602浅教程)
  • Python数据结构之有序列表
  • docker使用汇总
  • 【YOLO系列(V5-V12)通用数据集-工程用车检测数据集】
  • MINIQMT学习课程Day8
  • 解锁大数据可视化设计,让数据会 “说话”
  • Docker安装、配置JDK17
  • 程序化广告行业(59/89):广告验证与反作弊实战技巧
  • HTML jQuery 项目 PDF 批注插件库在线版 API 示例教程
  • PostgreSQL的扩展(extensions)-常用的扩展-pg_dirtyread
  • 55.基于springboot+vue的汽车租赁管理系统
  • Flink CDC Pipeline mysql to doris
  • 关于JVM和OS中的指令重排以及JIT优化
  • 小刚说C语言刷题——第14讲 逻辑运算符
  • Jetpack Compose `ACTION_HOVER_EXIT` 事件异常解决方案
  • 纯个人整理,蓝桥杯使用的算法模板day2(0-1背包问题),手打个人理解注释,超全面,且均已验证成功(附带详细手写“模拟流程图”,全网首个
  • MySQL-SQL-DDL语句、表结构创建语句语法、表约束、表数据类型