当前位置:首页 > 实验 > 正文内容

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

Luz3周前 (01-05)实验75

一.实验目的

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

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

 

二.实验内容

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

假定内存为64KB,每个内存块1024B,作业最大支持到64KB,系统中每个作业分的内存块4块。

 

三.实验代码


#include <stdio.h>

#include <string.h>

#define n 64

#define length 10

struct

{

int lnumber;

int flag;

int pnumber;

int write;

int dnumber;

}page[n];

int m;

int page_length;

int p[length];

int head;

 

int page_interrupt(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;

page[lnumber].flag=1;

page[lnumber].write=0;

printf("淘汰主存%2d 中的页数%2d,从磁盘第%d 块中调入页%2d\n",page[j].pnumber,j,page[lnumber].dnumber,lnumber);

}

void command(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)

page[lnumber].write=1;

}

else

{

page_interrupt(lnumber);

goto kk;

}

}

int 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)

{

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);

}

}

image.png


发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。