Lab3 最近才开始做,过今天又要交了,本来还想凑合凑合混一下。结果昨天得知一个噩耗,看来还是要认真做啊。
首先介绍一下nachos 的存储管理机制。
当我们运行./nachos -x ../test/halt时,运行了一个用户程序。
基本过程是:
OpenFile *executable = fileSystem->Open(filename);
首先打开该执行文件。
AddrSpace *space;
space = new AddrSpace(executable);
创建一个用户空间,该用户空间包含一个页表,记录了虚拟页号和物理页号的映射情况。
在创建用户空间时所做的事情有从文件中获取代码段和数据段。
初始化该页表,由于一开始内存中只能存放一个进程,所以虚拟地址跟物理地址是一样的。
然后根据虚拟地址到物理地址的映射情况,将文件的代码段和数据段拷贝到内存。
space->InitRegisters();
初始化CPU的寄存器,让它指向需要执行的第一条指令。寄存器指向的地址为虚拟地址,
所以在执行之前,我们需要先将其转化为物理地址。
space->RestoreState();
将进程的页表拷贝到CPU中维护。
machine->Run();
该方法,循环的从寄存器中获得一条指令并运行。
1 修改exception.cc,添加缺页异常的处理。
else if(which == PageFaultException)
{
//获得虚拟地址
int addr = machine->ReadRegister(BadVAddrReg);
//tlb页面置换算法,这里用LRU置换法