模拟基本分页式存储管理的地址转换

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
else
{
for(i=0;i<10;++i)
{
if(m==p[i].pno)
{
addr=p[i].cno*64+n;//访问物理地址,物理地址=内存块号*块大小+页内偏移量
printf("物理地址为:%d\n",addr);
printf("详细信息:\t页面号:%d\t块号:%d\t偏移量:%d\n\n",p[i].pno,p[i].cno,n);
/*
设块长为64
该进程只有10页,且已经全部进入主存
*/
#include<stdio.h>
#include<stdlib.h>
#define N 10
int base=0;//页表在主存中的起始地址设为0
int l=1;//页表项的长度设为1
struct Page{
int pno;//页号
int cno;//块号
change_Addr(p,log_Addr);
break;
case 2:
printf("谢谢使用,不足之处请多多指教!\n");
exit(0);
default:
printf("选择错误,请重输\n");
}
}while(1);
return 0;
}
}
}
}
return;
}
void menu()
{
printf(" -------------------------------- \n");
printf("| 1.地址转换பைடு நூலகம்\n");
printf("| 2.结束转换|\n");
printf(" -------------------------------- \n");
}p[N];
void Init_Page(Page p[])
{
int i;
int t[10]={0,2,4,5,11,16,18,30,31,39};
for(i=0;i<10;++i)
{
p[i].pno=i;
p[i].cno=t[i]+i;
}
return;
}
void change_Addr(Page p[],int log_Addr)
}
int main()
{
menu();
int log_Addr,select;
Init_Page(p);
do{
printf("输入你的选择(1还是2):");
scanf("%d",&select);
switch(select)
{
case 1:
printf("输入指令的逻辑地址:");
scanf("%d",&log_Addr);
{
int m=log_Addr/64;//当前逻辑地址所对应的页号
int n=log_Addr%64;//偏移量
int addr;//当前逻辑地址所对应的物理地址
m=base+m*l;//访问页表,
int flag=0,i;
if(m>=N)
{
printf("所访问地址超过进程的地址空间,申请中断\n\n");//越界中断
相关文档
最新文档