欢迎来到天天文库
浏览记录
ID:9288270
大小:1.23 MB
页数:14页
时间:2018-04-26
《北大操作系统nachos实习报告——第三部分内存系统实习》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、操作系统实习三(虚拟内存管理)马亮100121076714目录内容一:总体概述3内容二:任务完成情况3任务完成列表(Y/N)3具体Exercise的完成情况3内容三:遇到的困难以及解决方法13内容四:收获及感想13内容五:对课程的意见和建议13内容六:参考文献1414内容一:总体概述通过本次实习,搞清了Nachos中虚拟内存部分的实现原理,通过实现TLB和页表的页面置换算法,修改系统为多线程驻留内存并实现lazyloading,进一步理解了操作系统实现虚拟内存的原理。并且本次实习过程中遇到大量错误,在解决错误的过程中进一步学习巩固了C++。内容二:任务完
2、成情况任务完成列表(Y/N)Exercise1Exercise2Exercise3Exercise4Exercise5Exercise6第一周YYY第二周YYY第三周Y第四周YNN具体Exercise的完成情况第一周Exercise1源代码阅读machine.h和machine.cc阅读这两个程序实现了执行用户程序的虚拟机,machine.h中将内存页大小定义为和磁盘扇区大小相同的128B,总共有32个页,通过一个char数组来模拟内存,内存总大小为32*128字节,通过一个40个长度的int数组来模拟40个寄存器。声明了TranslationEntry
3、类型的tlb和pageTable作为快表和页表。Machine.cc中在构造函数中对寄存器和内存做了清零,RaiseException用来发出异常,包括系统调用、pagefault等异常,调用exception.cc的ExceptionHandler方法来处理,还有一些读写寄存器、打印寄存器状态等方法。translate.h和translate.cc阅读translate.h中定义了快表项和页表项的结构TranslationEntry类translate.cc中ReadMem(intaddr,intsize,int*value)方法调用translate
4、方法,将用户虚拟地址addr转换为物理地址,读出size个字节,存放在value所指向的空间中。WriteMem(intaddr,intsize,int*value)方法调用translate方法,将用户虚拟地址addr转换为物理地址,然后将value表示的数值根据size大小转换成相应的机器类型存放在14此物理地址中。Translate(intvirtAddr,int*physAddr,intsize,boolwriting)方法将用户的逻辑地址转换成实际的物理地址,同时需要检查对齐。首先,判断用户逻辑地址是否对齐,没有对齐则返回AddressErro
5、rException。接着计算出虚拟地址所在的页号vpn及其在页面中的偏移量,根据采用不同的转换方法作不同的处理。如果采用的是线性转换表,当vpn>=pageTableSize时,即虚拟页数过大,返回AddressErrorException。当页表中显示该页为无效时,返回PageFaultException,一切正常则得到相应的页表表项。如果采用的是TLB转换表,查找TLB表,如果查找到,得到相应的页表项;如果没有查找到,返回PageFaultException。如果得到的页表项是只读,设置writing标志,返回ReadOnlyException,如
6、果表项中相应的物理地址大于实际的内存物理地址,返回BusErrorException,都正常则返回NoException。Exercise2修改exception.cc使得Nachos系统可以对TLB异常进行处理首先在machine.h中ExceptionType中增加一种异常TlbFaultException:然后在exception.cc中加入这种异常的处理方法:具体的TlbSwap页面置换算法见下一个exercise的说明Exercise3为TLB机制实现一种合适的页面替换算法基本思想是利用系统中的totalTicks作为时间戳,每次使用到tlb中
7、的一页时更新此页的时间戳为当前的totalTicks,需要淘汰一页的时候选取时间戳最早的那页,即LRU算法。由于nachos中原有的页表实现方法为线性页表,如果define了USE_TLB,则在machine类构造函数中初始化了tlb,故首先启用tlb。在translate.cc的ReadMem和WriteMem方法中,调用了translate方法来将虚拟地址转换为物理地址,而translate方法中如果定义了TLB,则会在TLB中寻找此页,如果找不到则发出PageFaultException异常。首先在TranslationEntry类中加入最后使用时
8、间的属性,用以记录访问此页时的totalTicks:14为了区分tlb缺页和页表
此文档下载收益归作者所有