没有合适的资源?快使用搜索试试~ 我知道了~
nachos Lab4实习报告.pdf
需积分: 10 41 下载量 23 浏览量
2017-01-18
15:57:48
上传
评论 2
收藏 1.28MB PDF 举报
温馨提示
试读
25页
北京大学2015-2016第二学期操作系统实习Lab3虚拟内存详细实习报告
资源推荐
资源详情
资源评论
虚拟内存实习报告
姓名:秦汉民 学号:1300012879
日期:2016 年 4 月 20 日
2
目录
内容一:总体概述.....................................................................................................................3
内容二:任务完成情况.............................................................................................................3
任务完成列表(Y/N)......................................................................................................3
具体 Exercise 的完成情况.................................................................................................3
内容三:遇到的困难以及解决方法...................................................................................... 23
内容四:收获及感想...............................................................................................................24
内容五:对课程的意见和建议.............................................................................................. 24
内容六:参考文献...................................................................................................................24
3
内容一:总体概述
实习的主要内容是了解和改进
nachos
存储管理相关实现,主要分为三个部
分。第一部分的主要内容是实现
TLB
相关异常处理和置换算法,第二部分的主
要内容是实现全局内存管理机制,使得
nachos
内存可以同时存在复数线程,第
三部分的主要内容是实现程序运行时载入所需页面。扩展部分主要是增加线程挂
起状态以及实现倒排页表。
内容二:任务完成情况
任务完成列表(Y/N)
Exercise1
Exercise2
Exercise3
Exercise4
Exercise5
Exercise6
Exercise7
Y
Y
Y
Y
Y
Y
Y
Challenge1
Challenge2
Y
Y
具体
Exercise
的完成情况
一、TLB 异常处理
目前,Nachos 系统对于内存的管理是基于软件模拟的 TLB 机制。其工作原
理、异常处理、替换算法等方面,与分页式内存管理非常相像。
Exercise1 源代码阅读
阅读 code/userprog/progtest.cc,着重理解 nachos 执行用户程序的过程,以
及该过程中与内存管理相关的要点。
阅读 code/machine 目录下的 machine.h(cc),translate.h(cc)文件和
code/userprog 目录下的 exception.h(cc),理解当前 Nachos 系统所采用的 TLB
机制和地址转换机制
(1)用户程序执行过程
userprog/progtest.cc 定义函数
StartProcess 主要功能是实现用户程序启动,如
果我们希望执行 test 中的用户程序,那么我们进
入 userprog,执行./nachos -x ../test/(用户
程序),通过识别-x 参数,nachos 调用
StartProcess 执行用户程序(具体实现在
threads/main.cc)
StartProcess 的基本流程是,通过文件系统
定义的 OpenFile 打开相关文件,通过 AddrSpace
4
的构造函数建立用户空间,装载文件,通过 AddrSpace 的 InitRegisters 函数
初始化用户寄存器,通过 AddrSpace 的 RestoreState 函数装载页表,通过
machine 的 Run 函数运行用户程序
AddrSpace 的构造函数实现在 userprog/addrspace.cc,主要流程是,获取
文件头,大小端做适宜转换,通过文件头计算文件所需空间,包括代码段,初始
化数据段,未初始化数据段,栈空间 4 个部分,通过文件所需空间计算出文件所
需的虚拟页面数量,创建用户空间页表,指示了第 i 个虚拟页对应第 i 个物理页,
将用户程序的正文段和相关数据依次调入内存
AddrSpace 的 InitRegisters 函数实现在 userprog/addrspace.cc,主要流
程是初始化普通寄存器(初始化为 0),初始化当前指令指针(PC,初始化为 0),
初始化下一条指令指针(初始化为 4),初始化栈指针(地址空间尾部适当前移)
AddrSpace 的 RestoreState 函数实现在 userprog/addrspace.cc,主要流程
是将页表装载到 machine 类中,准备执行用户程序
machine 的 Run 函数实现在 machine/mipssim.cc,基本流程是通过
OneInstruction 函数完成指令译码和执行,通过 interrupt 的 OneTick 函数使
得时钟前进
machine 的 Run 函数通过 machine 的 ReadMem 函数读内存数据,通过 machine
的 WriteMem 函数写内存数据,两个函数的实现在 machine/translate.cc,核心
是 translate 函数,translate 函数实现在 machine/translate.cc,主要功能是
实现虚拟地址到物理地址的转换,translate 函数可能返回相应的错误,在这样
的情况下,ReadMem 函数/WriteMem 函数调用 RaiseException 函数进行处理,
RaiseException 函数定义在 machine/machine.cc,基本流程是将错误信息存储
在特定位置,调用 ExceptionHandler 函数处理不同的错误,ExceptionHandler
函数实现在 userprog/exception.cc,主要流程是根据错误信息处理不同错误。
目前支持的错误
NoException, // 正常
SyscallException, // 系统调用
PageFaultException, // 缺页(页表/快表)
ReadOnlyException, // 访问只读页面
BusErrorException, // 总线错误
AddressErrorException, // 访问地址对齐错误/超出范围
OverflowException, // 算数溢出
IllegalInstrException, // 非法指令
NumExceptionTypes
寄存器支持
5
(2)TLB 机制和地址转换机制
表项维护的位置是 machine/translate.h 中 TranslationEntry 数据结构
class TranslationEntry {
public :
int virtualPage; // 虚拟页号
int physicalPage; // 物理页号
boot valid; // 该 Entry 是否使用,TRUE 表示使用
bool readOnly; // 对应页的访问属性,TRUE 示只读,否则为读写
bool use; // 该 Entry 是否被使用过,每次访问后置为 TRUE
bool dirty; // 对应的物理页使用情况,TRUE 表示被写过
}
相关参数
以下参数定义在 filesys/disk.h
#define SectorSize 128
以下参数定义在 machine/machine.h
#define PageSize SectorSize
#define NumPhysPages 32
#define MemorySize (NumPhysPages * PageSize)
#define TLBSize 4
TLB 初始化的位置是 machine/machine.cc 中 machine 的构造函数
TLB 的使用的位置是 machine/translate.cc 中的 translate 函数,基本流
程是遍历 TLB 数组,查找是否有对应映射,如果有,那么 TLB 命中,直接进行物
理地址转换,否则,TLB 没有命中,标志 PageFaultException,进入 Exception
处理。(目前还没有对应的处理函数)
地址转换机制的位置是 machine/translate.cc 中的 translate 函数,基本
流程是,通过虚拟地址得到 vpn 和 offset,通过 TLB 或是 Pagetable 得到
vpn 对应的 ppn,(否则抛出异常,在异常处理函数中做处理,但目前这部分没
有实现),通过 ppn 和 offset 得到物理地址,返回物理地址。
需要说明的是,在处理完 TLB miss 或者 Pagefault 之后,不需要将 PC+4,
因为异常处理函数结束后,返回的最终位置会是 OneInstruction 函数的取指阶
段。取指失败后,OneInstruction 函数会退出,然后再用相同的 PC 取指。而这
次就能够 TLB hit 或者 pagetable hit 了。
machine/machine.cc 的 Machine 类模拟内存,重要函数包括
剩余24页未读,继续阅读
资源评论
qinhanmin
- 粉丝: 57
- 资源: 13
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功