gem5模拟器使用介绍(二)
http://46aae4d1e2371e4aa769798941cef698.devproxy.yunshipei.com/ny_mg/article/details/41047197
上一篇对gem5的编译、简单程序的运行和常见的问题进行了说明。这里对一些比较复杂程序的模拟进行介绍:
一、使用gem5的全系统模拟
gem5的全系统模拟即利用gem5加载操作系统来进行模拟。
为了让gem5进行全系统模拟首先必须下载系统的镜像文件,这在gem5官网中有,根据官网中所介绍的方法可以下载得到两个镜像,一个500M左右的是经过剪切的,另一个3G多的是一个完整的ubuntu镜像,其中剪切过的一个可以在32为系统上模拟,而3G多的那个只能在64位系统上模拟,若在32位机上则会出现access out of
bounds 的错误。所以在刚开始的软硬件配置信息中提到,所安装的ubuntu应该是64位的。
在将32位的ubuntu换成64位之后,由于一些针对32位系统所设计的应用在64位下无法运行(如用到的arm-linux-gcc的安装)所以需要安装一些32位系统下的库(对应与arm-linux-gcc使用sudo apt-get install ia32-libs命令),如若该命令不能执行则首先运行下面的命令然后在执行上面的命令即可:$
sudo apt-get install libc6:i386 libgcc1:i386 gcc-4.6-base:i386 libstdc++5:i386 libstdc++6:i386 $ sudo apt-get install libncurses5:i386 $ sudo apt-get install g++-multilib
至此系统已经完全可以加载操作系统镜像了。具体方法是:
———————————————-
(1)在终端输入以下指令下载系统的二进制文件和镜像文件:
wget http://www.m5sim.org/dist/current/arm/arm-system-2011-08.tar.bz2
(2)等到下载完成后运行解压命令进行解压:
tar jxf arm-system-2011-08.tar.bz2
(3)修改环境变量
在.bashrc文件的最后一行中加入 M5_PATH=$HOME/上面下载镜像所在的目录名/,或在终端直接运行:echo “export M5_PATH=$HOME/上面下载镜像所在的目录名/” >> ~/.bashrc
然后运行source ~/.bashrc 使环境变量生效,运行echo M5_PATH 来查看环境变量是否生效。
(4)在以上工作完成之后就可以进入gem5的根目录进行全系统的模拟了,在这里使用gem5自带的全系统模拟脚本fs.py进行模拟,具体命令如下:
build/ARM/gem5.opt configs/example/fs.py –disk-image=$HOME/上面下载镜像所在的目录名/disks/arm-ubuntu-natty-headless.img
运行上面的命令就可以在gem5模拟器上面启动ubuntu的全系统了。
(5)重新开启一个终端运行telnet工具或m5term工具(需要安装)连接到模拟的操作系统,gem5模拟器为外部连接开放的端口号为3456,因此可以运行:telnet localhost 3456 来与加载的系统进行链接,连接之后以root身份登录即可在模拟硬件所加载的系统上进行相关的操作了。当然在这里启动的系统中只有系统自身的相关文件并没有自己测试所需的文件,为了测试自己的相关程序必须将自己编译好的文件预先加载到镜像文件中,让后在登录的终端之中运行即可。
(6)查看输出信息,fs模拟和se模拟的输出在同一个目录m5out下面,在这里可以查看模拟过程中的输出文件。
——————————————
二、将自己的文件加载到系统镜像文件中并进行模拟
上面的全系统模拟已经介绍了在gem5模拟器中启动系统的方法,为了使自己所写的程序能够在模拟器所加载的系统中运行需要首先将编译好的代码加载到系统镜像中。
(1)绑定镜像文件,为了将自己所编译的代码加载到镜像文件中首先必须将镜像文件绑定的一个目录下面,在这里绑定到/mnt目录下面,首先进入镜像目录disks下面,在这里将会看到arm-ubuntu-natty-headless.img和linux-arm-ael.img两个镜像文件,分别是完整的ubuntu镜像和经过剪切的linux镜像,这里使用经过剪切的镜像,因此运行以下命令进行绑定:sudo
mount -o loop,offset=32256 linux-arm-ael.img /mnt;
(2)复制编译好的正对arm架构的二进制代码到镜像文件中;
(3)卸载镜像文件,经过上面两个步骤镜像文件中已经包含了自己编译的代码,运行:sudo umount /mnt 将绑定的镜像卸载之后便成为我们所需的镜像;
(4)按照“四”中所给出的步骤启动镜像文件中的操作系统,并用终端登录该操作系统;
(5)在登录终端中运行加载的代码,即可完成自己的代码在模拟器所启动的操作系统上的运行。
(6)模拟结束后可以在m5out目录下查看整个模拟过程相关的输出信息。
三、对bbench的模拟
对bbench的模拟是在全系统模式下进行的,因此为了完成对该benchmark的模拟必须将bbench的代码加载到系统的镜像文件中来进行,在gem5的网站中提供了包含bbench的系统镜像,因此我们可以直接使用该镜像进行fs模拟即可。
(1)下载含有bbench的android系统镜像,gem5网站(http://bbench.eecs.umich.edu/downloads.html)提供了两种版本的系统镜像,分别为:Android
Gingerbread Disk Image with BBench 和 Android ICS Disk Image with BBench 这两个版本都可以使用,只是在命令行中稍有差别。
(2)解压下载的系统镜像得到两个目录:binaries、disks ,打开binaries可以看到在该目录下面没有boot文件,而该文件对于系统的启动是至关重要的,因此为了后面的运行需要将前面linux镜像下的boot文件拷贝一份到该目录下面;
(3)修改环境变量到镜像所在的目录,该操作与前面修改linux镜像的环境变量是一样的;
(4)进如gem5的根目录,运行命令:build/ARM/gem5.opt configs/example/fs.py -b bbench-gb –kernel=vmlinux.smp.mouse.arm –frame-capture
即可开始系统的加载和bbench的运行,要运行完整个过程所需的时间大概在10小时左右;
(5)值得注意的是在该bbench的运行过程中所产生的文件也会存放在m5out目录下面,打开该目录可以看到在该目录下面多了一个名为frames_system.vncserver的目录,在该目录下生成了在不同的模拟时间所提取生成的图像文件,我们可以通过查看该图像文件来判断模拟器的进度;当整个模拟过程完成之后,就可以在m5out目录下观察所生成的完整的输出文件了。
四、用gem5运行SPEC2006
1、se模式运行,注意在对各个程序进行编译的时候必须有-static标记(添加在Makefile.default文件中的CC、CXX、FC 下的FLAGS后面即可);
2、用书中所给出的cmp.py和cpu2006.py脚本运行的时候会产生很多错误,这是由于该脚本中的模块添加缺失和程序缩进错误所造成的,需要认真修改;
3、为了能使SPEC可以在arm体系结构下运行,需要用交叉编译器进行编译(只需将Makefile.default文件中的CC、CXX、FC后的编译器选项分别改为:arm-linux-gcc、arm-linux-g++、arm-linux-gfortran即可)。