GEM5是一款十分强大的模拟器,支持主流的X86、MIPS、ARM、RISC-V等多种架构的行为仿真模拟。
GEM5是M5和GEMS的结合,使用Python和C++编写(其中C++占越85%),提供大量标准化接口的同时保留了较好的灵活性。
因为研究需要,需要在Linux平台上使用GEM5模拟器,但我又无法忍受双系统切换的麻烦以及虚拟器无比卡慢的运行环境,选择尝试在Windows推出的WSL(Windows Support Linux) 平台上安装GEM5。GEM5可是个不折不扣的吃性能大户,WSL是为数不多不会带来计算性能损失的“双系统”运行环境,所以我选择WSL。
本文介绍GEM5在WSL Ubuntu18.04下的编译安装过程。
至此,编译GEM5需要的所有支持库已安装完毕,下面就可以开始编译GEM5了!
GEM5官方提供Google Cloud代码托管下载链接:
git clone https://gem5.googlesource.com/public/gem5但众所周知,这在国内是无法通过正常方式访问的。官方还提供另一下载方式:
wget http://repo.gem5.org/gem5/archive/tip.tar.bz2文件大约有37MB,外网访问速度较慢,请耐心等待。同时我也将文件上传到百度云盘,提取码:6ras 下载完成后,使用命令:
tar -xjf tip.tar.bz2解压压缩包,解压后cd到文件夹内。
接下来就可以开始安装了!
GEM5支持包括X86、ARM、Power在内的多种商用架构,这里以ARM为例,开始我们的GEM5之旅。
进入到文件夹后,输入命令:
scons build/ARM/gem5.opt -j4开始安装,需要注意,这里 “-j4”是指线程数,建议设置为与当前平台的CPU物理核心数相同。如,我的电脑是四核i7 6700,使用四线程并行加快编译速度。由于每个线程基本上都能够把一颗CPU核心吃满,所以超线程技术多出来的那一倍逻辑核心基本可以不用考虑进去了,以免遇到奇怪的错误。
编译耗时较长,会占用较大内存,内存4G以下机器可能会占用到虚拟内存空间,拖慢进度。编译基本上一个午觉的时间,当控制台上出现以下内容:
...... [ CXX] ARM/mem/ruby/structures/Prefetcher.cc -> .o [ CXX] ARM/mem/ruby/structures/TimerTable.cc -> .o [ CXX] ARM/mem/ruby/structures/BankedArray.cc -> .o [ LINK] -> ARM/mem/ruby/structures/lib.o.partial [ CXX] ARM/base/date.cc -> .o [ LINK] -> ARM/gem5.opt build/ARM/arch/arm/lib.o.partial: In function `ArmSemihosting::callTmpNam(ThreadContext*, bool, std::vector<unsigned long, std::allocator<unsigned long> >&)': /home/zwmdr/gem5-22183ae13998/build/ARM/arch/arm/semihosting.cc:474: warning: the use of `tmpnam' is dangerous, better use `mkstemp' scons: done building targe即表示安装完成了!
安装完成之后,我们运行GEM5自带的测试程序,非常经典的Hello World!在控制台键入:
./build/ARM/gem5.opt ./configs/example/se.py -c ./tests/test-progs/hello/bin/arm/linux/hello如果你能看到如下信息:
hello gem5 Simulator System. http://gem5.org gem5 is copyrighted software; use the --copyright option for details. gem5 compiled Nov 1 2019 14:26:00 gem5 started Nov 1 2019 15:37:59 gem5 executing on ZWMDR, pid 8516 command line: ./build/ARM/gem5.opt ./configs/example/se.py -c ./tests/test-progs/hello/bin/arm/linux/hello Global frequency set at 1000000000000 ticks per second warn: DRAM device capacity (8192 Mbytes) does not match the address range assigned (512 Mbytes) 0: system.remote_gdb: listening for remote gdb on port 7000 **** REAL SIMULATION **** info: Entering event queue @ 0. Starting simulation... Hello world! Exiting @ tick 2924500 because exiting with last active thread context Simulated exit code not 0! Exit code is 13就说明安装成功啦!