Gem5模拟器学习(一)

一、Gem5模拟器简介

gem5是一个开源、模块化的时钟精确的全系统模拟器,应用于计算机体系结构研究。该模拟器可以对CPU、存储系统、片上互连系统、I/O等系统组件进行详细的建模,并通过修改不同组件的具体实现和各个组件的配置参数可以灵活配置不同的计算系统。

1.1 模拟组件

  • $\color[RGB]{0,150,255}{多种ISA}$ :gem5支持常见的各种指令集:X86、ARM、RISCV、SPARC、POWER、MIPS。不同的指令集包含了每条指令执行的完整过程。当前gem5中可用于全系统模拟的ISA主要有ARM、X86和RISCV;

  • $\color[RGB]{0,150,255}{多种CPU模型}$ :gem5支持4种CPU模型:Simple、In-Order、Out-of-Order(简称O3)和KVM。每种CPU的具体实现和ISA不关联,因此CPU模型和ISA间可以任意搭配以组成多种计算机系统;

  • $\color[RGB]{0,150,255}{Port Interface}$ :该组件的主要功能是将系统中各个组件通过端口进行连接,屏蔽不同架构硬件实现细节,简化不同组件间的连接方式并增强系统通用性;

  • $\color[RGB]{0,150,255}{Cache模型}$ :在gem5中支持Ruby和Classic Cache两种模型。

  • Ruby存储模型:用户可以自定义不同Cache一致性协议,并对片上网络(Network-of-Chip, NoC)进行了详细建模;

  • Classic存储模型: 支持硬编码的层次MOESI一致性协议

  • $\color[RGB]{0,150,255}{DRAM模型}$ :gem5中的DRAM模型是事件驱动的,支持多种市面上常见的DRAM,如DDR3、DDR4、DDR5、GDDR、HMC、HBM等。在gem5中,DRAM模型不是时钟精确的,但是可以和时钟精确的DRAM模拟器DRAMSim3结合使用,gem5中提供了和DRAMSim连接的接口;

  • $\color[RGB]{0,150,255}{GPU模型}$ :其GPU模型基于AMD的Graphic Core Next(GCN),是一种基于计算的时钟级GPU,支持多种异构系统的计算应用程序,不支持图形应用程序。一般都使用AMD的APU模拟器(基于gem5)对GPU进行模拟;

  • $\color[RGB]{0,150,255}{I/O设备}$ :支持常见的磁盘控制器、PCI、Ethernet等等,是进行全系统模拟必不可少的系统组件;

  • $\color[RGB]{0,150,255}{丰富的接口}$ :虽然gem5模拟器功能全面、配置灵活,但是在对各个组件进行建模的过程中,考虑复杂性和实现等方面因素,并不是对所有系统组件进行详细建模,因此配置了多种其他体系结构模拟器的结构,如SST、SystemC、DRAMSys、DRAMSim。

1.2 模拟模式

gem5支持两种系统模拟方式,一种是System Call Emulation(SE),也叫系统调用模拟模式;另一种是Full System Simuluation(FS),也叫全系统模拟模式。

  • 系统调用模拟模式 System Call Emulation(SE)

  • 全系统模拟模式 Full System Simuluation(FS)

二、Gem5安装与测试

官网教程gem5: Building gem5

2.1 下载gem5源码

通过gitee网站下载源码,速度较快

1
git clone https://gitee.com/koverlu/gem5.git

2.2 安装依赖

根据官网的安装命令一键安装全部依赖,主要包括git,gcc,python,protobuf,Boost

1
2
3
sudo apt install build-essential git m4 scons zlib1g zlib1g-dev \
libprotobuf-dev protobuf-compiler libprotoc-dev libgoogle-perftools-dev \
python3-dev python-is-python3 libboost-all-dev pkg-config

2.3 设置swap交换分区

关于设置交换分区,读者可以自行百度或者看这篇博客Linux Swap交换分区设置教程。简单说,Swap分区的作用就是在内存不够的情况下,操作系统先把内存中暂时不用的数据,存到硬盘的交换空间,腾出内存来让别的程序运行。而构建gem5环境是需要很大的内存,因此很需要通过交换分区来“扩大”内存。否则会因为内存补不足而报错如下:

linux下设置swap分区的操作如下:

  • 清空默认的Swap分区

    1
    sudo swapoff -a
  • 创建分区文件并指定大小

    /var/swapfile是分区文件的位置,bs*count为文件大小

    1
    sudo dd if=/dev/zero of=/var/swapfile bs=1M count=10240
  • 格式化为Swap分区文件

    1
    sudo mkswap /var/swapfile
  • 启动Swap分区

    1
    sudo swapon /var/swapfile
  • 查看分区

    1
    free -h

    输出如下所示,分区创建成功,我的虚拟机设置的2GB内存+10GB分区

    1
    2
    3
    4
    ubuntu:~/Desktop/gem5$ free -h
    total used free shared buff/cache available
    Mem: 1.9Gi 1.2Gi 116Mi 33Mi 567Mi 471Mi
    Swap: 9Gi 351Mi 9.7Gi
  • 设置开机启动

    只需要在/etc/fstab中的末尾增加一行

    1
    /var/swapfile swap swap defaults 0 0

2.4 编译gem5环境

下面创建一个简单的x86环境试一下,首先进入gem5目录,然后通过以下命令构建环境

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

