当前位置:文档之家› 北大操作系统高级课程-陈向群作业-虚拟内存管理实习报告

北大操作系统高级课程-陈向群作业-虚拟内存管理实习报告

虚拟内存管理实习报告目录内容一:总体概述 (3)内容二:任务完成情况 (3)任务完成列表(Y/N) (3)具体Exercise的完成情况 (3)内容三:遇到的困难以及解决方法 (11)内容四:收获及感想 (11)内容五:对课程的意见和建议 (11)内容六:参考文献 (11)内容一:总体概述本次lab主要是针对操作系统内存管理的学习,内存管理主要有固定分区、可变分区、页式和段式管理。

现代操作系统主要采用页式内存管理,它把用户程序地址空间划分成大小相等的部分,称为页。

内存空间按页的大小划分为大小相等的区域,称为内存块(物理页面,页框,页帧)。

以页为单位进行分配,逻辑上相邻的页,物理上不一定相邻。

虚拟内存的基本思想:每个程序拥有自己的地址空间,这个空间被分割成多个块,每一块称作一页或者页面,每一页有连续的地址范围。

这些页被映射到物理内存,但并不是所有页都必须在内存中才能运行。

当程序引用到一部分在物理内存中的地址空间时,由硬件立即执行必要的映射。

当程序引导到一部分不在物理内存中德的地址空间时,由操作系统负责将缺失的部分装入屋里内存并重新执行失效的指令。

内容二:任务完成情况任务完成列表(Y/N)Exercise1 Exercise2 Exercise3 Exercise4 Exercise5 Exercise6 Exercise7 Challange 完成情况Y Y Y Y Y Y N N具体Exercise的完成情况一、TLB异常处理目前,Nachos系统对于内存的管理是基于软件模拟的TLB机制。

其工作原理、异常处理、替换算法等方面,与分页式内存管理非常相像。

Exercise 1 源代码阅读Ø阅读code/userprog/,着重理解nachos执行用户程序的过程,以及该过程中与内存管理相关的要点。

Ø阅读code/machine目录下的machine.h(cc),translate.h(cc)文件和code/userprog目录下的exception.h(cc),理解当前Nachos系统所采用的TLB机制和地址转换机制。

解答:中有2个主要的方法,分别是StartProcess和ConsoleTest,它们的作用是给用户进程分配内存空间并且执行用户进程和测试控制台输入。

StartProcess方法中首先通过OpenFile *executable = fileSystem->Open(filename);打开文件,然后通过space = new AddrSpace(executable);currentThread->space = space;为文件分配内存空间并且把内存空间给当前进程。

然后通过space->InitRegisters();初始化寄存器的值,继而通过space->RestoreState();加载页表寄存器,然后就可以开始运行用户程序了。

对于machine.h中定义了页的大小为128,页的数量为32,内存大小为128*32,快表的大小为4。

Exception.h 和 是专门用来检测和处理异常信息的类,原始的nachos 只给出了syscall 异常的处理方式。

实验要做的就是在这里添加对缺页异常的处理工作。

下面的translate 函数将会根据情况返回PageFaulteException,这样便会进入到异常处理函数当中。

Machine.h 和 这个类定义和实现了对机器本身的抽象,run 方法运行一条指令,两套读写函数分别是读写内存和读写寄存器。

RaiseException 函数是抛出一个异常信息。

另外,nachos 的Mainmemory是一个char 类型的数组。

还有一些页大小,主存大小,快表大小也再这里进行了声明。

构造函数对寄存器和内存内容进行初始化。

读写寄存器状态等方法也是在这里。

Translate.h 和 是tlb 和页表声明的类型定义。

这个类中,最为重要的方法是translate 方法,这个方法将用户的虚拟地址addr 转化为物理地址。

Exercise 2 TLB MISS异常处理修改code/userprog目录下中的ExceptionHandler函数,使得Nachos系统可以对TLB异常进行处理(TLB异常时,Nachos系统会抛出PageFaultException,详见code/machine/)。

解答:在中Translate方法中判断了是否使用了TLB表,如果使用了TLB表则循环查找TLB页表,如果没有找到一个TLB表项,使得表项信息有效,表项所存储的虚页号与所传入的VPN号一致,则会返回PageFaultException异常,表明此时TLB发生错误,所要查找的虚拟地址并没有在TLB的页表内。

在中的ExceptionHandler方法中增加如下代码段,判断是否PageFaultException异常,获得BadVaddrReg寄存器内所存储的当出错陷入(Exception)时用户程序的逻辑地址。

Exercise 3 置换算法为TLB机制实现至少两种置换算法,通过比较不同算法的置换次数可比较算法的优劣。

解答:这里实现LRU算法和FIFO算法。

修改TranslationEntry对象添加属性用来记录页面的上次使用时间(LRU算法寻找最早未使用页面时使用)和创建时间(FIFO方法寻找最早创建页面时使用)。

在TranslationEntry初始化时添加对新增属性的初始化动作。

修改Machine构造函数修改Addrspace构造函数在TLB命中时更新TranslationEntry属性lastUseTime。

