对系统
machine.h:
1:定义页表大小,页表最大内存
2:异常种类
3:寄存器种类
machine.cc
1:将寄存器,页表和快表,全置为空 Machine
2:处理异常 RaiseException
3:调试 Debugger
4:输出所有寄存器的值DumpState
5:写入或者读出寄存器的值ReadRegister, WriteRegister
exception.cc:
1:处理异常ExceptionHandler
对用户:
progtest.cc:
1:开启用户程序 StartProcess (调用addrespace),初始化寄存器,页表,快表
2:控制台交互 ConsoleTest
addrespace:
1:分配用户的代码段,初始化数据段,未初始化数据段,栈段等地址,真正初始化寄存器,页表,快表,将代码和数据写入内存
2:初始化machine寄存器 InitRegisters 利用machine.cc 的WriteRegister
3:页表地址装载至machine RestoreState
translate.h:
1:定义页表项 TranslationEntry(标志位)
translate.cc:
1:将虚拟地址转换为物理地址 Translate
2:虚拟地址上写value WriteMem
3:虚拟地址上读value ReadMem
Exercise 2 TLB MISS异常处理
修改code/userprog目录下exception.cc中的ExceptionHandler函数,使得Nachos系统可以对TLB异常进行处理(TLB异常时,Nachos系统会抛出PageFaultException,详见code/machine/machine.cc)。
1:首先查找页表是在translate.cc的 Translate()中,部分代码如下
if (entry == NULL) {
DEBUG('a', "*** no valid TLB entry found for this virtual page!\n");
return PageFaultException;
}
这里已经抛出了一个异常,无需修改
2:明确谁接收了Translate返回的return PageFaultException;。观察代码,可以看到是
translate.cc的ReadMem()和:WriteMem(),即通过虚拟地址寻找时,没有找到对应的TLB的entry,部分代码如下
exception = Translate(addr, &physicalAdd