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)下载gem51
hg clone http://repo.gem5.org/gem5
3)构建gem5(-j1
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
3export 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 world1
./build/ALPHA/gem5.opt configs/example/se.py -c tests/test-progs/hello/bin/alpha/linux/hello
可以清楚的看见hello world被打印出来。
可以看出几点:
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
如图:
从该结果可以看出:
通过3456端口可以访问全系统。
于是开启另一个终端, 在gem5目录中输入1
cd util/term/
进入上述目录以后输入make, 即可编译出m5term。
接着输入:1
m5term localhost 3456
就可以进入系统结果如图:
输入clear即可清屏:
再输入ls就可以看到如下图:
benchmarks中有一些测试程序:
进入以后可以看到下图:
我们可以测试一下pthread_mutex_test:
同时我们也可以尝试将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拷贝到/mnt1
cp hello /mnt
ls的结果如下图:
可以看到hello进入了镜像系统然后解挂载:1
umount /mnt
重新进入全系统模拟结果如图: