页式虚拟存储管理中地址转换和缺页中断 实验报告
一.实验目的
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);
}
}