页式虚拟存储管理中地址转换和缺页中断实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

页式虚拟存储管理中地址转换和缺页中断实验报告一.实验目的

1.深入了解页式存储管理如实现地址转换;

2.进一步认识页式虚拟存储管理中如处理缺页中断。

二.实验仪器

PC、windows操作系统、Visual C++6.0

三.实验原理

编写程序完成页式存储管理中地址转换过程和模拟缺页中断的处理。实验具体包括:首先对给定的地址进行地址转换工作,若发生缺页则先进行缺页中断处理,然后再进行地址转换;最后编写主函数对所做工作进行测试。

四.实验步骤

代码一

#include

#include

#define n 64 //模拟实验中假定的页表长度

#define length 10

struct

{

int lnumber;//页号

int flag;//表示页是否在主存,"1"表示在,"0"表示不在

int pnumber;//该页所在主存块的块号

int write; //该页是否被修改过,"1"表示修改过,"0"表示没有被修改过

int dnumber;//该页存放在磁盘上的位置,即磁盘块号

}page[n];//页表定义

int m; //作业在主存中的主存块块数

int page_length;//页表实际长度

int p[length];//存放在主存中页的页号

int head;//主存中页号队列头指针

page_interrupt(lnumber) //缺页中断

int lnumber;

{

int j;

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)

unsigned laddress;

int write;

{

unsigned paddress,ad,pnumber,lnumber;

kk:

lnumber=laddress >> 10;

ad=laddress &0x3ff;

if(lnumber >= page_length)//如果页号大于页表长度,则该页不存在

{

printf("不存在该页\n");

return;

}

if(page[lnumber].flag==1)//如果页表在主存

{

pnumber=page[lnumber].pnumber;//从页表中取得块号

paddress=pnumber<<10|ad;//合并块号和块地址形成物理地址

paddress;

printf("逻辑地址是: %x 对应物理地址是:%x\n",laddress,paddress);

if(write==1)//如果需要写,修改页的修改标志位

}

else

{

page_interrupt(lnumber);//执行缺页中断

goto kk;

}

}//命令处理函数结束

void main()

{

int lnumber,flag,pnumber,write,dnumber;

unsigned laddress;

int i;

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;

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-不需要,其他一结束程序运行)和逻辑地址:");

相关文档
最新文档