《虚拟内存机制实习报告范本.docx》由会员分享,可在线阅读,更多相关《虚拟内存机制实习报告范本.docx(31页珍藏版)》请在优知文库上搜索。
1、虚拟内存机制实习报告目录一:总体概述3二:任务完成情况3任务完成列表(Y/N)3具体EXerCiSe的完成情况3三:遇到的困难以及解决方法29四:收获及感想29五:对课程的意见和建议30六:参考文献30一总体概述通过认真仔细阅读Nachos系统虚拟内存部分的源代码,理解虚拟内存的管理和应用机制,用户程序的运行逻辑,并修改源代码,达到“实现虚拟存储系统”的目标。二:任务完成情况任务完成列表(Y/N)Exercise1Exercise2Exercise3Exercise4Exercise5Exercise6Eyesyesyesyesyesyes具体Exercise的完成情况Exercise1:源代
2、码阅读Partl:阅读code/userprog/progtest.cc,着重理解nachos执行用户程序的过程,以及该过程中与内存管理相关的要点O阅读情况:用户程序执行过程:步骤相关解释在main函数中,如果检测到传入的参数和“执行用户程序”相关,那么执行StartProcess函数(progtest,cc)在StartProcess函数中装载并运行一个用户程序StartProcess函数中:1.用OpenFiIe类打开文件OpenFiIe类在文件系统中定义,包括各种对文件的基本操作,如read,writeo实质上是包装了操作系统的底层函数。2.用AddrSpace类创建一个用户空间,并将打
3、开的文件装载进去创建用户空间包括:1 .获取文件头,并将大小端做适宜转换;2 .通过文件头计算出文件所需空间,包括代码段,初始化数据段,未初始化数据段,栈空间4个部分3 .通过文件所需空间计算出文件所需的虚拟页数量4 .创建用户空间的PagDtabIa,指示了第i个虚拟页(将)对应第i个物理页5 .由于目前是最基本的【直接映射+单用户程序无切换】模式,因此此时要将所有的虚拟页中的内容写到物理页(主存)当中。3.(AddrSpace:InitRegistersO)初始化用户空间中的各种寄存器,包括PC设为0,栈指针移到空间底部为执行用户程序做准备!4.(AddrSpace:RestoreStat
4、e()将用户的部分状态(如pagetabIe)装载到machine类中,准备执行事实上,仅仅是将用户空间的PagetabIe(在第二步创建的)装载到machine的指针中,相当于是用户程序在machine上运行时,是通过machine的pagetabIe映射找到对应内容运行的5.调用machine-Run,运行用户程序Machine-run是在mipssim.cc中定义的。其工作原理为:1.通过OneInstruction(instr)模拟mips,将一条指令进行分割,并软件模拟执行。其中,在Onelnstruction函数中,通过machine-ReadMem,读取主存中当前PC值指向的地址
5、里的指令。在ReadMem函数中,通过TransIate函数对传入的虚地址做转换。在TransIate函数中,如果虚地址没有找到对应的实地址转换,就会抛出异常(返回异常值)。返回的异常值在ReadMem中判断,并传入RaiSeException函数中RaiSeException函数会调用ExceptionHandIer函数对不同的异常做相应的处理。(以上是异常处理机制。在这里就顺便说了。)2.调用OnetiCk让时间前进3.重复1,2Part2:阅读code/machine目录下的machine,h(cc),transIate.h(cc)文件和code/userprog目录下的exceptio
6、n.h(cc),理解当前Nachos系统所采用的TLB机制和她址转换机制。TLB机制和地址转换机制:相关内容简单解释TransIationEntry类(transIate.h),包括:VirtuaIPage,physicalPage,以及一些标志位:vaIid,readonIy等。标识了用户空间的第i个虚拟页应该映射到主存的第j个物理页,并且这个物理页目前所处的状态。(valid?readnly?等)TLB初始化(machine.cc构造函数):生成指定数量的TransIationEntry构成的数组,并且设置均为InvaIid.TLB本身就类似于PagetabIe的子集,有若干的的映射对。T
7、LB的使用(transIate.cctransIate函数):1.遍历TLB数组,查找是否有无对应映射2.如果有,TLB命中,直接进行物理地址转换;否则,TLBMISS,进入Exception处理。(目前还没有对应的处理函数)地址转换机制:在transIate.cctransIate函数中进行。1 .通过VirtUaladdr,计算出vpn和offset;2 .通过TLB或是直接通过PagetabIe,获得vpn对应的ppn;(否则抛出异常,在异常处理函数中做处理,但目前这部分没有实现)3 .通过ppn和offset得到物理地址,将物理地址返回。无TLBmiss或是pagefau11处理(ex
8、ception.cc):在上一个表格中已经对异常处理是如何进入的做了介绍。无但这里要补充一点:在处理完TLBmiss或是Pagefault之后,不需要将PC+4,因为异常处理函数结束后,返回的最终位置会是OneInstruction函数的取指阶段。取指失败后,OneInstruction函数会退出,然后再用同样的PC取一次指令。而这次就能够TLBhit或者Pagetablehit了。Exercise2:TLBMISS异常处理任务:修改code/userprog目录下exception.cc中的ExceptionHandIer函数,使得Nachos系统可以对TLB异常进行处理(TLB异常时,Na
9、chos系统会抛出PageFauItException,详见code/machine/machine.cc)o完成情况:关于异常处理的机理已经在EXerCiSel中说明了。因此能够对TLB异常进行处理,我们只要在判断传入的参数为TLBMlSS的异常,并对其进行处理即可。事实上,我在实际操作的时候,TLBMISS和PAGEFAULT,抛出的异常都是PageFauItException,此后再判断machine-tIb是否为空。如果为空,则执行PagefauItFunc;否则,执行TLBmiSsFuncoTLBmissFunc:步骤简单解释1.从machine的BadVAddrReg寄存器中取出发
10、生异常的虚拟地址,并算出vpn;在RaiSeException函数中,将发生异常的虚拟地址放入该寄存器的。2.扫描pagetabIe,寻找该vpn对应的项。目前情况,是一定可以找到的。由于目前用户程序运行的机理是:将所有segment全部写入主存中,并且全部做好了虚实映射,放在自己的PageTabIe中。当mechine需要加载这个用户程序时,会获得这个pagetableo于是相当于是,mechine通过这个pagetabIe,可以得到用户空间所有虚地址对应的实地址。因此当TLBMISS时,查找pagetabIe,是不会Miss的。3.接下来是寻找放入TLB的位置:1) 先考虑TLB中inva
11、Iid的项,如果存在,写入该项;2) 如果不存在invalid项,那么就涉及TLB置换算法,这在Exercise3中介绍。总之最后一定可以找到一个放置新的entry项的位置。无Exercise3:置换算法任务:为TLB机制实现至少两种置换算法,通过比较不同算法的置换次数可比较算法的优劣。完成情况:FIFO替换算法LRU替换算法1 .如果替换的是Invalid项,那么不涉及算法。2 .否则,将数组第一个项丢3.为每个entry设立一个IrU数值。当TLBHIT时,HIT项的IrIl左移加一,其余项弃,其他项向前移动一位。的IrU左移;当TLBMISS新添加的项放在数组最后时,进入异常处理函数4
12、.异常处理函数中,如果替换的是Invalid项,则将所有valid项(包括当前替换项)的Iru值清零5 .否则,扫描TLB数组,找到Lru值最小的一项进行替换,并将所有项的IrU值清零测试的用户程序将数组大小改成5的矩阵相乘:matmuIto将会分配18个物理页,TLB访问次数为15000左右。(visittime不同,是因为每次miss异常处理之后,还会再次访问该地址,因此MiSS次数不同,造成ViSittime次数也会不同。)测试结果FIFO:TLBvisittimeis15534,hittimets14475,httrateis.9318271.RU:TLBvisittimeis1532
13、7,htttimeis14429,hitrateis0.941411结论:LRU算法略优于FIFO。Exercise4:内存全局管理数据结构任务:设计并实现一个全局性的数据结构(如空闲链表、位图等)来进行内存的分配和回收,并记录当前内存的使用状态。完成情况:增改情况简单解释创建Machine类中,新增一个bitmap的数据结构memoryMNG,大小设置为物理页大小memoryMNG的母个bit对应一个物理页的分配状况内存分配Addrspace.cc构造函数中,在构建用户空间的pagetabIe时,通过bitmap的成员函数find返回第一个为0的位,将其作为空闲物理页分配。Find函数返回第
14、一个为0的位,并将该位置1。这非常符合我们的要求。如果不存在为0的位,返回7。因此我会用Assert来保证能够正确分配物理页。内存回收Exception.cchandIer函数中,关于在哪回收内存,这是个比较麻烦的问题。因为用户程序运行完毕之后,是不会离开对于exit系统调用的处理函数中,通过bitmap的成员函数CIear,将pagetabIe中的所有物理页释放,并设置该项为invaIidmachine-run的for循环的,并且在调用machine-run之后的语句也不会被执行。因此,只能在exit系统调用中回收比较可行。补充:关于exit系统调用的异常处理函数其实有点麻烦,因为用户程序可
15、以显式调用Exit,而用户程序结束之后,也会自动执行一个exit。所以,有可能会有2个exit被执行。考虑到这个情况,需要做如下处理:1)如果bitmap已经被回收过了,就break出来。2)exit处理函数之后,PC要+4。测试结果截图:phys page0 for mainisallocated.phys page1 for maintsallocated.phys page2 for mainISallocated.phys page3 for mainisallocated.phys page4 for maintsallocated.phys page5 for mainisallocated.phys page6 for maintsallocated.phys