山大操作系统课程设计报告(全套)(13)
int j,n1 = divRoundUp(noffH.code.size,PageSize) - 1; printf(\ for(j=0;j
/*为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;i
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字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [学前教育]MC9S12XS256RMV1 xs128芯片手册4
- [学前教育]安东尼语录经典语录
- [学前教育]e级gps控制测量技术设计书
- [学前教育]苏教版2022-2022学年八年级下学期期末
- [学前教育]装修公司推广 营销
- [学前教育]家政服务合同(完整版)
- [学前教育]湖北省2016届高三联考语文试题
- [学前教育]爱立信无涯学习系统LTE题库1-LTE基础知
- [学前教育]揭秘大众柴油车作弊软件原理
- [学前教育]人才流失原因及对策分析
- [学前教育]房屋建筑施工工程劳务分包合同
- [学前教育]国际贸易实务试卷A卷09.6
- [学前教育]校园废品回收活动计划方案书范文格
- [学前教育]电大成本会计试题及答案
- [学前教育]大学物理实验 华南理工出版社 绪论答案
- [学前教育]爱丁堡产后抑郁量表
- [学前教育]液压冲击的危害、产生原因与防止方法(
- [学前教育]学生工作总结高一学生期中考试总结_020
- [学前教育]人民医院医疗废物管理规章制度大全
- [学前教育]阳光维生素的巨大抗癌潜能阅读题答案.d
- 马云在云锋基金江苏论坛闭幕式的发言
- 试论小学体育教育中的心理健康教育-教
- 语文A版一年级下册《语文乐园一》教学
- 2021四川大学物理化学考研真题经验参考
- [人教A版]2015-2016学年高中数学 第二
- 终端网点销售返利协议书
- 江苏省2015年眼科学主治医师青光眼考试
- 2017年部编人教版八年级语文上册教案
- 十一中学七年级英语上册Unit7Howmuchar
- 以赛促教的创新性实验教学机制建设实践
- 平凉市崆峒区2015七年级下生物期末试题
- 琶洲(地块五)A、B塔楼1、2#塔吊基础
- 一级医院工作制度与人员岗位职责
- 2018北京西城区高三二模理科数学试题及
- 炒股密码线技术 - 图文
- 职高学生生涯发展辅导教案
- 语文人教版四年级上册8 世界地图引出的
- 最新最新人教版二年级上册全册数学教案
- 2017高考英语全国2卷精彩试题(有问题
- 普通心理学笔记




