Nachos虚拟内存机制实习报告

上传人:yh****1 文档编号:125629004 上传时间:2020-03-18 格式:DOC 页数:17 大小:525.50KB
返回 下载 相关 举报
Nachos虚拟内存机制实习报告_第1页
第1页 / 共17页
Nachos虚拟内存机制实习报告_第2页
第2页 / 共17页
Nachos虚拟内存机制实习报告_第3页
第3页 / 共17页
Nachos虚拟内存机制实习报告_第4页
第4页 / 共17页
Nachos虚拟内存机制实习报告_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《Nachos虚拟内存机制实习报告》由会员分享,可在线阅读,更多相关《Nachos虚拟内存机制实习报告(17页珍藏版)》请在金锄头文库上搜索。

1、虚拟内存机制实习报告善良的大姐姐2015.4.18目录一:总体概述3二:任务完成情况3任务完成列表(Y/N)3具体Exercise的完成情况3三:遇到的困难以及解决方法15四:收获及感想15五:对课程的意见和建议15六:参考文献15一:总体概述通过认真仔细阅读Nachos系统虚拟内存部分的源代码,理解虚拟内存的管理和应用机制,用户程序的运行逻辑,并修改源代码,达到“实现虚拟存储系统”的目标。二:任务完成情况任务完成列表(Y/N)Exercise1Exercise2Exercise3Exercise4Exercise5Exercise6Exercise7Challengeyesyesyesyes

2、yesyesyesyes具体Exercise的完成情况Exercise 1: 源代码阅读Part1: 阅读code/userprog/progtest.cc,着重理解nachos执行用户程序的过程,以及该过程中与内存管理相关的要点。阅读情况: 用户程序执行过程:步骤相关解释在main函数中,如果检测到传入的参数和“执行用户程序”相关,那么执行StartProcess函数(progtest.cc)在StartProcess函数中装载并运行一个用户程序StartProcess函数中:1. 用OpenFile类打开文件OpenFile类在文件系统中定义,包括各种对文件的基本操作,如read,writ

3、e。实质上是包装了操作系统的底层函数。2. 用AddrSpace类创建一个用户空间,并将打开的文件装载进去创建用户空间包括:1. 获取文件头,并将大小端做适宜转换;2. 通过文件头计算出文件所需空间,包括代码段,初始化数据段,未初始化数据段,栈空间4个部分3. 通过文件所需空间计算出文件所需的虚拟页数量4. 创建用户空间的pagetable,指示了第i个虚拟页(将)对应第i个物理页5. 由于目前是最基本的【直接映射+单用户程序无切换】模式,因此此时要将所有的虚拟页中的内容写到物理页(主存)当中。3. (AddrSpace:InitRegisters())初始化用户空间中的各种寄存器,包括PC设

4、为0,栈指针移到空间底部为执行用户程序做准备!4. (AddrSpace:RestoreState())将用户的部分状态(如pagetable)装载到machine类中,准备执行事实上,仅仅是将用户空间的Pagetable(在第二步创建的)装载到machine的指针中,相当于是用户程序在machine上运行时,是通过machine的pagetable映射找到对应内容运行的5. 调用machine-Run,运行用户程序Machine-run是在mipssim.cc中定义的。其工作原理为:1. 通过OneInstruction(instr)模拟mips,将一条指令进行分割,并软件模拟执行。其中,在

5、OneInstruction函数中,通过machine-ReadMem,读取主存中当前PC值指向的地址里的指令。在ReadMem函数中,通过Translate函数对传入的虚地址做转换。在Translate函数中,如果虚地址没有找到对应的实地址转换,就会抛出异常(返回异常值)。返回的异常值在ReadMem中判断,并传入RaiseException函数中RaiseException函数会调用ExceptionHandler函数对不同的异常做相应的处理。(以上是异常处理机制。在这里就顺便说了。)2. 调用onetick让时间前进3. 重复1,2Part2: 阅读code/machine目录下的mac

6、hine.h(cc),translate.h(cc)文件和code/userprog目录下的exception.h(cc),理解当前Nachos系统所采用的TLB机制和地址转换机制。 TLB机制和地址转换机制:相关内容简单解释TranslationEntry类(translate.h),包括:virtualPage, physicalPage,以及一些标志位:valid,readonly等。标识了用户空间的第i个虚拟页应该映射到主存的第j个物理页,并且这个物理页目前所处的状态。(valid? readOnly?等)TLB初始化(machine.cc 构造函数):生成指定数量的Translati

7、onEntry构成的数组,并且设置均为Invalid.TLB本身就类似于Pagetable的子集,有若干的的映射对。TLB的使用(translate.cc translate函数):1. 遍历TLB数组,查找是否有对应映射2. 如果有,TLB命中,直接进行物理地址转换;否则,TLB MISS,进入Exception处理。(目前还没有对应的处理函数)无地址转换机制:在translate.cc translate函数中进行。1. 通过virtualaddr,计算出vpn和offset;2. 通过TLB或是直接通过Pagetable,获得vpn对应的ppn;(否则抛出异常,在异常处理函数中做处理,但

8、目前这部分没有实现)3. 通过ppn和offset得到物理地址,将物理地址返回。无TLB miss或是pagefault处理(exception.cc):在上一个表格中已经对异常处理是如何进入的做了介绍。但这里要补充一点:在处理完TLB miss或是Pagefault之后,不需要将PC+4,因为异常处理函数结束后,返回的最终位置会是OneInstruction函数的取指阶段。取指失败后,OneInstruction函数会退出,然后再用同样的PC取一次指令。而这次就能够TLB hit或者pagetable hit了。无Exercise 2: TLB MISS 异常处理任务:修改code/user

