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安装与测试
2.1 下载gem5源码
通过gitee网站下载源码,速度较快
1 | git clone https://gitee.com/koverlu/gem5.git |
2.2 安装依赖
根据官网的安装命令一键安装全部依赖,主要包括git,gcc,python,protobuf,Boost
1 | sudo apt install build-essential git m4 scons zlib1g zlib1g-dev \ |
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
4ubuntu:~/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 | Checking for C header file Python.h... yes |
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 | gem5 Simulator System. https://www.gem5.org |
学习博客
Gem5项目相关
收集一下前辈们的踩坑记录
报错 ImportError: No module named six
通过pip 安装six模块即可
pip install six
报错util/cpt_upgrader.py: Permission denied
执行
sudo chmod 777 ./util/cpt_upgrader.py
给权限,