本学期学的两门核心课,一个CS,一个OS。对我来说都有一定难度。
CS总评91/100。主要是期末考试没太发挥好,
主要原因是存储部分有个++没有考虑写的情况,送了8分。
总领
CS的学习采用最经典的书——CSAPP,也被称为计算机领域圣经,这是必看的书。
学习完这本书,对于计算机的组成以及汇编语言会有一定的了解,能大致知道计算机的系统层面是怎么工作的。
教学采用的是第二版,我的书是第三版,这两者之间的主要不同点在于第二版是以32位系统为例讲解的,而第三版是以64位系统为例讲解的。主要在第三章汇编语言的部分会有不同,一是寄存器的表述,64位系统寄存器有rax%等,而32位系统寄存器只有eax%等。另一个主要是调用函数时存储调用参数以及返回参数,64位系统由于寄存器较多,有时可能不用在栈内储存调用参数,但32位系统寄存器较少,会更多地占用栈的空间。此外,返回的参数储存在哪里也会有影响。
总而言之,应试而言,至少第三章的汇编语言部分得看第二版,否则会做不了题目。
(封面是著名的存储器山,反应主存读写吞吐量的)
课程成绩主要由作业+实验+小班+期中(10%)+期末(40%)这5个部分组成
作业和实验不知道怎么给分的。很迷。
作业
作业我看了一眼,几乎都是100,大家应该都一样。说实在,学到大二往后,看作业基本上没什么意义了,大家都能抄到100分,平时分都能拉满,究竟学没学懂,就只有自己能知道了。
作业我觉得还是自己要做一遍,给挑出来作为作业的题目,要么是往年的期末考题,要么是书上原题,对于知识掌握和应试都有很大帮助,做完之后校对到100即可,错的自己记号。
实验
第一个实验是研究生助教学姐验收的,可能她其实不太懂,但我讲的可能还可以,好像给了A。
第二个实验是一个临时征派的老师,可能他其实不太懂,讲运行时栈我给他讲了几遍,他好像能听懂了,给了我B++,不是很懂。
第三个实验和第四个实验都是A橙_学长给我验收的,A橙_学长可真的是太懂了,因为他去年自己做过这些实验,只能说不愧是计科top,太强了!!!学长不仅能够在短时间内判断我们有没有真的自己做这个实验,还能通过几个问题快速确定我们理解到了什么程度。厉害!
PrototypeSystemLab,DataLab,BombLab,ShellLab
这四个实验都很精彩。
【BombLab】
特别是BombLab,特别值得花很多时间研究!从一点都不懂,通过自己研究搞懂整个给定汇编代码的运行逻辑。对于自己的汇编语言基础是一个很大的提升。记得一开始几题其实很简单,但我花了好多时间去理解它的模式,一道题往往能花上一个下午,甚至一个晚上。总共六道题和隐藏题加起来应该能研究了20个小时。可能是我天资比较愚笨,但这种依靠时间堆砌的方法真的能让我看懂汇编代码。看着这些汇编代码能让我忘记打崩三,忘记原神启动。从一点不懂到有一点懂,再到有一些理解的过程,能给人带来纯真的喜悦。
HNU-计算机系统-实验3-BombLab_甘晴void的博客-CSDN博客本次实验是根据每个同学的学号来生成的,所以无法抄袭,只能借鉴思路,每个同学的问题从答案到过程都有许多不同,唯一相同的只能说是每题的考点。本次实验收到的是一个文件包,打开之后是这样的几个文件。有关这个实验的讲解我录制了一个视频上传了B站,链接如下,感觉报告没有看懂的同学可以看一下这个视频,特别是对于汇编代码有进一步的讲解,可能会更容易理解一些。https://blog.csdn.net/qq_39480177/article/details/130410714
【ShellLab】
ShellLab让我有机会能自己实现一个简单shell,这个实验主要是参考的学长代码作为主体框架,然后自己去看懂复现,应该是我自己代码能力的问题。主要就是信号的传递以及处理,包括信号处理函数,重点还在于对于jobs列表的修改要上锁,这里涉及到OS的临界区问题,这个列表同时只能一个在修改,防止出现并发问题。具体的解释在实验里有。
HNU-计算机系统-实验4-ShellLab_甘晴void的博客-CSDN博客这个实验是大家在本课程第一次体验系统级编程,涉及过程,过程控制和信号的相关知识。1.你需要干什么? 你需要构建一个简单的类Unix/Linux Shell。基于已经提供的“微Shell”框架tsh.c,完成部分函数和信号处理函数的编写工作。使用sdriver.pl可以评估你所完成的shell的相关功能。2. 准备工作 使用命令tar xvf shelab-handout.tar 解压缩文件; 使用命令 make 去编译和链接一些测试例程;~~~~~~~~~~~~~~~~~~~~~~https://blog.csdn.net/qq_39480177/article/details/130785729
【DataLab】
DataLab主要是对于二进制数的理解,我们的实验只是一小部分,还有很多题目在CSAPP官网上有。这个实验主要是在限制操作数与操作符下,只通过二进制数之间的与或非反移位等简单的限制操作,实现将这个二进制数改变成目标的效果。
HNU-计算机系统-实验2-DataLab_甘晴void的博客-CSDN博客HNU-计算机系统-实验2-DataLabhttps://blog.csdn.net/qq_39480177/article/details/129779347【原型机实验】
说实在,这个实验我觉着其实没那么有意思。但是也是对虚拟机理解的重大一吧。
HNU-计算机系统-实验1-PrototypeSystemLab_甘晴void的博客-CSDN博客了解冯诺伊曼体系结构;理解指令集结构及其作用;理解计算机的运行过程,就是指令的执行过程,并初步掌握调试方法。理解计算机的运行过程,对指令集进行修改指令4 1 R2将累加步长1存放在R2内;此后指令2 R0 R1,这步每次将R0累加至R1,其中R1存放累加结果,也就是最终结果;指令3 R2 R0是计算下一个需要累加的数并存放在R0内。https://blog.csdn.net/qq_39480177/article/details/130417583
小班
小班是达老师(哒老师)教的,很喜欢这样有互动的小班,感觉能push我们学习
各次讨论课PPT如下:
讨论课1-8z
【challenge部分】
最有趣的是讨论课7的challenge部分,要求缩小可执行文件的大小,用最小的空间能运行并输出2023。实际上这个考察的就是对于链接静态库这一章的知识点的理解,称为一个实验毫不为过,我是花了一晚上的时间熬夜到3点,利用网上有限的资料进行了一些探索,虽然方向跟老师的方向可能不太一样,但还是做出了一些结果的。这个讨论真的非常有趣。
HNU-计算机系统-Challenge_甘晴void的博客-CSDN博客但这区区四行代码,在 Ubuntu 中使用 gcc 形成的可执行文件大小可能有 7KB 之多,请尝试分析 ta 到底增加了什么内容导致可执行文件的大小产生这样的膨胀?基于前述分析,如果代码是这样的:int main(void) { return 2023; }不修改这一行 C 代码源程序,你可以直接修改二进制可执行文件,获取功能没有任何变化的更小(字节数量)可执行文件吗?分享你的方法(^-^)https://blog.csdn.net/qq_39480177/article/details/130784916
期中
没什么好说的,给了题库,刷题就完事了。最好别扣分,错两道题总评就少0.3分,很致命。
期末
【下次再写】