您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 页式虚拟存储管理中地址转换和缺页中断实验报告
页式虚拟存储管理中地址转换和缺页中断实验报告一.实验目的1.深入了解页式存储管理如何实现地址转换;2.进一步认识页式虚拟存储管理中如何处理缺页中断。二.实验仪器PC、windows操作系统、VisualC++6.0三.实验原理编写程序完成页式存储管理中地址转换过程和模拟缺页中断的处理。实验具体包括:首先对给定的地址进行地址转换工作,若发生缺页则先进行缺页中断处理,然后再进行地址转换;最后编写主函数对所做工作进行测试。四.实验步骤代码一#includestdio.h#includestring.h#definen64//模拟实验中假定的页表长度#definelength10struct{intlnumber;//页号intflag;//表示页是否在主存,1表示在,0表示不在intpnumber;//该页所在主存块的块号intwrite;//该页是否被修改过,1表示修改过,0表示没有被修改过intdnumber;//该页存放在磁盘上的位置,即磁盘块号}page[n];//页表定义intm;//作业在主存中的主存块块数intpage_length;//页表实际长度intp[length];//存放在主存中页的页号inthead;//主存中页号队列头指针page_interrupt(lnumber)//缺页中断intlnumber;{intj;printf(发生缺页中断*%d\n,lnumber);j=p[head];//淘汰页的页号p[head]=lnumber;//新装入的页号head=(head+1)%m;if(page[j].write==1)//如果该页被修改过printf(将页%d写回磁盘第%d块\n,j,page[j].dnumber);//输出页号page[j].flag=0;//该页不在主存,执行缺页中断,将标志改为不在主存page[lnumber].pnumber=page[j].pnumber;//使j转去执行缺页中断page[lnumber].flag=1;//将所需页重新调入内存page[lnumber].write=0;//将标志改为未被修改过printf(淘汰主存%2d中的页数%2d,从磁盘第%d块中调入页%2d\n,page[j].pnumber,j,page[lnumber].dnumber,lnumber);}command(laddress,write)unsignedladdress;intwrite;{unsignedpaddress,ad,pnumber,lnumber;kk:lnumber=laddress10;ad=laddress&0x3ff;if(lnumber=page_length)//如果页号大于页表长度,则该页不存在{printf(不存在该页\n);return;}if(page[lnumber].flag==1)//如果页表在主存内{pnumber=page[lnumber].pnumber;//从页表中取得块号paddress=pnumber10|ad;//合并块号和块内地址形成物理地址paddress;printf(逻辑地址是:%x对应物理地址是:%x\n,laddress,paddress);if(write==1)//如果需要写,修改页的修改标志位page[lnumber].write=1;}else{page_interrupt(lnumber);//执行缺页中断gotokk;}}//命令处理函数结束voidmain(){intlnumber,flag,pnumber,write,dnumber;unsignedladdress;inti;printf(输入页表的信息,创建页表(若页号为-1,则结束输入)\n);printf(输入页号和辅存地址:);scanf(%d%d,&lnumber,&dnumber);//读入页号和辅存地址i=0;while(lnumber!=-1)//当页号不存在时,修改页表的信息,将各种标志位置0{page[i].lnumber=lnumber;page[i].flag=0;page[i].write=0;page[i].dnumber=dnumber;i++;printf(输入页号和辅存地址:);scanf(%d%d,&lnumber,&dnumber);//重新读入新的页号和辅存地址}page_length=i;//页表的长度为页面的数量printf(输入主存块号,主存块数要小于%d,(以-1结束):,i);scanf(%d,&pnumber);m=0;//作业在主存中的主存块块数head=0;//主存中页号队列头指针while(pnumber!=-1){if(m=i)//块号小于页号{page[m].pnumber=pnumber;//将块号写入页表,并装入内存page[m].flag=1;p[m]=m;m++;}scanf(%d,&pnumber);}printf(输入指令性质(1-修改,0-不需要,其他一结束程序运行)和逻辑地址:);scanf(%d%x,&write,&laddress);while(write==0||write==1){command(laddress,write);//执行相应的指令printf(输入指令性质(1-修改,0-不需要,其他一结束程序运行)和逻辑地址:);scanf(%d%x,&write,&laddress);}}//main()结束代码二#includeiostream#includeiomanip#includelistusingnamespacestd;charuseSign[12][5]={{'+'},{'-'},{'*'},{存},{取},{'-'},{移位},{'+'},{存},{取},{'+'},{存}};intPageAddress[12]={70,50,15,21,56,40,53,23,37,78,01,84};intPageNum[12]={0,1,2,3,0,6,4,5,1,2,4,6};intS_Station;intpPageNum[7];//页号pPageintpSign[7];intpStool[7];//页架号intpModify[7];//修改标志intpStation[7];//磁盘位置staticintz=0;voidStore(){for(inti=0;i7;i++){if(i4){pSign[i]=1;}elsepSign[i]=0;pPageNum[i]=i;pModify[i]=0;}intp1=1,p2=2,p3=3;for(i=0;i7;i++){if(i3){pStation[i]=p1;p1++;}elseif(i6){pStation[i]=p2;p2++;}elsepStation[i]=p3;}pStool[0]=5;pStool[1]=8;pStool[2]=9;pStool[3]=1;}voidCShow(){cout操作;cout页号;cout页内地址;cout标志;cout绝对地址;cout修改页号;cout页架号;coutendl;}voidFind(){intm_Pagenum;intm_Station;intY_Station;//绝对地址intm_Stool;cout输入页号及页内地址查询操作:;cinm_Pagenumm_Station;CShow();inti,j=0;//stringm_Modify;for(i=0;i12;i++){if(PageAddress[i]==m_Station){break;}}Y_Station=pStool[m_Pagenum]*1024+m_Station;if(pSign[m_Pagenum]==1){if(strcpy(useSign[i],存)!=0){pModify[m_Pagenum]=1;}}coutuseSign[i]\t;coutm_Pagenum\t;coutm_Station\t;coutpSign[m_Pagenum]\t;if(Y_Station!=m_Station){coutY_Station\t;coutpStool[m_Pagenum]\t;coutY_Stationendl;}else{cout*m_Pagenum;for(j=z;j7;j++){if(pSign[j]==1){z++;break;}}coutm_Pagenum-j\t;pStool[m_Pagenum]=pStool[j];pSign[j]=0;pStool[j]=0;coutpStool[m_Pagenum]\t;coutpStool[m_Pagenum]*1024+m_Stationendl;}}intmain(void){Store();charjudge='Y';while(judge=='Y'){Find();cout是否继续输入(请输入大写字母)?Y=是N=否endl;judge='N';cinjudge;}return0;}五.实验现象、结果记录及整理代码一代码二
本文标题:页式虚拟存储管理中地址转换和缺页中断实验报告
链接地址:https://www.777doc.com/doc-1402037 .html