高级操作系统——nachos内存管理(分页式内存管理)

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();//初

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值