实验项目名称页式虚拟存储管理中地址转换和缺页中断实验目的及要求1、深入了解页式存储管理如何实现地址转换。2、进一步认识页式虚拟存储管理中如何处理缺页中断。实验内容编写程序完成页式虚拟存储管理中地址转换过程和模拟缺页中断的处理。实验具体包括:首先对给定的地址进行地址转换工作,若发生缺页则先进行缺页中断处理,然后再进行地址转换;最后编写主函数对所做工作进行测试。假定内存64KB,每个内存块1024字节;作业最大支持到64KB,系统中每个作业分得内存块4块。实验步骤缺页处理:1、根据当前执行指令中逻辑地址的页号查页表,判断该页是否在主存储器中,若该页标志为“0”,形成缺页中断。中断装置通过交换PSW让操作系统的中断处理程序占用处理机;2、操作系统处理缺页中断的方法就是查内存分配表,找一个空闲内存块;若无空闲块,查页表,选择一个已在内存的页面,把它暂时调出内存。若在执行过程中该页被修改过,则需将该页信息写回磁盘,否则不必写回;3、找出该页的磁盘位置,启动磁盘读出该页信息,把磁盘上读出的信息装入第2补找到的内存块,修改页表中该页的标志为“1”;4、由于产生缺页中断的那条指令没有执行完,所以页面装入后应重新执行被中断的指令。当重新执行该指令时,由于要访问的页面已在内存中,所以可以正常执行。实验环境WindowsXP、visualstudio2005实验结果与分析#includestdio.h#definen64#definelength10struct{intlnumber;intflag;intpnumber;intwrite;intdnumber;}page[n];intm;intpage_length;intp[length];inthead;page_interrupt(intlnumber){intj;printf(发¤¡é生¦¨²缺¨¡À页°3中D断?·¡è%d\n,lnumber);j=p[head];p[head]=lnumber;head=(head+1)%m;if(page[j].write==1)printf(将?页°3%d写¡ä回?磁ä?盘¨¬第̨²%d块¨¦\n,j,page[j].dnumber);page[j].flag=0;page[lnumber].pnumber=page[j].pnumber;page[lnumber].flag=1;page[lnumber].write=0;printf(淘¬?汰¬-内¨²存ä?块¨¦%2d中D的Ì?页°3%2d,从䨮磁ä?盘¨¬第̨²%d块¨¦中D调Ì¡Â入¨?页°3%2d\n,page[j].pnumber,j,page[lnumber].dnumber,lnumber);}command(unsignedladdress,intwrite){unsignedpaddress,ad,pnumber,lnumber;kk:lnumber=laddress10;ad=laddress&0x3ff;if(lnumber=page_length){printf(不?存ä?在¨²该?页°3\n);return;}if(page[lnumber].flag==1){pnumber=page[lnumber].pnumber;paddress=pnumber10|ad;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(输º?入¨?页°3表À¨ª的Ì?信?息¡é,ê?创ä¡ä建¡§页°3表À¨ª(若¨?页°3号?为a-1,ê?则¨°结¨¢束º?输º?入¨?)\n);printf(输º?入¨?页°3号?和¨ª辅¡§存ä?地Ì?址¡¤:);scanf(%d%d,&lnumber,&dnumber);i=0;while(lnumber!=-1){page[i].lnumber=lnumber;page[i].flag=0;page[i].write=0;page[i].dnumber=dnumber;i++;printf(输º?入¨?页°3号?和¨ª辅¡§存ä?地Ì?址¡¤:);scanf(%d%d,&lnumber,&dnumber);}page_length=i;printf(输º?入¨?内¨²存ä?块¨¦号?,ê?内¨²存ä?块¨¦数ºy要°a小?于®¨²%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-修T改?,0-不?需¨¨要°a,其?他?-结¨¢束º?程¨¬序¨°运?行D)和¨ª逻?辑-地Ì?址¡¤:);scanf(%d%x,&write,&laddress);while(write==0||write==1){command(laddress,write);printf(输º?入¨?指?令¢?性?质¨º(1-修T改?,0-不?需¨¨要°a,其?他?-结¨¢束º?程¨¬序¨°运?行D)和¨ª逻?辑-地Ì?址¡¤:);scanf(%d%x,&write,&laddress);}}运行结果:注:可根据实际情况加页