Nachos 实验11 设计并实现用户空间的虚拟内存管理-上

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

实验目的在未实现用户空间的虚拟内存管理之前,Nachos系统在运行一个用户进程的时候,需要将程序在运行时可能会用到的所有信息都拷贝到mainMemory中去。这样,因为mainMemory的大小的限制,一些较大的文件可能无法执行;而相对应的,一些程序中可能包含着大量在执行过程中极少或根本不会被访问的数据,这些数据却又长期占据了内存的资源。本次试验的目的:整体理解Nachos系统的组织结构。设计并实现用户空间的虚拟内存管理。实验环境Linux操作系统,Nachos操作系统实验分析此次实验是在实验7-8——ExtensionofAddrSpaceandSystemCallsExec()的基础上更改的。实验的目录并没有在系统已有的vm目录下进行,而是将实验目录lab7-8更名为lab11,目的是使用lab7-8目录下的Makefile文件。在本次实验的过程中,发现并更改了实验7-8的一些疏漏之处。为了说明方便,首先澄清一下基本概念和数据结构:用bitmap做物理地址分配图1存取关系图页表classTranslationEntry{public:intvirtualPage;//Thepagenumberinvirtualmemory.//对应于图1中的虚页intphysicalPage;//Thepagenumberinrealmemory(relativetothe//startofmainMemory//对应于图1中的物理页boolvalid;//Ifthisbitisset,thetranslationisignored.//(Inotherwords,theentryhasn'tbeeninitialized.)boolreadOnly;//Ifthisbitisset,theuserprogramisnotallowed//tomodifythecontentsofthepage.booluse;//Thisbitissetbythehardwareeverytimethe//pageisreferencedormodified.booldirty;//Thisbitissetbythehardwareeverytimethe//pageismodified.intinFileAddr;//Theaddressofthissegmentofdatainthefile.//对于vmcode、vminitData,inFileAddr代表在源文件中的addr//对应于图1中的linux系统下的文件*.noff.//对于vmuninitData、vmuserStack,inFileAddr代表在SWAP文件中的位置PageTypetype;//Thetypeofthisentry.//标明页中数据的类型};为了实现虚拟内存的页置换,在以上类中增加一个该页在文件中块偏移量inFileAddr和当前页存储的数据的类型的type。其中type的类型PageType定义为枚举类型,写在文件translate.h中。enumPageType{vmcode,vminitData,vmuninitData,vmuserStack};分别代表此页数据为代码,初始化数据,未初始化数据,用户栈。交换区SWAP曾在实验7-8中,在progtest.cc文件中声明了BitMap*Mmbmp(如图1),记录mainMemory中物理页的分配情况。它的位置表明了,此Mmbmp的作用域是整个Nachos系统,它不隶属于任何一个用户进程。当然,我们可以实现一个更好的方式:将Mmbmp放到Machine中,但是这要修改Machine的定义,如果查看Machine类定义就可以知道,Machine牵扯到Nachos的核心的系统控制,为了尽量保证Nachos系统的稳定性,则将BitMap*Mmbmp作为全局变量放在了progtest.cc中。同样的道理,将交换区文件SWAP的生命周期与Mmbmp相似,同时SWAP也需要一个BitMap*SwapBitmap记录SWAP各个页的使用情况,所以,在protest.cc中添加声明:BitMap*Mmbmp=newBitMap(NumPhysPages);//bitmapforallocatingofphysicalpagesinfjkdjkmainMemory.BitMap*SwapBitmap=newBitMap(NumPhysPages);//bitmapforSWAPfile,//assumethesizeofSWAPfileisNumPhyPages.OpenFile*SwapFile=fileSystem-Open(SWAP);//stubinNachos_Linux//在lab11的目录下建立文件SWAPNoffHeader修改原有的结构体NoffHeader为类类型,目的是为了能够将NoffHeader作为AddrSpace类的私有实例变量存取,结构体无法实例化为类的私有变量,所以将结构体NoffHeader重写,变为类NoffHeader,并一起更改结构体NoffSegment为类类型。两者的功能在保证原结构体功能的基础上,为了调试和输出方便,添加输出函数Print()。具体定义如下:#defineNOFFMAGIC0xbadfadclassNoffSegment{public:intvirtualAddr;intinFileAddr;intsize;voidPrint();NoffSegment();~NoffSegment();};classNoffHeader{public:intnoffMagic;NoffSegmentcode;NoffSegmentinitData;NoffSegmentuninitData;voidPrint();NoffHeader();~NoffHeader();};AddrSpace扩展原有的AddrSpace的属性:添加属性——当下正在执行的用户文件的指针OpenFile*executable,因为我们无法一次读取所有需要的数据,更多情况下,我们边用边读,所以设置一个变量executable来保存指向用户文件的指针。添加属性——当下正在执行的用户文件的NoffHeader,因为NoffHeader在初始化时,将会加载到mainMemory的0号地址中,一旦程序运行之后,原0号地址中的内容必定会被用户程序重写,但因为我采用的是bitmap做物理地址与虚地址的变换,其中的变换细节要求需要在进行物理和虚拟页变换时知道code的virtualAddr,initData的virtualAddr等的数据,(详细细节见AddrSpace::Translate介绍)所以为了访问方便,设置其为用户进程的一个属性。添加virtualMem数组和p_vm指针,用来实现FIFO算法。virtualMem存储的是按进入内存的先后顺序排列的当前占用内存空间的虚页,p_vm指针指向数组中当前将要被换出的那个位置。(详细说明见AddrSpace::FIFO介绍)private:TranslationEntry*pageTable;//Assumelinearpagetabletranslationfornow!unsignedintnumPages;//NumberofpagesinthevirtualaddressspaceOpenFile*executable;//ApointertotheexecutingfileNoffHeadernoffH;//TheheaderoftheOpenFileexecutableintvirtualMem[MemPages];//Storevirtualpagesofthepagesinthemainmemoryintp_vm;//Thepointertonextmemorytoswapout添加AddrSpace实现用户空间虚拟内存的函数:voidInitPageTable();//用于初始化AddrSpace的pageTable的基本信息voidInitInFileAddr();//初始化pageTable中各个entry的inFileAddr、typevoidFIFO(intnewPage);//调用translate和swap实现先进先出的虚拟内存置换算法voidTranslate(intaddr,unsignedint*vpn,unsignedint*offset);//将addr对应的虚拟页页号vpn和页内偏移量offset计算出来voidSwap(intoldPage,intnewPage);//调用WriteBack和ReadIn//实现将mainMemory中的oldPage替换成newPagevoidWriteBack(intoldPage);//将oldPage这一个页写回//code和initData将会被写回文件;//uninitData和userStack内容将会被写回交换区SWAPvoidReadIn(intnewPage);//将newPage写入到mainMemory//code和initData将通过inFileAddr从文件中读出;//uninitData和userStack或从交换区SWAP读出,或只是将mainMemory中分配到的地址段清零关键源代码及注释首先,简要说明一下现在Nachos系统的虚拟存储功能的能力。为了简便起见,规定系统默认给每个用户进程分配MemPages大小的主存,当用户的进程装入内存,进行数据初始化的时候,按照用户程序在pageTable中的存储顺序从前向后装入MemPages大小的页到内存中去。在用户进程在运行的过程之中,如果访问内存无法找到想要的virtualAddr,那么采用FIFO策略进行不同页之间的切换。那么接下来,按照一个用户进程在Nachos下执行的过程顺序对本次实验的程序进行解剖说明。用户进程(pageTable)的初始化用户程序从progtest.cc的StartProcess接口开始装载,通过传递OpenFile*executable到AddrSpacespace生成新的AddrSpace实例。此时space进行初始化:AddrSpace::AddrSpace(OpenFile*exe){unsignedintsize;executable=exe;[1]executable-ReadAt((char*)&noffH,sizeof(noffH),0);if((noffH.noffMagic!=NOFFMAGIC)&&(WordToHost(noffH.noffMagic)==NOFFMAGIC))SwapHeader(&noffH);ASSERT(noffH.noffMagic==NOFFMAGIC);numPages=divRoundUp(noffH.code.size,PageSize)+divRoundUp(noffH.initData.size,PageSize)+divRoundUp(noffH.uninitData.size,PageSize)+StackPages;size=(MemPages+StackPages)*PageSize;//加粗语句决定了在给定虚拟地址addr,换算虚页vpn和页内偏移量offset时不再是//vpn=(unsigned)virtAddr/PageSize;//offset=(unsigned)virtAddr%PageSize;//具体转换令写函数AddrSpace::Translate实现printf(numPagesis%d\n,numPages);printf(numPages=%d+%d+%d+%d\n,divRoundUp(noffH.code.size,PageSize),divRoundUp(noffH.initData.size,PageSize),divRoundUp(noffH.uninit

1 / 13
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功