我们要利用gem5搭建模拟系统。那么首先我们就要先给出系统的图纸,告诉gem5我们要搭建怎么样的系统,那么这个就是这篇文章的内容–配置脚本
先感受一下
首先gem5提供了许多示例配置脚本,在configs/examples目录下,先运行一个测试一下吧
(但大多数脚本都是全方位的,允许用户在命令行中指定几乎所有的选项,比较复杂)
./build/X86/gem5.opt ./configs/example/se.py -c ./tests/test-progs/hello/bin/x86/linux/hello
指令解析:
- gem5.opt是我们编译生成的x86指令集架构上的gem5
- se.py是基于SE(系统调用模拟,syscall emulation)模式构建的基本模拟系统,这个就是之后要学习的配置系统的脚本文件
- hello是简单的程序,用来测试的二进制文件
之后我们先从学习搭建简单的配置脚本开始
首先在这里涉及到I-cache和D-cache的概念
CPU和主存之间一般都存在多级高速缓存,一般分为3级,分别是L1, L2和L3
L1 Cache比较特殊,每个CPU会有2个L1 Cache。分别为指令高速缓存(Instruction Cache,简称iCache)和数据高速缓存(Data Cache,简称dCache)。L2和L3一般不区分指令和数据,可以同时缓存指令和数据。
题外话:Icache和Dcache还存在一致性的问题,比如self-modifying code,这些代码在执行的时候会修改自己的指令。例如gcc调试打断点的时候就需要修改指令
创建配置文件并修改:
gem5/configs/learning_gem5目录下已经给出了三个部分的学习案例
本次我们先进行part1的学习
主要学习方法就是对照part1下的文件看gem5学习博客
学习路径如下
1.先看这个或其他博客
目的是先去理解part1/simple.py,学习如何搭建一个没有缓存的简单系统
这样跑跑试试:
build/X86/gem5.opt configs/learning_gem5/part1/simple.py
2.再看这个或其他博客
目的是去理解caches.py,two_level.py,学习如何进行缓存的设置,搭建一个两级cache的系统
这样跑跑试试:
build/X86/gem5.opt configs/learning_gem5/part1/two_level.py
学习过程
过程中可以使用如下命令,自己创建文件写写试试
bashmkdir configs/tutorial
touch configs/tutorial/simple.py
学习过程可以使用以下命令跑跑试试
build/X86/gem5.opt configs/tutorial/simple.py
gem5文件结构
所有gem5的配置文件在configs/下可以找到
examples/:包含一些可用于运行gem5的开箱即用的示例的gem5配置脚本
Caches.py:和我们之前创建的caches.py文件相似,也是一些关于cache的设置
Options.py:包含了一些关于在命令行设置的选项,比如CPU数量,系统时钟等等
增添一些命令行设置再运行
build/X86/gem5.opt configs/example/se.py --cmd=tests/test-progs/hello/bin/x86/linux/hello --cpu-type=TimingSimpleCPU --l1d_size=64kB --l1i_size=16kB --caches
相关模拟的统计信息在m5out文件夹下可以看到
config.ini:包含了为模拟创建的每个SimObject列表以及其参数的值
详细参考这个
注:
其中很多教程里的与实际不同了的
slave现在改为cqu_side_ports
master现在改为mem_side_ports
可以参考 configs/learning_gem5/part1/simple.py里的
!!!照着这个改准没错,比啥教程都好用!!!
输出信息
每次执行结束,在m5out文件夹中都会生成三个输出文件:
config.ini 、config.json:本次模拟的参数配置
stats.txt:本次模拟信息
config.ini 文件中按照每个部件的名字进行划分。每个部件名字用中括号括起来,后面跟着的是它的参数和参数值
SimObject的每个实例都有自己的统计信息。在模拟结束时,或者在发出特殊的统计转储命令时,所有SimObjects的统计信息的当前状态都会转储到一个文件中。