教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 学前教育 >

山大操作系统课程设计报告(全套)(13)

来源:网络收集 时间:2026-05-20
导读: int j,n1 = divRoundUp(noffH.code.size,PageSize) - 1; printf(\ for(j=0;j ReadAt(buffer,PageSize,noffH.code.inFileAddr+j*PageSize); printf(\ execFile->WriteAt(buffer,PageSize,noffH.code.virtualAddr+j*P

int j,n1 = divRoundUp(noffH.code.size,PageSize) - 1; printf(\ for(j=0;jReadAt(buffer,PageSize,noffH.code.inFileAddr+j*PageSize); printf(\ execFile->WriteAt(buffer,PageSize,noffH.code.virtualAddr+j*PageSize); } amount=executable->ReadAt(buffer,noffH.code.size-n1*PageSize,noffH.code.inFileAddr+j*Page printf(\ execFile->WriteAt(buffer,noffH.code.size-n1*PageSize,noffH.code.virtualAddr+j*PageSize);/ if(noffH.initData.size == 0){ delete execFile; delete [] buffer; } printf(\ } }

/*为initData分配页表,内存空间,载入到内存,swap中的*/ if (noffH.initData.size > 0) { DEBUG('a', \ printf(\ unsigned int numP,firstP,c; numP = divRoundUp(noffH.initData.size,PageSize); firstP = divRoundUp(noffH.initData.virtualAddr,PageSize); if(numP<=DataPages) c=firstP+numP; else c=firstP+DataPages; for (i=firstP;iFind(); executable->ReadAt(&(machine->mainMemory[pageTable[i].physicalPage*PageSize]),PageSize,noffH.iniize); pageTable[i].valid = TRUE;// } count+=DataPages; if(numPages>MinimumPages){//Load initialdata of the executable into the virtual memory int n1 = divRoundUp(noffH.initData.size,PageSize) - 1 + firstP;

printf(\ for(i=firstP;i

executable->ReadAt(buffer,PageSize,noffH.initData.inFileAddr+(i-firstP)*PageSize); execFile->WriteAt(buffer,PageSize,noffH.initData.virtualAddr+(i-firstP)*PageSize); } executable->ReadAt(buffer,noffH.initData.size-(n1-firstP)*PageSize,noffH.initData.inFileA execFile->WriteAt(buffer,noffH.initData.size-(n1-firstP)*PageSize,noffH.initData.virtualA printf(\ printf(\ delete execFile; delete [] buffer; } }

/*打印页表的内容*/ Print(); }

此外,添加了一个Print()方法,显示页表的内容:

4, 增加处理页错误的方法,选择页面置换算法为lru算法,仿照在线程优先级调度中的等待队列,在system.cc中声明一个List类型的变量,保留进程使用的虚拟页的页号,最近使用的放在尾部,因而当一个进程需要的 内存空间超过可以分配的最大页的时候,需要进行局部的页面置换,从该链表的头部取得最近最少使用的 虚拟页号,通过查该进程的页表找到该虚拟页对应的物理页,将这个物理页交给需要加载入内存的虚拟页, 然后从swap中找到需要换入的页,读入到内存相应的地址,修改页表相应的项,如果被换出的页面有被修改,即dirty位为true,则还要将被换出的页写回到swap相应的位置。

处理物理地址,逻辑地址翻译工作的方法为machine 中的Translate方法,因而,在此方法中,加入相应的 调整进程以用逻辑页的List中的顺序的代码,即把vpn号从链表中拿出来放到最后,为了完成这个工作,

还需要在List类中新加入方法: void

List::append(unsigned int &key)//将值为key的元素追加到链表尾部 bool

List::remove(unsigned int &key//删掉值为key 的元素 int

List::getlru()//删掉链表头部,并把头部元素的值返回

void List::print()//打印这个链表

bool List::find(unsigned int &key) //检查是否能找到值为key的元素 ExceptionType

Machine::Translate(int virtAddr, int* physAddr, int size, bool writing) { 。。。。

extern List *lru; if(lru->find(vpn)) lru->remove(vpn); lru->append(vpn); 。。。。。。 }

页面置换的具体实现,在exception.cc中实现。

在exception中加入SC_Exit,PageFaultException 异常的处理,

加入SC_Exit异常的处理,因为在Sort.c中,有Exit(A[20])的Nachos系统调用,也就是把A[20]地址传给了4号寄存器,因而可以通过打印出其内容判断一下sort程序是否正确的执行。

通过打印出 代码如下:

else if((which == SyscallException) && (type == SC_Exit)){

int exitaddr = machine->ReadRegister(4);//读出Exit()调用的参数地址 int *status;

//machine->ReadMem(exitaddr,4,status); status=&exitaddr; if(*status==0) {

printf(\!%d\\n\ }

else

printf(\!%d\\n\ currentThread->Finish(); }

PageFaultException 异常的处理,在发生页错误的时候调用的方法

主要是处理页面置换的方法,如果该进程的space属性中的count属性表示

它没有超过可以使用的最多的物理帧数的话,就可以继续分配一个新的物理帧,这时候没有页面的置换,

将那个页从swap加载进内存的操作;如果count 的值显示它已经占用了最大的内存帧数,则需要进行页面置换。从保存的list中找到最近最少使用的页面,如果它有被修改,还需要写回到swap相应的地址,把新的页加载 到内存被替换的物理帧中,修改页表中相应的项。

if(which == PageFaultException){ extern BitMap *Mmbmp;

execFile=fileSystem->Open((currentThread->space)->virtualName); unsigned int pageFaultAddress,page,vp,amount; pageFaultAddress=machine->registers[BadVAddrReg];

/*page 中保留了需要加载进内存的虚拟页号*/

page=pageFaultAddress/PageSize;//计算发生页错误的虚拟页号,

printf(\ //lru->print();

/*如果使用的内存frame数小于可以使用的最大的frame数,则直接使用位试图找到一个新的物理帧,加载*/ /*修改页表项*/

/* execFile 是进程的swap文件,把swap文件中的相应内容加载到内存*/

if(1<= Mmbmp->NumClear()&&(currentThread->space)->count

(currentThread->space)->pageTable[page].physicalPage = Mmbmp->Find();

(currentThread->space)->count++;

(currentThread->space)->pageTable[page].valid = TRUE; (currentThread->space)->pageTable[page].use = TRUE; (currentThread->space)->pageTable[page].dirty = FALSE;

printf(\

execFile->ReadAt(&(machine->mainMemory[(currentThread->space)->pageTable[page].physicalPage (currentThread->space)->pageTable[page].virtualPage*PageSize);

printf(\

printf(\

}

else{

/*超过可以使用的最大的物理frame数,需要使用页面置换算法*/

printf(\ vp=lru->getlru(); lru->remove(vp);

/*被换出的页如果被修改,要写回swap文件*/ /*修改页表项*/

if((currentThread->space)->pageTable[vp].dirty==TRUE){ printf(\

execFile->WriteAt(&(machine->mainMemory[(currentThread->sp …… 此处隐藏:2442字,全部文档内容请下载后查看。喜欢就下载吧 ……

山大操作系统课程设计报告(全套)(13).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/598633.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)