采用gem5实现Full System Linux Boot
0. 前言
-
运行环境问题
我尝试过在虚拟机(VMware)和 WSL2 上运行本实验,但是总会出现各种各样的问题,最后还是选择重新安装了Ubuntu 22.04 LTS,再进行实验就顺利多了
-
官网文档的问题
官网文档Tutorial: Run Full System Linux Boot Tests
地址:https://www.gem5.org/documentation/gem5art/tutorials/boot-tutorial
期初在官网按照教程做,但是一直出现报错。经过分析,发现有几个问题:
-
步骤过于繁琐,但是有些细节内容又没有详细描述
-
部分内容存在错误,例如在
boot-exit.json
中存在一些错误,在仿真的时候会报错 -
文档中的代码对最新版本的gem5好像不太支持?我这里运行的时候经常会报错
因此,本仿真不采用官网文档一步步进行,采用最新的gem5-resource仓库进行,后面会细讲
-
-
基本原理
- gem5支持全系统仿真(Full System),全系统仿真包含了整个计算机系统,例如处理器核心、外设、存储、网络连接、完整的软件栈(设备驱动、操作系统、应用程序)等。在在FS模式下,gem5仿真整从CPU到I/O的各个硬件系统,能够帮助gem5在不做修改的情况下执行二进制文件,也能够帮助我们去探索操作系统的影响
- 一般情况下,全系统仿真需要如下组件进行
- gem5 binary:是编译gem5后得到的二进制文件
- gem5/build/X86/gem5.opt
- config file:配置文件,采用python写成,用来配置系统参数
- x86-npb-benchmarks.py
- kernel binary:用于仿真的linux kernel
- core of an OS
- disk image:操作系统镜像
- workloads binaries:用于仿真的工作负载
- gem5 binary:是编译gem5后得到的二进制文件
1. 背景
-
概述
本仿真的基本思路是,采用gem5实现全系统仿真下,linux系统(Ubuntu 18.04)的启动过程
可以这样理解:在Ubuntu的环境下,通过gem5模拟出一个硬件平台,之后再在这个模拟出来的硬件平台上运行一个Ubuntu
-
资源
-
gem5仓库
https://github.com/gem5/gem5
-
gem5-resource仓库
https://github.com/gem5/gem5-resources
-
2. 按照默认模式运行
-
下载gem5
git clone https://github.com/gem5/gem5-resources.git
-
在gem5文件夹下,进行编译
scons build/X86/gem5.opt -j`nproc` cd ./util/m5 scons build/x86/out/m5
-
切换至gem5文件夹,运行
configs/example/gem5_library/x86-ubuntu-run.py
,会基于运行Timing CPU运行系统cd ../../ ./build/X86/gem5.opt configs/example/gem5_library/x86-ubuntu-run.py
若发现本地没有linux kernel和Ubuntu,则会进行自动下载
注意:这里运行时间会非常长,且注意监听端口是3456
-
采用gem5中的 m5 terminal 观察系统的启动过程,打开一个新的terminal,在gem5文件夹中运行
cd ./util/term make m5term localhost 3456
此时,会激活 m5 terminal,显示Ubuntu系统的启动过程
等待很长时间之后(在我笔记本上基本上需要两三小时),开始进入Ubuntu系统
成功启动后,将会exit,如下图所示
启动的过程中,会遇到两个错误,但是好像不影响最终结果?最终能够实现成功启动并退出
[FAILED] Failed to start Accounts Service. See 'systemctl status accounts-daemon.service' for details.
[FAILED] Failed to start Dispatcher daemon for systemd-networkd. See 'systemctl status networkd-dispatcher.service' for details.
3. 自己制作disk image
-
注意,从这里开始是另外的内容了,和上文所述内容不是顺序关系
-
首先将仓库clone下来,再进入
x86-ubuntu
文件夹后将gem5 clone下来git clone https://github.com/gem5/gem5-resources.git cd gem5-resources/src/x86-ubuntu/ git clone https://github.com/gem5/gem5.git
其文件目录如下
x86-ubuntu/ |___ gem5/ # gem5 源代码 | |___ disk-image/ | |___ build.sh # 用于下载 packer 并且构建 disk image | |___ shared/ # 构建 disk image 的一些辅助文件 | |___ x86-ubuntu/ | |___ x86-ubuntu-image/ # disk image 创建时会自动创建 | | |___ x86-ubuntu # 所创建的 disk image 文件 | |___ x86-ubuntu.json # Packer 所采用的脚本文件 | |___ exit.sh # 用于成功 boot 后退出 Ubuntu 系统 | |___ post-installation.sh # 安装后的辅助文件 | |___ linux # Linux kernel | |___ README.md # README 文件
-
编译gem5:进入gem5文件夹,运行
scons build/X86/gem5.opt -j`nproc`
编译 m5:
cd ./util/m5 scons build/x86/out/m5
-
进入
disk-image
,首先会下载 packer 用于构建disk imagecd disk-image ./build.sh
而后开始disk image的构建
在这里,可以将vnc地址复制,利用 vnc-viewer观察构建过程,这个过程时间比较长(没有vnc-viewer的需要自己安装)
教程为 vnc-viewer安装教程
完成后如下图所示