PA 4/5 实验报告
常子豪 changzihao17s@ict.ac.cn
2017/12/17
必答题:
分时多任务的具体过程请结合代码, 解释分页机制和硬件中断是如何支撑仙剑奇侠传和hello程序在我们的计算机系统(Nanos-lite, AM, NEMU)中分时运行的.
答:
为了支持分页机制,实验中我们主要做了三部分的修改
1.AM部分
该部分主要包括_pte_init(初始化内核分页机制)、 _map(虚拟地址到物理地址的映射)、_umake(在堆栈上初始化陷阱帧)、_switch(切换cr3)等,在nexus-am/am/arch/x86-nemu/src/pte.c中涉及的代码均是与硬件相关,是硬件层面支持页表机制的状态维护。
2、Nanos-lite部分
该部分与分页机会相关的内容主要包括loader(),将文件以页的形式载入内存,并通过_map建立虚拟地址也物理地址的映射。
3、Nemu部分
该部分对分页自己的支持主要是通过vaddr_write()、vaddr_read()在对内存进行读写时进行虚拟地址到物理地址的变换,这是整个分页机制得以真诚运行的关键。硬件中断机制
硬件中断是分时多任务实现的又一关键,而对于我们的实验来说,这关键中的关键便是时钟中断(_EVENT_IRQ_TIME),和内核自陷(_EVENT_TRAP)。通过这样两种中断保证操作系统中分时多任务机制的正常运行。总得来说,在整个分时多任务机制中,页表机制保证了操作系统的不同的进程按照相同的虚拟地址来对内存进程访问,这使得操作系统能够运行位置无关代码,同时也实现了按需分配内存和突破物理地址的上限。但是上述折现过程也仅仅是实现了多任务机制对内存资源的有效利用,而保证分时多任务的切换则是通过硬件中断机制得以实现。通过时钟中断来保证不同的进程能够根据一定规则相对公平的利用cpu实行,从而在宏观上实现多任务同时进行。
感悟:
本次的报告涵盖了pa4、pa5两部分的内容,主要涵盖了分支多任务、页表和浮点机制。在完成pa4、pa5的过程中,恰逢所选操作系统课程也讲解到相应部分,结合linux 0.11与pa不难发现,在现在操作系统的各种版本中分时多任务、页表机制是不可或缺的部分。尽管操作系统中的调度算法千变万化,但是其核心目标就是保证操作系统多个进程能够相对公平的运行,且能够满足用户的需求。而对于内存和文件系统的管理,现代操作系统几乎无一列外全采用分页式管理,可能不同版本操作系统在页表机制的实现上略有差异,但是其核心思想是一致的,对于内存的管理分页机制就是为了满足虚拟地址到物理地址的映射。
目前在实际应用中出现的硬件和操作系统的种类可能有成百上千种,我们不可能一一去了解其实现细节,但是只要能够掌握住了他们设计的初衷及其核心思想,无论今后接触哪一种新的硬件和操作系统都能够很快上手。我觉这才是在完成pa实验后真正应该取得的收获。
pa实验到此基本结束,实现pa的过程也是一路跌跌撞撞。总得看来,我觉在整个pa实验中对与我个人来时主要的难点有一下三个:
- 如何下手,虽然在很多时候在实验指导书中已经指明了应该从哪里开始,但是从一个现在有代码框架去按照自己的思路代码还是有一点难度的,很多时候当我花了很大精力去实现某一个功能时,可能后果头却在无意中发现框架中已经为我们提供了很多课调用的函数。就像nexus-am/am/arch/x86-nemu/include/x86.h中已经给出了很多虚拟地址转换中可能会用到的宏函数,但是因为没有看到,在实验中这些功能大多都是靠自己实现。这个可能还是与自己没有能详细阅读框架有关。
- debug ,在完成pa实验之后才深刻的领悟了,代码写完了才只是完成一半,或者一半都不到,而剩下一半是debug。在整个实验中,我遇到各种各样的奇怪的bug,而随着实验的推进,debug的难度也越来越大,影响最深的是在pa4中,实现系统调用时出现了问题,无论如果也找不出操作系统实现中的问题,最终在nemu的rtl操作中找了问题所在,因为没有考虑符号拓展shr在非32位情况下出错。
- 如何提高代码效率,在运行打字游戏的实验中,需要在对内存进行写操作实现屏幕刷新。我第一次在实现没有考到性能因素按照自己的想法一个复制内容到内存的函数,结果游戏的帧数只有5帧左右,导致游戏根本无法流畅运行,但是后来思考了一下换成了库函数memcpy效率很大提升,帧数直接到达18帧。
回想整个实验,pa给我带来的不仅是对x86指令集、分页机制、系统调用过程的一个深入了解。我觉得更改大的收获是让我了解到整个计算机协同工作的过程(nemu、am、nano-lite)和在一个相对较大的工程中,如何去维护代码结构、可读性、效率以及如果利用现有手段去寻找代码中的bug。
最后,我想说,自己写下的bug总有一天会早上门来,让你用百倍的代价去为他买单。所以希望自己以后能够少写bug。