9、prog目录下exception.cc中的ExceptionHandler函数,使得Nachos系统可以对TLB异常进行处理(TLB异常时,Nachos系统会抛出PageFaultException,详见code/machine/machine.cc)。完成情况: 关于异常处理的机理已经在Exercise1 中说明了。因此能够对TLB异常进行处理,我们只要在判断传入的参数为TLBMISS的异常,并对其进行处理即可。 事实上,我在实际操作的时候,TLB MISS和PAGEFAULT,抛出的异常都是PageFaultException,此后再判断machine-tlb是否为空。如果为空,则执行Pa

10、gefaultFunc;否则,执行TLBmissFunc。 TLBmissFunc:步骤简单解释1. 从machine的BadVAddrReg寄存器中取出发生异常的虚拟地址,并算出vpn;在RaiseException函数中,将发生异常的虚拟地址放入该寄存器的。2. 扫描pagetable,寻找该vpn对应的项。目前情况,是一定可以找到的。由于目前用户程序运行的机理是:将所有segment全部写入主存中,并且全部做好了虚实映射,放在自己的PageTable中。当mechine需要加载这个用户程序时,会获得这个pagetable。于是相当于是,mechine通过这个pagetable,可以得到用

11、户空间所有虚地址对应的实地址。因此当TLB MISS时,查找pagetable,是一定不会Miss的。3. 接下来是寻找放入TLB的位置:1) 先考虑TLB中invalid的项,如果存在,写入该项;2) 如果不存在invalid项,那么就涉及TLB置换算法,这在Exercise3 中介绍。总之最后一定可以找到一个放置新的entry项的位置。无Exercise 3: 置换算法任务:为TLB机制实现至少两种置换算法,通过比较不同算法的置换次数可比较算法的优劣。完成情况:FIFO替换算法LRU替换算法1. 如果替换的是Invalid项,那么不涉及算法。2. 否则,将数组第一个项丢弃,其他项向前移动一

12、位。新添加的项放在数组最后3. 为每个entry设立一个lru数值。当TLB HIT时,HIT项的lru左移加一,其余项的lru左移;当TLB MISS时,进入异常处理函数4. 异常处理函数中,如果替换的是Invalid项,则将所有valid项(包括当前替换项)的lru值清零5. 否则,扫描TLB数组,找到Lru值最小的一项进行替换,并将所有项的lru值清零测试的用户程序将数组大小改成5的矩阵相乘:matmult。将会分配18个物理页,TLB访问次数为15000左右。(visit time不同,是因为每次miss异常处理之后,还会再次访问该地址,因此Miss次数不同,造成visit time次

13、数也会不同。)测试结果FIFO:LRU:结论:LRU算法略优于FIFO。Exercise 4: 内存全局管理数据结构任务:设计并实现一个全局性的数据结构(如空闲链表、位图等)来进行内存的分配和回收,并记录当前内存的使用状态。完成情况:增改情况简单解释创建Machine类中,新增一个bitmap的数据结构memoryMNG,大小设置为物理页大小memoryMNG的每一个bit对应一个物理页的分配状况内存分配Addrspace.cc构造函数中,在构建用户空间的pagetable时,通过bitmap的成员函数find返回第一个为0的位,将其作为空闲物理页分配。Find函数返回第一个为0的位,并将该位

14、置1。这非常符合我们的要求。如果不存在为0的位,返回-1。因此我会用Assert来保证能够正确分配物理页。内存回收Exception.cc handler函数中,对于exit系统调用的处理函数中,通过bitmap的成员函数clear,将pagetable中的所有物理页释放,并设置该项为invalid关于在哪回收内存,这是个比较麻烦的问题。因为用户程序运行完毕之后,是不会离开machine-run的for循环的,并且在调用machine-run之后的语句也不会被执行。因此,只能在exit系统调用中回收比较可行。补充:关于exit系统调用的异常处理函数其实有点麻烦,因为用户程序可以显式调用Exit

15、,而用户程序结束之后,也会自动执行一个exit。所以,有可能会有2个exit被执行。考虑到这个情况,需要做如下处理:1)如果bitmap已经被回收过了,就break出来。2)exit处理函数之后,PC要+4。测试结果截图:释放页用户程序结束开始执行用户程序分配页Exercise 5: 多线程支持任务:目前Nachos系统的内存中同时只能存在一个线程,我们希望打破这种限制,使得Nachos系统支持多个线程同时存在于内存中。完成情况:考虑:目前用户程序对mainMemory的操作是:在初始化用户空间的时候,会将mainMemory清零,并写入自己的内容。因此,每次运行用户程序,只能有一个在主存中。(主存里仅容许一个用户程序存放)如下截图:此外,目前mainMe

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 设计及方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号