《计算机系统基础》课程组 汪亮
2022年8月
-
你需要完成教程中的所有任务,除明确注明是可选任务的额外加分项以外,其余都是必做任务;
-
经常执行如下三步有利于保障仓库安全,建议一天至少push一次,当然我们的Makefile会在每次执行make的时候自动commit:
git add . git commit -m '一段消息描述你距上一次commit做了哪些改动' git push // 可选,如果你设置了远程仓库的话
-
请勿抄袭,也不要将你自己的代码放在公开的仓库中!
-
i386手册: http://css.csail.mit.edu/6.858/2014/readings/i386.pdf
-
x86及x87指令集(包含手册上没有的指令): http://www.felixcloutier.com/x86/
-
Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1: Basic Architecture
本章讲解了配置实验环境的详细过程
现代计算机的世界是一个由0(低电平)和1(高电平)构成的世界,所有的信息都被表示成01串形式的数据。我们把世界上所有需要表示的数据大概分一分,发现可以分为两大类:非数值型和数值型。
非数值型大体上对应的是用于表征类别或个体的信息,比如汉字、英文字母、阿拉伯数字、每个学生个体等等,我们可以将每一个需要表示的对象赋予一个编号,并且让大家都遵守统一的编号规则就行了。比如ACSII编码,UTF-8编码等等。我们在PA 2开始要重点关注的指令数据,其操作码就可以认为是一种非数值型数据。
与非数值型相对应的是数值型的信息,用于进行科学计算,主要包含两种类型:整数和实数(复数总可以用两个实数来表示)。而在整数和实数上又定义了加减乘除等各种运算规则。计算机顾名思义就是要进行计算的,在这一节中我们要重点关注的就是以整数和实数为代表的数值型信息的表示、存取和运算。
在PA 1中,配合理论课的节奏,我们先通过数据的存储开始简单了解NEMU的总体结构,进而从整数和浮点数的表示、存取和运算出发,开始构建一台完整计算机的旅程。
PA 1三个阶段都对应课本第2章:数据的机器级表示与处理。此处和以后所指课本为:袁春风老师编写的《计算机系统基础(第2版)》,机械工业出版社,2018.7。
通过PA 1的努力,我们已经使得NEMU具备了初步的数据表示、存储和运算能力,可以说是搭建了一个功能强大的计算器。但是,我们还不能让我们的机器按照我们的意愿去解决更为复杂的计算问题。那要怎样做才行呢?作为计算机方向的专业选手,我们已经知道答案:写程序!那程序到底是什么,计算机是怎样运行程序的?这就是我们通过这一阶段的PA需要解决的问题。
在基本的理论学习之后,我们了解到,其实所谓程序就是由一条又一条称为指令的01串所构成的序列。CPU能够解读这些由01串编码好的指令并将其转换成对应的操作。硬件的设计者和软件开发者之间达成一项协议:什么样的01串对应什么样的指令,会产生什么样的操作。这项协议的具体内容就构成了所谓的指令集体系结构(Instruction Set Architecture, ISA),也就是i386手册所论述的东西。
在真实的机器上,ISA是通过半导体芯片来实现的,这就是我们能够看得见摸得着的硬件。而NEMU则是一个软件实现的模拟器,那它能够和硬件实现的机器一样用来运行程序吗?答案是肯定的,其原因就在于:对于上层的程序而言,不管是怎么实现的,只要有人实现了ISA的功能,我就能通过编排指令序列来完成需要的计算功能。因此,我们只要用软件来造一台能够读懂指令并模拟其执行过程的“软”机器就可以了。这就相当于给应用程序创造一个绝对逼真的虚拟现实环境,程序在其中分不清是真是幻,于是对程序而言模拟器和硬件机器就没有区别。
PA 2-1对应课本第3章:程序的转换及机器级表示(部分包括第5章:程序的执行);PA 2-2对应课本第4章:程序的链接,与课本4.2节的关系更密切一点;PA 2-3与课本知识没有对应关系。
通过PA 2的实验,我们已经创造了一台能够进行各种复杂运算的机器。在以后学习了包括图灵机在内的知识后,我们就能够了解到在PA 2中所实现机器的强大之处:它的计算能力和现今所有的计算机等价。各种超级计算机只是算得比咱快,但我们的机器说不可计算的问题,超级计算机甚至是量子计算机也没办法。
做计算理论的科学家们到这一阶段或许就心满意足了,但我们却还不能止步不前。我们希望机器能够算得更快,于是针对速度的瓶颈之一:访存操作进行加速,于是便设计了cache。我们希望在机器上运行的程序和数据得到更多保护,于是便加入了分段保护机制。我们希望同时运行的多个程序之间互不干扰,于是便产生了虚拟地址空间的做法。
本阶段三个小阶段都对应课本第6章:层次结构存储系统。
通过前三个阶段的PA,我们已经基本构建了一个能够运算的机器的所有功能。目前为止,NEMU只能够进行正常的控制流执行。在最后阶段,我们添加异常控制流的支持并使得NEMU能够实现和外设的I/O。最终,我们希望在NEMU模拟器上能够运行类似仙剑奇侠传这样的小游戏。
PA 4-1对应课本第7章:异常控制流;PA 4-2对应课本第8章:I/O操作的实现;PA 4-3与课本知识没有对应关系,欢迎各位在完成这一阶段后放飞自我,魔改框架代码。
本教程及所涉框架代码和实验指导内容是在南京大学余子濠同学2014年所完成的PA框架代码和教程基础上发展而来。在教学过程中,老师和同学们提供了大量的反馈意见,帮助我们修正框架代码的bug并提高实验指导的内容。在此感谢所有为PA做出过贡献的老师和同学们!
本框架代码部分功能的开发得到了南京大学本科生创新项目《面向入门级编程活动的压力检测和效果评估方法研究》的支持。