Exercise 4 内存全局管理数据结构
设计并实现一个全局性的数据结构(如空闲链表、位图等)来进行内存的分配和回收,并记录当前内存的使用状态
首先注意Nachos的设计特点:
1:物理内存32页,每一页128B,一共有4KB。这32页物理内存从物理地址0开始分布,所以我们分配物理内存可以直接分配i*128B。就如**addrspace.cc中pageTable[i].physicalPage =i;**实际上意思为将物理地址的第i页分配到虚拟地址的第i页上
2:原始的Nachos只能允许一个用户线程,因为没有内存管理机制(pageTable[i].physicalPage =i)。并且在progtest也只有一个currentThread分配了地址space
所以我们需要设计一个内存管理机制Bitmap位图。
首先在progtest.cc里
#include "bitmap.h"
BitMap *map= new BitMap(4096);
在addrspace.cc里同样添加
#include "machine.h"
#include "bitmap.h"
extern BitMap *map;
之后我们就可以在addrspace里申请物理地址的时候使用BitMap,注意到BitMap自带find方法。所以
for (i = 0; i < numPages; i++) {
pageTable[i].virtualPage = i; // for now, virtual page # = phys page #
//pageTable[i].physicalPage = i;
pageTable[i].physicalPage = map->Find();
pageTable[i].valid = TRUE;
pageTable[i].use = FALSE;
pageTable[i].dirty = FALSE;
pageTable[i].readOnly = FALSE; // if the code segment was entirely on
// a separate page, we could set its
// pages to be read-only
}
Exercise 5 多线程支持
目前Nachos系统的内存中同时只能存在一个线程,我们希望打破这种限制,使得Nachos系统支持多个线程同时存在于内存中。
基础知识:在Nachos里 有一些对象必须了解
1:OpenFile *executable = fileSystem->Open(filename); 程序文件,需要经过初始化编程进程后运行
2:space 可以理解为物理地址空间,利用 AddrSpace *space= space = new AddrSpace(executable) 带有页表,寄存器。在初始化的时候,他完成以下工作:
(1)初始化页表
(2)将数据和代码加载到内存
3:thread 线程,
第一次运行之前需要做以下三件事
(1)初始化页表和将数据和代码加载到内存 space完成,thread只需要
space = new AddrSpace(executable);
(2)将寄存器的值填入machine的寄存器 space->InitRegisters(); 【包含PC,IR等】
(3)装载页表到machine的页表 space->RestoreState()
当由运行转为就绪时候,需要:
(1)space.saveState()在space里的空方法,不知道解决什么问题还是重写什么
(2)SaveUserState 即将machine寄存器的值保存到space的寄存器里
当由就绪转为运行时候,需要:
*AddrSpace space = currentThread->getAddrSpace();
space->RunInitRegisters();
space->RestoreState();
currentThread->InitUserRegisters();
4:machine 理解可以运行thread的平台,需要寄存器=和页表
space->RestoreState();//加载页表
space->InitRegisters();//初