软件:visual studio
设计缺页中断处理程序。当对读入的逻辑地址,划分为页号、页内 地址后,通过页表发现访问的页不在内存,转入“缺页中断处理” 程序去处理。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<windows.h>
#define PN 7
#define PAGESIZE 1024
typedef struct PAGETAB
{
int no;
int status;
int chunkno;
}PAGETAB;
int a[7] = { 7 };//用数组存储页面进入顺序,由于页号小于等于7,故数组长度为7,页号小于7,故初始化置7代表无页号数据
void show(PAGETAB s[])
{
printf("页号\t状态\t物理块号\n");
for (int i = 0;i < PN;i++)
if(s[i].status == 1)
printf("%d\t%d\t%d\n", s[i].no, s[i].status, s[i].chunkno);
}
void change(PAGETAB s[])
{
int flag = 1, j;
char st = 'N';
int delete;
while (flag == 1)
{
int A;
int place;
printf("逻辑地址:");
scanf("%d", &A);
int p = A / PAGESIZE;
int inplace = A % PAGESIZE;
for (j = 0;j < PN;j++)
{
if (a[j] == 7)
{
a[j] = p;
break;
}
}
if (p >= PN) printf("ERROR:非法逻辑地址!\n");
else
{
printf("页号:%d\n", p);
printf("页内位移:%d\n", inplace);
if (s[p].status == 0)
{
delete = a[1];
for (j = 0;j < PN;j++)
if (a[j] == delete) break;
s[j].status = 0;
s[p].chunkno = s[j].chunkno;
s[p].status = 1;
for (j = 0;j < PN;j++) a[j] = a[j + 1];
printf("是否缺页:Y\n");
printf("淘汰的页面:%d\n", delete);
}
else
{
printf("是否缺页:N\n");
printf("淘汰的页面:\n");
}
place = s[p].chunkno * PAGESIZE + inplace;
printf("该逻辑地址存储的物理块:%d\n", s[p].chunkno);
printf("物理地址:%d\n", place);
}
printf("Do you want to continue ? (1 yes 0 no) : ");
scanf("%d", &flag);
}
}
void main()
{
PAGETAB s[PN];
int sel, i;
for (i = 0;i < PN;i++)
{
s[i].no = i;
s[i].status = 0;
}
s[0].status = s[1].status = s[2].status = 1;
s[0].chunkno = 9;
s[1].chunkno = 5;
s[2].chunkno = 4;//输入装入内存的页面号及存入的物理块号(假定只分配3个物理块);
a[0] = 0;
a[1] = 1;
a[2] = 2;
while (1)
{
printf("************System Menu************\n");
printf(" 1 change/*地址转换*/ \n");
printf(" 2 show/*显示页表*/ \n");
printf(" 3 exit \n");
printf("***********************************\n");
printf("Please input your choice:");
scanf("%d", &sel);
switch (sel)
{
case 1:change(s);break;
case 2:show(s);break;
case 0:exit(0);
}
}
}