Nachos 实验11 设计并实现用户空间的虚拟内存管理-上
- 格式:doc
- 大小:49.50 KB
- 文档页数:17
实验目的
在未实现用户空间的虚拟内存管理之前,Nachos系统在运行一个用户进程的时候,需要将程序在运行时可能会用到的所有信息都拷贝到mainMemory中去。这样,因为mainMemory 的大小的限制,一些较大的文件可能无法执行;而相对应的,一些程序中可能包含着大量在执行过程中极少或根本不会被访问的数据,这些数据却又长期占据了内存的资源。本次试验的目的:
整体理解Nachos系统的组织结构。
设计并实现用户空间的虚拟内存管理。
实验环境
Linux操作系统,Nachos操作系统
实验分析
此次实验是在实验7-8——Extension of AddrSpace and System Calls Exec()的基础上更改的。实验的目录并没有在系统已有的vm目录下进行,而是将实验目录lab7-8更名为lab11,目的是使用lab7-8目录下的Makefile文件。在本次实验的过程中,发现并更改了实验7-8的一些疏漏之处。
为了说明方便,首先澄清一下基本概念和数据结构:
用bitmap做物理地址分配
图1 存取关系图
页表
class TranslationEntry {
public:
int virtualPage; // The page number in virtual memory.
// 对应于图1中的虚页
int physicalPage; // The page number in real memory (relative to the
// start of "mainMemory"
// 对应于图1中的物理页
bool valid; // If this bit is set, the translation is ignored.
// (In other words, the entry hasn't been initialized.)
bool readOnly; // If this bit is set, the user program is not allowed
// to modify the contents of the page.
bool use; // This bit is set by the hardware every time the
// page is referenced or modified.
bool dirty; // This bit is set by the hardware every time the
// page is modified.
int inFileAddr; //The address of this segment of data in the file.
//对于vmcode、vminitData,inFileAddr代表在源文件中的addr
//对应于图1中的linux系统下的文件*.noff.
//对于vmuninitData、vmuserStack,inFileAddr代表在SWAP文件中的位置
PageType type; //The type of this entry.
//标明页中数据的类型
};
为了实现虚拟内存的页置换,在以上类中增加一个该页在文件中块偏移量inFileAddr和当前页存储的数据的类型的type。
其中type的类型PageType定义为枚举类型,写在文件translate.h中。
enum PageType
{vmcode,vminitData,vmuninitData,vmuserStack};
分别代表此页数据为代码,初始化数据,未初始化数据,用户栈。
交换区SWAP
曾在实验7-8中,在文件中声明了BitMap *Mmbmp(如图1),记录mainMemory中物理页的分配情况。它的位置表明了,此Mmbmp的作用域是整个Nachos系统,它不隶属于任何一个用户进程。当然,我们可以实现一个更好的方式:将Mmbmp放到Machine中,但是这要修改Machine的定义,
如果查看Machine类定义就可以知道,Machine牵扯到Nachos的核心的系统控制,为了尽量保证Nachos 系统的稳定性,则将BitMap *Mmbmp作为全局变量放在了中。
同样的道理,将交换区文件SWAP的生命周期与Mmbmp相似,同时SWAP也需要一个BitMap
*SwapBitmap记录SWAP各个页的使用情况,所以,在中添加声明:
BitMap *Mmbmp=new BitMap(NumPhysPages); //bitmap for allocating of physical pages infjkdjk mainMemory.
BitMap *SwapBitmap = new BitMap(NumPhysPages);//bitmap for SWAP file,
//assume the size of SWAP file is NumPhyPages.
OpenFile *SwapFile = fileSystem->Open("SWAP"); //stub in Nachos_Linux
//在lab11的目录下建立文件SWAP
NoffHeader
修改原有的结构体NoffHeader为类类型,目的是为了能够将NoffHeader作为AddrSpace类的私有实例变量存取,结构体无法实例化为类的私有变量,所以将结构体NoffHeader重写,变为类NoffHeader,并一起更改结构体NoffSegment为类类型。两者的功能在保证原结构体功能的基础上,为了调试和输出方便,添加输出函数Print()。具体定义如下:
#define NOFFMAGIC 0xbadfad
class NoffSegment
{
public:
int virtualAddr;
int inFileAddr;
int size;
void Print();
NoffSegment();
~NoffSegment();