最近在做本科毕业设计,我的题目是“基于多核的低功耗模拟与实现”,需要用到计算机体系结构模拟器,先是参考了以前学长的单核,于是也去安装simplescalar,说是话真不容易啊。好不容易安装好了simplescalar,才发现原来simplescalar使用来模拟单处理器的不能模拟多核。于是在网上找啊找终于找到了gem5可以用来模拟多核,于是又开始安装gem5,也不是省油的灯。不过还是有收获,下面的安装这两个模拟器的记录。
Record1
1.安装ubuntu12.04,使用wubi安装
2.安装simplescalar
-
在www.simplescalar.com上下载四个包Simpletools-2v0.tgz Simplesim-3v0d.tar.gz Simpleutils-990811.tar.gz Gcc-2.7.2.3.ss.tar.gz。建立一个用于安装simplescalar的目录/home/administrator/professionalSoftware/simplescalar。将这四个压缩包解压到这个目录下。
-
了方便安装simplescalar,先定义以下临时环境变量。
$ export HOST=i386-pc-linux
$ export IDIR=/home/administrator/professionalSoftware/simplescalar $ export TARGET=sslittle-na-sstrix
-
安装前确保ubuntu已经安装了flex bison build-essential,使用命令“sudoapt-get install <PACKAGE_NAME>”
-
安装binutils-2.5.2;使用如下命令;
cdbinutils-2.5.2
./configure -host=$HOST -target=$TARGET-with-gnu-as -with-gnu-ld -prefix=$IDIR
make
这一步对于不同的计算机系统或许会出现不同的错误,这里就我安装时出现的问题加以阐述:
错误1:
./ldlex.l:在函数‘yy_input’中:
./ldlex.l:477: 错误:‘yy_current_buffer’未声明(在此函数内第一次使用)
./ldlex.l:477:错误:(即使在一个函数内多次出现,每个未声明的标识符在其
./ldlex.l:477:错误: 所在的函数内也只报告一次。)
make[1]:*** [ldlex.o] 错误 1
make[1]:正在离开目录`/root/simplescalar/binutils-2.5.2/ld'
make:*** [all-ld] 错误2
解决:进入/home/administrator/professionalSoftware/simplescalar,打开ldlex.l定位到476行, 将小写的yy_current_buffer改为大写的YY_CURRENT_BUFFER
错误2:
/usr/lib/gcc/i486-linux-gnu/4.3.3/include/varargs.h:4:2:错误: #error"GCC no longer implements<varargs.h>."
/usr/lib/gcc/i486-linux-gnu/4.3.3/include/varargs.h:5:2:错误: #error"Revise your code to use<stdarg.h>."
解决:进入/home/administrator/professionalSoftware/simplescalar/binutils-2.5.2/ld,打开 ldmisc.c,定位到24行,将 #include<vararg.h>改为#include<stdarg.h>
错误3:
ldmisc.c:在函数‘info_msg’中:
ldmisc.c:344:错误: expecteddeclaration specifiers before ‘va_dcl’
ldmisc.c:348:15: 错误:宏“va_start”需要2个参数,但只给出了 1个
ldmisc.c:357:错误: expected‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before‘va_dcl’
解决:
这是因为在stdarg.h里已经不再支持va_dcl,所以编译无法通过。
修改如下:
《《屏蔽掉函数内部分~~》》eg:
343void info_msg(const char* fmt, va_list ap)
344 //va_dcl
345{
346 /* char *fmt;
347 va_list arg;
348va_start(arg);
349 fmt = va_arg(arg, char *);
350vfinfo(stdout, fmt, arg);\
351 va_end(arg);
352 */
353 }
解决掉这些错误后再一次进行make,编译通过后会 在/home/administrator/professionalSoftware/simplescalar中产生一个bin文件,说明binutils- 2.5.2安装成功
-
安装gcc-2.7.2.3,使用如下命令
./configure-hose=$HOST -target=$TARGET -with-gnu-as -with-gnu-ld-prefix=$IDIR
make
这一步也会出现很多的错误,解决方法如下
错误1:
cccp.c:194:错误:与‘sys_errlist’类型冲突
/usr/include/bits/sys_errlist.h:28:错误:‘sys_errlist’的上一个声明在此
解决:进入/root/simplescalar/gcc-2.6.3,打开cccp.c,定位到191,在上一行加入#definebsd4_4
错误2:
gcc-c -DCROSS_COMPILE -DIN_GCC -DPOSIX -g -I. -I. -I./configsdbout.c
sdbout.c:57:18: 错误:syms.h:没有该文件或目录
sdbout.c:在函数‘gen_fake_label’中:
解决:在这段代码之前(53行处)加一个#undefUSG,这样就会将gsyms.h包含进去。
错误3:
这个错误可能会有多个地方,只需在所有的地方按照下面的解决办法解决就可以
insn-output.c:在函数‘output_110’中:
insn-output.c:675:错误: 缺少结尾的 "字符
insn-output.c:676:错误: 程序中有游离的‘\’
insn-output.c:676:错误:‘sll’未声明(在此函数内第一次使用)
insn-output.c:676:错误:(即使在一个函数内多次出现,每个未声明的标识符在其
insn-output.c:676:错误: 所在的函数内也只报告一次。)
insn-output.c:676:错误: expected‘;’ before ‘t’
解决:这里会出错的原因是因为,在C语言里面字符串如果分多行写的话必须以“\”结尾,表示 连接上下两行。注意的是这里会产生这个错误的原因是Flex(Flex是Linux下词法分析,语法 分析代码自动生成工具)版本的问题。这个insn-output.c是由Flex自动生成的,由于Redhat- EL4上的Flex版本与该项目的版本不一致,故导致生成文件也有点不同。如果直接修改insn- output.c文件中的所有这些问题,只是治标行为,如果clean过一次的话,再重新编译,又得再 一次修改。治本的方法是,找一个能正确生成代码的Flex版本。本次安装采用“治标”的方法, 为所有出现这个问题的地方添加一个”\”。
修改方法如下:
FIXME\n后面添加一个'\'
即:
675 return "FIXME\n\
错误5:
gcc.c:172:错误:与‘sys_errlist’类型冲突
/usr/include/bits/sys_errlist.h:28:错误: ‘sys_errlist’的上一个声明在此
gcc.c:在函数‘translate_options’中:
解决:这个问题也与前面类似,就不再详述,解决办法是在./gcc.c的169行添加一个#definebsd4_4。
问题6:
./cp/g++.c:90:错误:与‘sys_errlist’类型冲突
/usr/include/bits/sys_errlist.h:28:错误: ‘sys_errlist’的上一个声明在此
./cp/g++.c:在函数‘fatal’中:
解决:在./cp/g++.c的52行添加一个#definebsd4_4。
错误都解决后就可一通过编译了,使用makeinstall安装完毕
-
进行测试
编写一个helloworld.c程序,进行编译bin/sslittle-na-sstrix-gcchelloworld.c,然后运行simplesim-3.0/sim-safea.out
运行结果如下:
-
sim:** starting functional simulation **
Hello world
sim: **simulation statistics **
sim_num_insn 7691 # total number ofinstructions executed
sim_num_refs 4234 # total number of loadsand stores executed
sim_elapsed_time 1 # total simulation time inseconds
sim_inst_rate 7691.0000 # simulation speed (ininsts/sec)
ld_text_base 0x00400000 # program text (code) segmentbase
ld_text_size 70128 # program text (code) size inbytes
ld_data_base 0x10000000 # program initialized data segmentbase
ld_data_size 8192 # program init'ed `.data' and uninit'ed`.bss' size in bytes
ld_stack_base 0x7fffc000 # program stacksegment base (highest address in stack)
ld_stack_size 16384 #program initial stack size
ld_prog_entry 0x00400140 # programentry point (initial PC)
ld_environ_base 0x7fff8000 # programenvironment base address address
ld_target_big_endian 0 # targetexecutable endian-ness, non-zero if big endian
mem.page_count 26# total number of pages allocated
mem.page_mem 104k # total sizeof memory pages allocated
mem.ptab_misses 26 # total first levelpage table misses
mem.ptab_accesses 476132 # total page tableaccesses
mem.ptab_miss_rate 0.0001 # first level page table missrate到此simplescalar安装成功,上面的输出结果就是模拟后输出的数据
Record2:
1.在ubuntu12.04中安装gem5模拟器,类似与simplescalar,但是gem5可以模拟多核,simplescalar只能模拟单核
-
先安装Mercurial,使用命令$sudoapt-get install Mercurial,
-
然后使用命令$hgclone
http://repo.gem5.org/gem5-stable
~
/professionalSoftware/gem5
下载稳定版本的
gem5
的源码到制定的目录
-
接下来需要编译源码,但是在编译之前需要安装几个必要的工具,他们分别是
g++
编译其(注意要使用
4.5
版本的,
4.6
版本的编译不能通过),
python,swig,zlib(
我没有安装但是同样可以编译通过
),m4.
-
如果已有的
g++
不是
4.6
版本的使用一下命令更换版本
$sudoapt-get install g++-4.5
$sudorm /usr/bin/g++
$sudoln -s /usr/bin/g++-4.5 /usr/bin/g++
-
其他的软件都可以使用
sudoapt-get install [software name]
进行安装
-
进入
gem5
的下载目录执行如下命令进行编译:
pythonscons.py build/X86/gem5.opt
如果出现错误:
can'tfind python.h header in [‘
/usr/include/python2.7'
]
解决:
sudoapt-get install python-dev
PS:
由于第一次安装的时候使用的
ALPHA
平台,所以我想换成
X86
平台,我删除了
gem5
重新编译,可是这次使用上面的命令不行了,提示错误找不到
scons.py
文件。于是使用
scons build/X86/gem5.opt
进行编译就可以了。
-
编译通过后进行测试
:build/X86/gem5.optconfigs/example/se.py -ctests/test-progs/hello/bin/X86/linux/hello
输出
helloworld!
说明安装成功。
PS
:这里运行测试的是
gem5
自带的测试程序,我自己尝试这自己写了一个简单的
hellomine.c,
功能仅仅只是输出
hellomy world!.
第一次使用
gcc-o hellomine hellomine.c
编译,然后使用
build/X86/gem5.optconfigs/example/se.py -c./hellomine
运行是出现错误,提示模拟器只能运行静态编译的程序,不能是动态编译。所以我在编译是使用
gcc -o hellomine hellomine.c -static
,然后再一次运行,运行成功。