Gem5模拟器学习(五)

FS全系统模拟

一、构建X86系统

切换到gem目录下,使用Scons进行构建

1
scons ./build/X86/gem5.opt -j [NumberOfThread]

二、获取镜像文件和Linux内核文件

FS模拟会启动Linux操作系统,会模拟系统的所有组件。因此需要给系统配置相应的Linux内核以及磁盘镜像

img 文件和 vmlinux 文件是 gem5 中启动操作系统所需的两个重要文件。

  • 磁盘镜像(img 文件)储存了操作系统的文件系统和应用程序,这些文件是操作系统运行所必需的。操作系统需要文件系统来存储和组织文件,需要应用程序来实现特定功能。
  • Linux内核文件(vmlinux 文件)储存了操作系统的内核代码。内核是操作系统的核心部分,负责管理系统资源和提供基本的服务。如果没有内核,操作系统就无法正常启动和运行。

1. 自动获取脚本

官方教程中使用的img和vmlinux直接来自于gem5资源库(resource repository),直接利用Resource类(gem5: gem5-resources)下载到本地。Gem5官网提供了通过Resource自动获取img文件和vmlinux文件,并运行全系统模拟的示例脚本,脚本代码在configs/example/gem5_library/目录中。以configs/example/gem5_library/x86-parsec-benchmarks.py为例

gem5可以通过KVM对仿真进行加速,但有的CPU不支持KVM,查看你的处理器是否支持KVM。可以通过安装sudo apt install qemu-kvm并通过kvm-ok来查看

1
2
3
4
# 安装qemu-kvm
sudo apt install qemu-kvm
# 查看KVM是否安装
kvm-ok

我的处理器并不支持KVM

因此只能关闭KVM

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Step1 使用requires进行检查时将kvm_required置为False
requires(
isa_required=ISA.X86,
coherence_protocol_required=CoherenceProtocol.MESI_TWO_LEVEL,
# kvm_required=True,
kvm_required=False,
)

# Step2 设置处理器时,均使用TIMING处理器
processor = SimpleSwitchableProcessor(
# starting_core_type=CPUTypes.KVM,
starting_core_type=CPUTypes.TIMING,
switch_core_type=CPUTypes.TIMING,
isa=ISA.X86,
num_cores=2,
)

这样就可以运行模拟了,使用的benchmark和size可以在该脚本的注释中查看

2.自己制作img文件

三、设置环境变量

1
2
3
4
# 修改bashrc文件以添加环境变量
vim ~/.bashrc
# 在打开的文件的尾部加入环境变量
export M5_PATH=gem5绝对路径/full-system-image

四、通过配置文件启动模拟系统

gem5提供了许多配置文件来配置不同的系统,其中可以由fs.py与命令行参数搭配快速实现不同配置的全系统模拟

fs.py的各种命令行参数可以通过fs.py -h查看

m5端

1. m5介绍

2. 生成m5以及对应的libm5.a库

要在应用程序中使用m5提供的指令,首先需要生成m5以及对应的libm5.a库

ps: 编译之前好像要确保安装clang,并保证其版本为6-10

1
2
3
4
# Step 1 切换到gem5/util/m5目录
cd util/m5
# Step 2 编译
scons build/x86/out/m5

利用libm5.a库,即可在应用程序中使用libm5.a库中的函数

编写如下测试程序

1
2
3
4
5
6
7
8
9
10
11
12
13
########hello_m5.cpp##########
#include <stdio.h>
#include "gem5/m5ops.h" //引入m5ops.h库

int main(int argc, char* argv[])
{
m5_reset_stats(0,0); //重置模拟统计数据,m5库中实现的函数

printf("Hello world!\n");

m5_dump_stats(0,0); //将模拟统计数据保存,m5库中实现的函数
return 0;
}

利用g++和库进行编译

1
2
3
4
5
6
7
8
9
10
11
12
g++ -o hello_m5 hello_m5.cpp -std=c++11 \
-Igem5绝对路径/include \
-Lgem5绝对路径/util/m5/build/x86/out -lm5

g++ -o hello_m5 hello_m5.cpp -std=c++11 \
-I$GEM5/include \
-L$GEM5/util/m5/build/x86/out -lm5

g++ -o hello_m5 hello_m5.cpp -std=c++11 \
-I$GEM5/include \
-L$GEM5/include -lm5

然后将编译出的可执行文件通过文件挂载的方式存储到img镜像文件中。

3. 启动m5端

启动m5有两种方法,一种是通过系统自带的telnet或者gem5中提供的m5term工具,推荐m5term。

(1)telnet

使用不需要额外安装或配置,直接

1
telent <host> <post>

例如

1
2
3
telnet localhost 3456
// 3456表示用于连接模拟系统的端口号,再gem5模拟中,默认的起始端口号为3456,
// 当后续需要模拟多个系统,端口号需要每次增加1

(2)m5term

使用m5前,必须先根据源码构建该工具

1
2
3
4
5
6
# Step 1 切换到gem5/util/term目录
cd util/term
# Step 2 编译
gcc -o m5term term.c
# Step 3 安装
sudo install -o root -m 555 m5term /usr/local/bin

之后,就可以通过与telnet类似的方式启动m5了

1
m5term <host> <post>