Mengzelev's Blog

PA2实验报告

Word count: 1,711 / Reading time: 6 min
2018/11/06 Share

实验进度描述

2018/10/04
RTF实验讲义,RTFSC,我是谁,我在哪儿,我要干什么

2018/10/05
经历了两天的RTFSC后终于看懂了框架代码是干嘛的,RTFM实现了sub,push,ret,call等指令,在nemu中运行了第一个程序dummy

2018/10/21
听了同学们的建议,先实现了diff-test,结果发现PA2.1的指令实现有bug。修复了这些bug并温故框架代码的构成

2018/10/22
花了一整天对照着FM实现了exec目录下大部分指令,填写opcode_table巨表,然而有海量bug等待发现

2018/10/27
diff-test跑完了cputest中所有的测试,修复了能发现的PA2.2中的bug。bash runall后看到了绿油油的full-combo,心情舒畅。然而并不知道2.3的时候还有海量bug等着自己

2018/10/28
实现了string.c中所有的库函数和sprintf,先在nemu外单独手动测试,然后放入klib中,成功运行string.chell-str.c,PA2.2基本完成,make submit

2018/11/2
实现了in/out指令,成功运行hello。与同学出去吃火锅,讨论发现自己的diff-test歪打正着可以正常运行。

2018/11/3
实现了printf,测试时钟时陷入莫名其妙的Segmentation Fault,在指令中加入大量Log测试,无果;找到大腿进行文件替换,无果;把指令实现和库函数又给了大腿二号进行替换,发现一切运行正常。心态爆炸,怀疑人生,git滚回到2.2完成的状态,从2开始的PA2.3。修仙实现了时钟、键盘和vga,并通过了相关测试,成功运行打字游戏(虽然慢的一笔)。跑分测试时还是出现了bug,遂开启diff-test后滚去睡觉

2018/11/4
起来看到结果发现是neg指令写错了,修复bug后成功运行了三个跑分测试。看到超级无敌慢动作马里奥,差点笑死,录成视频发到qq空间被jyy点赞了。复习链接相关知识,自学Makefile语法,编写硬核实验报告。

必答题

只有聪明的人才看得见

我遇到的那些bug

以后实验报告新增这一环节,希望可以帮到其他人

  • 有些指令不是RTL完了就完事的,还需要operand_write写入到相应位置
  • test指令手册表意不清,虽然写了DEST := LeftSRC AND RightSRC,但是两个操作数并不需要改变,不需要进行operand_write
  • 框架里已经为你准备了丰富多彩的译码函数,有些指令有自己特殊的译码函数,赶紧到decode.h里去康康吧!
  • ret指令需要跳转到返回地址的,没有好好RTFM的后果
  • sar是需要符号扩展的
  • 译码函数的立即数读入也是需要符号扩展的
  • 编译timetest的时候链接出错:undefined reference to,其实是因为stdio.c没有加上重要的头文件
  • 运行跑分测试coremark时出现内存地址越界,发现是opcode_table中的imul指令的译码函数写错了
  • neg指令只需要直接取反加一
  • 不知道时钟怎么写,可以参考一下_putc的代码,里面有提示
  • native的输入输出实现里有不少提示可供参考
  • 框架代码中没有rol指令,不知道是可爱PA作者的疏忽还是故意让我们练手的

蓝框思考题

临近期中考试,时间不是很充裕,写得很少,但愿今后有机会二周目思考吧

  • Q:AT&T格式反汇编结果中的少量指令, 与i386手册中列出的指令名称不符, 如cltd. 除了STFW之外, 你有办法在手册中找到对应的指令吗? 如果有的话, 为什么这个办法是有效的呢?
    A:先STFW试图搞清楚这个指令是干什么的,然后翻手册的目录寻找描述差不多的指令。比如cltd是Convert longword to doubleword的意思,翻手册的目录能找到意思差不多的Convert word to double word。运气好的话可能在STFW的时候就能找到对应的i386的指令名称了。

  • Q:你或许会感到疑惑, 代码优化不是一件好事情吗? 为什么会有volatile这种奇葩的存在? 思考一下, 如果代码中p指向的地址最终被映射到一个设备寄存器, 去掉volatile可能会带来什么问题?
    A:因为编译器基本是根据输入输出状态进行的代码优化,而我们有些时候是care中间过程的,例如lab01中的性能测试。如果代码中p指向的地址最终被映射到一个设备寄存器,可能会发生设备状态的跳变,比如显示器某块地方应该是由蓝变绿再变红,会直接从蓝色变成红色。

实验心得

  • 未测试的代码永远是错的,测试过的代码也不会是对的!隐藏bug无处不在。【PA2.2full-combo的大家几乎都在2.3里发现了cputests没能暴露的bug,以此类推PA3的时候可能还会发现PA2的bug
  • 要及时坚定滚回去从头再来的决心,试过了力所能及的所有方法都找不出来的bug就不要找了,肯定是在一些玄学的地方犯了玄学的错误,干脆从头重新写一遍
  • am相关的概念还不是非常清楚,目前还不影响做实验,但还是想进一步了解
  • Copy-paste是坏文明
  • github private远程库保命是真的很重要,安心多了
  • 跑分结果堪忧,但是本着先写对,再完美的宗旨,不管了还是值得开心一下的
  • bug死活找不出的时候容易心态血崩,但是这时候只要实现一个小的功能就能瞬间高兴回来
  • 敲代码真**开心

Appreciation

  • 感谢“™写™PA真™开心”群的群友们,一起修仙,一起写bug,一起交流bug,帮忙debug,还在心态快崩的时候一起出去约了顿火锅
  • 感谢xy同学,提供了可供替换的大腿,做得太快了,还给我剧透了不少,让我少踩了不少坑
  • 感谢ldw同学,用我的代码替换到了他的代码上证明我的指令集和库函数并没有大问题,给了我滚回去重做的决心(
  • 感谢某位还是不愿意透露姓名的nb学长,通过千里眼,帮忙发现了不少bug

本实验报告同样会将去掉必答题的版本同步上传至个人blog

CATALOG
  1. 1. 实验进度描述
  2. 2. 必答题
  3. 3. 我遇到的那些bug
  4. 4. 蓝框思考题
  5. 5. 实验心得
  6. 6. Appreciation