送给最后的pa

​ 又是3个月没写过博客了,今天看到了学长发的“PA反馈精选”,突然回想起来交PA压缩包的那天,心情很糟,草草写了两百字就交上去了,现在看到大家的反馈,又忍不住重新回忆一下这一学期的PA之旅。

PA0

​ 这部分其实很简单,配一下PA的环境即可,但讲义上来非得用英语,给我们造成了一些压力(其实很容易啃,至少比paper容易多了)。讲义说的太复杂,最主要的是针对一些之前完全对虚拟机和Linux没有接触过的同学,但其实,说白了,就是需要Linux环境,至于你是用服务器,虚拟机(VMware or virtulbox),Docker,还是双系统,都可以,想用什么用什么,如果后期遇到的问题,那就自己解决呗!比如输出图形,用图形化虚拟机或者真机的就不需要什么Xming,而且Xming的转发效率…..我一开始就是用的VMware, 后来有段时间用两个电脑做,另一台电脑装了Ubuntu-W10双系统,后来又变回VMware。PA0主要就学学虚拟机的搭建与网络配置,vim的使用,git的初体验,基础Linux指令。

PA1

​ 这里要写一个调试器,功能有单步执行、打印程序状态、表达式求值、扫描内存、设置监视点等等,比较简单,不过需要学一下正则表达式,这玩意语法有点反人类,刚开始肯定是用一次看一次手册,根本记不住,后面写多了才熟,不过不用就会忘(答辩的时候耗子哥哥考我一个简单的正则都写错了ORZ)。直接用c写就行。但这里有个玄学问题:后期输出内存后发现它不符合预期,到底是那段功能挂了,还是你的调试器挂了呢?……

PA2

​ 2完全可以说是PA劝退的开始,从这里开始,要开始写指令,i386的手册翻了又翻,取指、译码、执行、访存、写回,程序运行的每一步自己都会感受到。每个指令都会有每个指令的问题,填表也是,挺玄学的,倾尽所有只为能让指令可以跑通。值得注意的是,这里要尽可能地用rtl语句写,否则无法保证不会影响到后期。值得吐槽的是讲义把diff-test放到了2.2的末尾(好像是这里吧?我记得不是很清楚了),导致很多人一开始没有享受到这个超级好用的调试方法,然而有大佬一开始就在群里说了,我2.2一开始遇到bug后得到大佬的指点马上先去实现了diff,这很大程度上给我调2.2的代码节省了比较多的时间,肉眼调试实在是太…….

PA3和PA4

​ 从3开始,我划水的浆就抬起来了,我感觉,3主要说的是中断异常处理、系统调用、文件系统等等,4貌似就是进程切换分时多任务了,具体的我完全不清楚,因为从3.3及以后我基本就没怎么碰了,发出咸鱼的声音.jpg。

吐槽

​ 项目验收之前,我突然发现了一些比较诡异的行为,在PA2分支下能跑通的代码,在PA3分支下反而跑不通了,由于时间原因也没去调了,最后验收的时候还切了分支跑代码。。。调试确实是件很辛苦的事情,可以说写代码的时间远远低于读文档和调试的时间,找对方法很重要,方法合适可以节省挺多时间。至于有人说到群里总是那几位大佬在发言搞得自己不敢提问???emmmmm,我也在群里问过一些白痴问题,也没少块肉呃,再说了,大佬说的大多是自己踩过的坑,不都是好事么?→_→表示无法理解。

​ 总的来说PA还是一门挺不错的课,难度比较大,与理论课的联系算不上十分密切,10分最多只能给7分,除了对指令的执行过程、中断异常的处理、进程的切换、i386指令的细节有了比较多的了解,其他的好像真没什么了。。。反观理论课,给我的印象大多是机器数与真值的转换,汇编语句,过程调用,符号解析,存储管理(特别是高速缓存)等等,中断异常处理、缓冲区溢出攻击、甚至是动态链接,都只是一带而过,说实话要求真心不高(我好像也是站在学完了的角度后说这种话,一开始学的时候也是各种不懂痛苦不堪,或许这就是所谓的马后炮吧23333),如果真想在cs方面有所建树的话,计组还是要认真学的,pa更应该好好做。最后的最后,谢谢四位助教给的高分。