这里使用SCons构建工具,SCons使用当前目录和每个子目录的SConstruct文件查找和编译所有gem5源代码。

命令中build/X86/gem5.opt是构建环境的目标文件(opt后缀代表它是一个带有调试符号的优化二进制文件,其他后缀后面会介绍)。

[NumberOfThread]是用户期望该编译使用多少个线程进行编译,去掉-j 选项默认单线程,建议读者采用多线程编译,一般选为电脑 CPU 核数 - 1 最佳。

编译时间或许会有些长(我的破电脑跑了九九八十一天终于炼出来了)

出现以下log则表示模拟环境构建成功!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Checking for C header file Python.h... yes
Checking for C library pthread... yes
Checking for C library dl... yes
Checking for C library util... yes
Checking for C library m... yes
Checking for C library python2.7... yes
Checking for accept(0,0,0) in C++ library None... yes
Checking for zlibVersion() in C++ library z... yes
Checking for GOOGLE_PROTOBUF_VERIFY_VERSION in C++ library protobuf... yes
Checking for clock_nanosleep(0,0,NULL,NULL) in C library None... yes
Checking for timer_create(CLOCK_MONOTONIC, NULL, NULL) in C library None... no
Checking for timer_create(CLOCK_MONOTONIC, NULL, NULL) in C library rt... yes
Checking for C library tcmalloc... yes
Checking for backtrace_symbols_fd((void*)0, 0, 0) in C library None... yes
Checking for C header file fenv.h... yes
Checking for C header file linux/kvm.h... yes
Checking size of struct kvm_xsave ... yes
Checking for member exclude_host in struct perf_event_attr...yes
Building in /local.chinook/gem5/gem5-tutorial/gem5/build/X86
Variables file /local.chinook/gem5/gem5-tutorial/gem5/build/variables/X86 not found,
using defaults in /local.chinook/gem5/gem5-tutorial/gem5/build_opts/X86
scons: done reading SConscript files.
scons: Building targets ...
[ISA DESC] X86/arch/x86/isa/main.isa -> generated/inc.d
[NEW DEPS] X86/arch/x86/generated/inc.d -> x86-deps
[ENVIRONS] x86-deps -> x86-environs
[ CXX] X86/sim/main.cc -> .o
....
.... <lots of output>
....
[ SHCXX] nomali/lib/mali_midgard.cc -> .os
[ SHCXX] nomali/lib/mali_t6xx.cc -> .os
[ SHCXX] nomali/lib/mali_t7xx.cc -> .os
[ AR] -> drampower/libdrampower.a
[ SHCXX] nomali/lib/addrspace.cc -> .os
[ SHCXX] nomali/lib/mmu.cc -> .os
[ RANLIB] -> drampower/libdrampower.a
[ SHCXX] nomali/lib/nomali_api.cc -> .os
[ AR] -> nomali/libnomali.a
[ RANLIB] -> nomali/libnomali.a
[ CXX] X86/base/date.cc -> .o
[ LINK] -> X86/gem5.opt
scons: done building targets. <这个代表环境构建成功>

2.5 测试gem5

环境构建成功以后,就可以根据官网的指南编写python配置文件进行系统模拟了。

这里借助官网提供的默认配置文件se.py进行配置,并运行hello world程序

1
./build/X86/gem5.opt ./configs/example/se.py -c ./tests/test-progs/hello/bin/x86/linux/hello

出现以下输出则表示模拟正确

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
gem5 Simulator System.  https://www.gem5.org
gem5 is copyrighted software; use the --copyright option for details.

gem5 version 22.1.0.0
gem5 compiled Oct 24 2023 01:52:12
gem5 started Oct 24 2023 02:00:27
gem5 executing on ubuntu, pid 28261
command line: ./build/X86/gem5.opt ./configs/example/se.py -c ./tests/test-progs/hello/bin/x86/linux/hello

warn: The `get_runtime_isa` function is deprecated. Please migrate away from using this function.
warn: The `get_runtime_isa` function is deprecated. Please migrate away from using this function.
Global frequency set at 1000000000000 ticks per second
warn: No dot file generated. Please install pydot to generate the dot file and pdf.
build/X86/mem/dram_interface.cc:690: warn: DRAM device capacity (8192 Mbytes) does not match the address range assigned (512 Mbytes)
0: system.remote_gdb: listening for remote gdb on port 7000
**** REAL SIMULATION ****
build/X86/sim/simulate.cc:192: info: Entering event queue @ 0. Starting simulation...
Hello world!
Exiting @ tick 5985500 because exiting with last active thread context

学习博客

有关gem5模拟器的资料导航

gem5学习笔记一:模拟器安装与使用 (qq.com)

兆松科技研发的基于gem5的模拟器zemu

GEM5教程–gem5开始之旅(一)-CSDN博客

Gem5模拟器_好啊啊啊啊的博客-CSDN博客

gem5_ivy_reny的博客-CSDN博客

gem5_wyj7260的博客-CSDN博客

Gem5项目相关

Gem5官网

Gem5官方学习向导

Gem5版本更新说明

收集一下前辈们的踩坑记录

gem5安装踩坑指南 - 知乎 (zhihu.com)

  • 报错 ImportError: No module named six

    通过pip 安装six模块即可 pip install six

  • 报错util/cpt_upgrader.py: Permission denied

    执行sudo chmod 777 ./util/cpt_upgrader.py给权限,