Y86-64模拟器是CSAPP里学习处理器体系结构需要用到的指令集。与x86-64相比,Y86-64指令集的数据类型、指令和寻址方式都要少一些。它的字节级编码也比较简单,机器代码没有相应的x86-64代码紧凑,不过设计它的CPU译码逻辑也要简单一些。
虽然Y86-64指令集很简单,它仍然足够完整,第四章的学习是完全基于该指令集的,我们要在linux下安装这个指令集的模拟器,包括SEQ和PIPE处理器的模拟器,以及GUI界面。
一、下载Y86-64模拟器
可以在这里下载完整的安装包(学校老师发的)
去CSAPP官网下载也可以。
二、安装词法分析工具
- 安装flex
$ sudo apt install flex
- 安装bison
$ sudo apt install bison
三、安装静态链接库TCL、TK(支持图形界面)
$ sudo apt-get install tcl-dev tk-dev
$ sudo apt-get install tcl8.5-dev tk8.5-dev
如果这一步报错可以不用理会。
四、解压安装包
$ tar vxf CMU-Y64.tar
五、修改Makefile文件
其实就是修改路径和刚才装的tcl、tk版本。
把三个方框里的内容作如下修改:
六、编译GUI界面
在CMU-Y64目录下:
$ make clean
$ make
这是最容易遇到问题的一步,几乎所有人都会在这里编译错误
- make后编译错误,错误信息如下:
(cd misc; make all)
make[1]: 进入目录“/home/dragon/sim/misc”
gcc -Wall -O1 -g -c yis.c
gcc -Wall -O1 -g -c isa.c
gcc -Wall -O1 -g yis.o isa.o -o yis
gcc -Wall -O1 -g -c yas.c
flex yas-grammar.lex
mv lex.yy.c yas-grammar.c
gcc -O1 -c yas-grammar.c
gcc -Wall -O1 -g yas-grammar.o yas.o isa.o -lfl -o yas
bison -d hcl.y
flex hcl.lex
gcc -O1 node.c lex.yy.c hcl.tab.c outgen.c -o hcl2c
make[1]: 离开目录“/home/dragon/sim/misc”
(cd pipe; make all GUIMODE=-DHAS_GUI TKLIBS="-L/usr/lib/x86_64-linux-gun/ -ltk8.5 -ltcl8.5" TKINC="-I/usr/include/tcl8.5")
make[1]: 进入目录“/home/dragon/sim/pipe”
#Building the pipe-std.hcl version of PIPE
…/misc/hcl2c -n pipe-std.hcl < pipe-std.hcl > pipe-std.c
gcc -Wall -O2 -I/usr/include/tcl8.5 -I…/misc -DHAS_GUI -o psim psim.c pipe-std.c
…/misc/isa.c -L/usr/lib/x86_64-linux-gun/ -ltk8.5 -ltcl8.5 -lm
/tmp/ccuL1R7t.o:(.data.rel+0x0):对‘matherr’未定义的引用
collect2: error: ld returned 1 exit status
Makefile:42: recipe for target ‘psim’ failed
make[1]: *** [psim] Error 1
make[1]: 离开目录“/home/dragon/sim/pipe”
Makefile:27: recipe for target ‘all’ failed
make: *** [all] Error 2
标黄字段说明进入pipe目录并编译psim.c和pipe-std.c时出现了对’matherr’未定义引用的错误,所以我们进入pipe文件夹中的psim.c和pipe-std.c文件,ctrl+f 搜索matherr,将包含matherr的语句注释掉,总共有两行,都在psim.c中:
- 继续make clean;make,输出信息如下:
rm -f *~ core
(cd misc; make clean)
make[1]: 进入目录“/home/dragon/sim/misc”
rm -f *.o *.yo .exe yis yas hcl2c mux4 ~ core.
rm -f hcl.tab.c hcl.tab.h lex.yy.c yas-grammar.c
make[1]: 离开目录“/home/dragon/sim/misc”
(cd pipe; make clean)
make[1]: 进入目录“/home/dragon/sim/pipe”
rm -f psim pipe-.c *.o .exe ~
make[1]: 离开目录“/home/dragon/sim/pipe”
(cd seq; make clean)
make[1]: 进入目录“/home/dragon/sim/seq”
rm -f ssim ssim+ seq-.c *.o *~ *.exe *.yo *.ys
make[1]: 离开目录“/home/dragon/sim/seq”
(cd y86-code; make clean)
make[1]: 进入目录“/home/dragon/sim/y86-code”
rm -f *.o *.yis *~ *.yo *.pipe *.seq *.seq+ core
make[1]: 离开目录“/home/dragon/sim/y86-code”
(cd ptest; make clean)
make[1]: 进入目录“/home/dragon/sim/ptest”
rm -f *.o *~ *.yo *.ys
make[1]: 离开目录“/home/dragon/sim/ptest”
(cd misc; make all)
make[1]: 进入目录“/home/dragon/sim/misc”
gcc -Wall -O1 -g -c yis.c
gcc -Wall -O1 -g -c isa.c
gcc -Wall -O1 -g yis.o isa.o -o yis
gcc -Wall -O1 -g -c yas.c
flex yas-grammar.lex
mv lex.yy.c yas-grammar.c
gcc -O1 -c yas-grammar.c
gcc -Wall -O1 -g yas-grammar.o yas.o isa.o -lfl -o yas
bison -d hcl.y
flex hcl.lex
gcc -O1 node.c lex.yy.c hcl.tab.c outgen.c -o hcl2c
make[1]: 离开目录“/home/dragon/sim/misc”
(cd pipe; make all GUIMODE=-DHAS_GUI TKLIBS="-L/usr/lib/x86_64-linux-gun/ -ltk8.5 -ltcl8.5" TKINC="-I/usr/include/tcl8.5")
make[1]: 进入目录“/home/dragon/sim/pipe”
#Building the pipe-std.hcl version of PIPE
…/misc/hcl2c -n pipe-std.hcl < pipe-std.hcl > pipe-std.c
gcc -Wall -O2 -I/usr/include/tcl8.5 -I…/misc -DHAS_GUI -o psim psim.c pipe-std.c
…/misc/isa.c -L/usr/lib/x86_64-linux-gun/ -ltk8.5 -ltcl8.5 -lm
./gen-driver.pl -n 4 -f ncopy.ys > sdriver.ys
…/misc/yas sdriver.ys
./gen-driver.pl -n 63 -f ncopy.ys > ldriver.ys
…/misc/yas ldriver.ys
make[1]: 离开目录“/home/dragon/sim/pipe”
(cd seq; make all GUIMODE=-DHAS_GUI TKLIBS="-L/usr/lib/x86_64-linux-gun/ -ltk8.5 -ltcl8.5" TKINC="-I/usr/include/tcl8.5")
make[1]: 进入目录“/home/dragon/sim/seq”
#Building the seq-std.hcl version of SEQ
…/misc/hcl2c -n seq-std.hcl <seq-std.hcl >seq-std.c
gcc -Wall -O2 -I/usr/include/tcl8.5 -I…/misc -DHAS_GUI -o ssim
seq-std.c ssim.c …/misc/isa.c -L/usr/lib/x86_64-linux-gun/ -ltk8.5 -ltcl8.5 -lm
/tmp/cczSQwXi.o:(.data.rel+0x0):对‘matherr’未定义的引用
collect2: error: ld returned 1 exit status
Makefile:42: recipe for target ‘ssim’ failed
make[1]: *** [ssim] Error 1
make[1]: 离开目录“/home/dragon/sim/seq”
Makefile:27: recipe for target ‘all’ failed
make: *** [all] Error 2
由以上信息知pipe目录里的内容已经编译完成了,在进入seq目录时出现了编译错误。同第一步的做法,进入seq文件夹,在seq-std.c和ssim.c文件中寻找有matherr 的行,在ssim.c中找到了两行相关信息,注释掉:
- 继续重新编译,make clean;make
输出以下信息:
rm -f *~ core
(cd misc; make clean)
make[1]: 进入目录“/home/dragon/sim/misc”
rm -f *.o *.yo .exe yis yas hcl2c mux4 ~ core.
rm -f hcl.tab.c hcl.tab.h lex.yy.c yas-grammar.c
make[1]: 离开目录“/home/dragon/sim/misc”
(cd pipe; make clean)
make[1]: 进入目录“/home/dragon/sim/pipe”
rm -f psim pipe-.c *.o .exe ~
make[1]: 离开目录“/home/dragon/sim/pipe”
(cd seq; make clean)
make[1]: 进入目录“/home/dragon/sim/seq”
rm -f ssim ssim+ seq-.c *.o *~ *.exe *.yo *.ys
make[1]: 离开目录“/home/dragon/sim/seq”
(cd y86-code; make clean)
make[1]: 进入目录“/home/dragon/sim/y86-code”
rm -f *.o *.yis *~ *.yo *.pipe *.seq *.seq+ core
make[1]: 离开目录“/home/dragon/sim/y86-code”
(cd ptest; make clean)
make[1]: 进入目录“/home/dragon/sim/ptest”
rm -f *.o *~ *.yo *.ys
make[1]: 离开目录“/home/dragon/sim/ptest”
(cd misc; make all)
make[1]: 进入目录“/home/dragon/sim/misc”
gcc -Wall -O1 -g -c yis.c
gcc -Wall -O1 -g -c isa.c
gcc -Wall -O1 -g yis.o isa.o -o yis
gcc -Wall -O1 -g -c yas.c
flex yas-grammar.lex
mv lex.yy.c yas-grammar.c
gcc -O1 -c yas-grammar.c
gcc -Wall -O1 -g yas-grammar.o yas.o isa.o -lfl -o yas
bison -d hcl.y
flex hcl.lex
gcc -O1 node.c lex.yy.c hcl.tab.c outgen.c -o hcl2c
make[1]: 离开目录“/home/dragon/sim/misc”
(cd pipe; make all GUIMODE=-DHAS_GUI TKLIBS="-L/usr/lib/x86_64-linux-gun/ -ltk8.5 -ltcl8.5" TKINC="-I/usr/include/tcl8.5")
make[1]: 进入目录“/home/dragon/sim/pipe”
#Building the pipe-std.hcl version of PIPE
…/misc/hcl2c -n pipe-std.hcl < pipe-std.hcl > pipe-std.c
gcc -Wall -O2 -I/usr/include/tcl8.5 -I…/misc -DHAS_GUI -o psim psim.c pipe-std.c
…/misc/isa.c -L/usr/lib/x86_64-linux-gun/ -ltk8.5 -ltcl8.5 -lm
./gen-driver.pl -n 4 -f ncopy.ys > sdriver.ys
…/misc/yas sdriver.ys
./gen-driver.pl -n 63 -f ncopy.ys > ldriver.ys
…/misc/yas ldriver.ys
make[1]: 离开目录“/home/dragon/sim/pipe”
(cd seq; make all GUIMODE=-DHAS_GUI TKLIBS="-L/usr/lib/x86_64-linux-gun/ -ltk8.5 -ltcl8.5" TKINC="-I/usr/include/tcl8.5")
make[1]: 进入目录“/home/dragon/sim/seq”
#Building the seq-std.hcl version of SEQ
…/misc/hcl2c -n seq-std.hcl <seq-std.hcl >seq-std.c
gcc -Wall -O2 -I/usr/include/tcl8.5 -I…/misc -DHAS_GUI -o ssim
seq-std.c ssim.c …/misc/isa.c -L/usr/lib/x86_64-linux-gun/ -ltk8.5 -ltcl8.5 -lm
make[1]: 离开目录“/home/dragon/sim/seq”
(cd y86-code; make all)
make[1]: 进入目录“/home/dragon/sim/y86-code”
…/misc/yas abs-asum-cmov.ys
…/misc/yas abs-asum-jmp.ys
…/misc/yas asum.ys
…/misc/yas asumr.ys
…/misc/yas asumi.ys
…/misc/yas cjr.ys
…/misc/yas j-cc.ys
…/misc/yas poptest.ys
…/misc/yas pushquestion.ys
…/misc/yas pushtest.ys
…/misc/yas prog1.ys
…/misc/yas prog2.ys
…/misc/yas prog3.ys
…/misc/yas prog4.ys
…/misc/yas prog5.ys
…/misc/yas prog6.ys
…/misc/yas prog7.ys
…/misc/yas prog8.ys
…/misc/yas prog9.ys
…/misc/yas prog10.ys
…/misc/yas ret-hazard.ys
make[1]: 离开目录“/home/dragon/sim/y86-code”
说明编译成功。
七、运行GUI界面
$ cd pipe
$ ./psim -t -g ../y86-code/asum.yo