修改中的Translate方法。

修改ExceptionHandler对PageFaultException的处理逻辑,当在出现PageFaultException 异常时,系统获得出错程序的虚拟地址,并尝试调用页面置换算法(算法实现分别为Machine 中的LRUSwap和FIFOSwap两个方法)。

中添加两个方法:修改 的ReadRem和WriteRem函数,当进行了转换后所得到的exception不是NoException时,首先用machine调用RaiseException函数,执行完此函数后,判断之前所获得异常是否是PageFaultException,如果是PageFaultException则此时通过RaiseException 函数所调用的ExceptionHandler函数已经进行了TLB的调度,但是并没有写入到内存中,所以,还需要再次进行一下Translate,这时如果exception如果不是NoException时,则直接退出ReadMem或WriteMem函数。

二、分页式内存管理目前Nachos系统中,类Class Thread的成员变量AddrSpace* space中使用TranslationEntry* pageTable来管理内存。

应用程序的启动过程中,对其进行初始化;而在线程的切换过程中,亦会对该变量进行保存和恢复的操作(使得类Class Machine中定义的Class Machine::TranslationEntry* pageTable始终指向当前正在运行的线程的页表)。

Exercise 4内存全局管理数据结构设计并实现一个全局性的数据结构(如空闲链表、位图等)来进行内存的分配和回收,并记录当前内存的使用状态。

解答:在全局系统文件中声明一个全局位图文件变量,对内存的物理地址进行分配。

在system.h中加入中添加之后在Nachos的main文件中对memoryBitMap对象进行初始化,初始化位图文件的大小为4096Bytes。

在Addrespace类中对TLB页表项的物理地址分配中,不再将页表项的物理地址分配为循环数i,而是通过memoryBitMap对位图文件中的标志信息的查找来对物理地址进行分配。

Exercise 5多线程支持目前Nachos系统的内存中同时只能存在一个线程,我们希望打破这种限制,使得Nachos 系统支持多个线程同时存在于内存中。

解答:在Thread类中增加InitUserRegister方法修改Exercise 6缺页中断处理基于TLB机制的异常处理和页面替换算法的实践,实现缺页中断处理(注意!TLB机制的异常处理是将内存中已有的页面调入TLB,而此处的缺页中断处理则是从磁盘中调入新的页面到内存)、页面替换算法等。

解答:修改中的AddrSpace构造方法三、Lazy-loadingExercise 7 我们已经知道,Nachos系统为用户程序分配内存必须在用户程序载入内存时一次性完成,故此,系统能够运行的用户程序的大小被严格限制在4KB以下。

请实现Lazy-loading 的内存分配算法,使得当且仅当程序运行过程中缺页中断发生时,才会将所需的页面从磁盘调入内存。

解答:四、Challenges(至少选做1个)Challenge 1为线程增加挂起SUSPENDED状态,并在已完成的文件系统和内存管理功能的基础之上,实现线程在“SUSPENDED”,“READY”和“BLOCKED”状态之间的切换。

Challenge2多级页表的缺陷在于页表的大小与虚拟地址空间的大小成正比,为了节省物理内存在页表存储上的消耗,请在Nachos系统中实现倒排页表。

内容三:遇到的困难以及解决方法困难首先,还是对C++熟悉程度,尽管通过几次的lab对于代码结构已经有了基本的认识,但是在调试代码的时候还是会出现很多的问题。

其次,是时间的问题,这次了lab内容比较多,另外本周还有一份xv6的阅读报告,同时白天还要上班,所以感觉这部分内容的时间非常的紧张。

但是在工作之余尽量抽出时间把本次lab完成了。

内容四:收获及感想通过对nachos虚拟内存算法的实现,使我更加深入的了解了操作系统内存的内存实现机制。

学以致用,使得我们学习的过程更加简单,记忆印象更加深刻。

我也学会了不少os 方面的细节问题,原来学习操作系统只是宏观的概念层面的理解,说是理解,也不是非常明白,比如每个线程究竟是如何执行的,如何调度的,但是通过对nachos源码的阅读,和对其中部分代码进行这些exercise里面要求的改写之后,发现原来模糊的概念开始变的具体明朗,其内部是如何真实运行的,机理是如何在其中发挥作用的,都清楚了不少。

我在这个实习的过程中,不断翻阅老师课上的课件,了解其中的原理,再结合网上大牛们的技术博客,慢慢研读,自觉收货不少,以后在课堂的学习中我当更加认真的听讲,及时的完成每一节课的任务作业,认真总结,这样才能到最后事半功倍,不会捉襟见肘。

内容五:对课程的意见和建议我觉得课堂上讲解的偏重一些理论,在实践或者说是编码这方面还可以适当的增加一些,比如在一些关键代码或者功能的实现上,可以找一些功力较好的同学上台上演示编码,这样的同学可以在平时分上给一些加分,或者由老师带领同学对其中比较困难或者关键性的代码演示编写,觉得这种对实践上的一点倾斜,可能对课后的lab 完成有相当的促进作用。

相关主题