gem5

gem5简介

GEM5是一款模块化的离散事件驱动全系统模拟器,它结合了M5和GEMS中最优秀的部分,是一款高度可配置、集成多种ISA和多种CPU模型的体系结构模拟器。M5是由Michigan大学开发的一款开源的多处理机模拟器,受到了业内的广泛关注,很多高水平论文都采用M5作为研究工具。另一方面,Wisconsin推出的GEMS能够对储存层次进行详细而灵活的模拟,包括对多种不同的cache一致性协议和互联模型的支持。目前的GEM5是M5和GEMS的一个紧耦合版本。
GEM5已经能够支持多种商用ISA,包括X86、ARM、ALPHA、MIPS、Power、SPARC等,并且能够在X86、ARM、ALPHA上加载操作系统。

gem5系统模型

gem5支持两种不同的系统模型:SE(syscall emulation)和FS(full system)。

SE模型
SE模型能够仿真大部分操作系统级服务,能够取得很好功能模拟加速比。
FS模型
FS模型模拟完整的全系统,包括OS,运行在用户态和核心态的线程调度以及各种设备。能够精确模拟系统时间等开销。

gem5的安装使用

首先需要介绍一下我的运行环境,我的环境是在虚拟机上安装的ubuntu14.04, 分配了2个CPU, 当然CPU越多越好,后面会讲为什么。其次是内存尽量足够, 4G应该是够的, 不然编译的过程中可能会出错。安装时将ubuntu提升到root权限。
1)安装相关的工具

1
apt-get install mercurial scons swig gcc m4 python python-dev libprotobuf-dev libgoogle-perftools-dev g++

简要介绍一下上述工具:
mercurial是一个类似于git的软件版本控制工具,主要是负责下载和更新gem5的。
scons是类似于make的自动编译链接工具。区别就是make是寻找当前目录的Makefile文件, scons是寻找当前目录的SConstruct配置文件。
swig是将C++程序封装以后供给python调用。
gcc与g++是C/C++的编译和链接工具,因为gem5对其版本有要求,所以我们这里相当于更新一下。
python和python-dev是支持python的工具
libprotobuf-dev和libgoogle-perftools-dev是google的一套序列化工具。类似于XML的功能, 将结构化的数据进行序列化存储或传输, 在另一端进行反序列化。protobuf支持C++、Java、Python 三种语言的 API, 它的主要优点就是快, 简单易学。

2)下载gem5

1
hg clone http://repo.gem5.org/gem5

3)构建gem5(-j中,n=2*cpu的个数,为编译过程分配n个人物,多线程编译,速度会提升)我选择的是ALPHA指令集架构,当然也可以用其他的架构ARM/X86等。

1
scons build/ALPHA/gem5.opt -j4

上述过程可能会失败:
问题1)如果zlib.h文件没找到就需要安装zlib-1.2.8下载以后将zlib-1.2.8加入gem5
进入zlib-1.2.8目录执行下面命令:

1
2
./configure
make && make install

问题2)如果出现有关protobuf相关的问题就去下载protobuf-2.6.1, 完成以后将protobuf-2.6.1加入gem5
同样进入protobuf-2.6.1目录执行下面命令:

1
2
./configure
make && make install

同时需要将下面的代码加入~/.bashrc文件里面(下面第三行的/home/yankang/MyItem/gem5/protobuf-2.6.1替换成你的protobuf-2.6.1所在目录)

1
2
3
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/lib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/home/yankang/MyItem/gem5/protobuf-2.6.1

如果不加上述三行,会找不到protobuf-2.6.1的。

4)测试hello world

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

可以清楚的看见hello world被打印出来。
logo
可以看出几点:
Gem5是精确级模拟, 因为它内部的最小计时单位是tick, 而1秒=1万亿ticks。
可以通过gdb访问7000端口从而进行调试工作。

gem5全系统模拟

*)首先下载系统镜像

*)新建一个目录full_system_images, 将上述压缩包解压到full_system_images目录中, 并用pwd得到镜像所在目录, 我的目录在

1
/home/yankang/MyItem/full_system_images/

*)将镜像目录重定向到~/.bashrc中:

1
echo "export M5_PATH=/home/yankang/MyItem/full_system_images/" >> ~/.bashrc

*)开启全系统仿真:

1
./build/ALPHA/gem5.opt configs/example/fs.py

如图:
logo
从该结果可以看出:
通过3456端口可以访问全系统。
于是开启另一个终端, 在gem5目录中输入

1
cd util/term/

进入上述目录以后输入make, 即可编译出m5term。
接着输入:

1
m5term localhost 3456

就可以进入系统结果如图:
logo
输入clear即可清屏:
再输入ls就可以看到如下图:
logo
benchmarks中有一些测试程序:
进入以后可以看到下图:
logo
我们可以测试一下pthread_mutex_test:
logo
同时我们也可以尝试将hello world程序加入到这个系统里面

1
cp ./tests/test-progs/hello/bin/alpha/linux/hello ./hello

然后将镜像系统挂载在/mnt上:

1
mount -o,loop,offset=32256 ../full_system_images/disks/linux-latest.img /mnt/

将hello拷贝到/mnt

1
cp hello /mnt

ls的结果如下图:
logo
可以看到hello进入了镜像系统然后解挂载:

1
umount /mnt

重新进入全系统模拟结果如图:
logo