页式地址重定位
要求:
一、实验目的:
1、 用高级语言编写和调试模拟实现页式地址重定位。
2、 加深理解页式地址重定位技术在多道程序设计中的作用和意义。
二、实验原理:
当进程在CPU上运行时,如指令中涉及逻辑地址时,操作系统自动根据页长得到页号和页内偏移,把页内偏移拷贝到物理地址寄存器,再根据页号,查页表,得到该页在内存中的块号,把块号左移页长的位数,写到物理地址寄存器。
三、实验内容:
1、 设计页表结构
2、 设计地址重定位算法
3、 有良好的人机对话界面
#include<bits/stdc++.h>
using namespace std;
#define pagesize 4096
#define pagetablelength 64
/*系统页表*/
const int pagetable[pagetablelength]={0,42,25,15,45,31,44,43,
41,28,1,30,12,24,6,32,
14,27,13,46,7,33,10,22,
40,2,51,11,39,23,49,50,
26,16,29,4,47,17,3,48,
52,36,58,35,57,34,21,63,
5,37,18,8,62,56,20,54,
60,19,38,9,61,55,59,53};
int main()
{
int logicaladdress=0;
int pagenum=0;
int w=0;
cout<<"系统页号对应块号情况(页号——>块号):\n";
for(int i=0;i<64;i++)
{
cout<<setw(2)<<i<<"-->"<<setw(2)<<pagetable[i]<<" ";
if(i%8==7)
cout<<endl;
}
cout<<endl<<"请输入逻辑地址(十进制):\n";
cin>>logicaladdress;
/*公式:
物理地址=页号对应的页块*页面大小+页内偏移
页内偏移=逻辑地址-页面大小*页面数*/
pagenum=logicaladdress/pagesize; //页面数
w=logicaladdress-pagenum*pagesize; //页面偏移
if((logicaladdress/pagesize)>pagetablelength)
{
cout<<"本次访问的地址已超出进程的地址空间,系统将产生越界中断!\n";
return 0;
}
cout<<"对应的物理地址为(十进制):\n"<<pagetable[pagenum]*pagesize+w<<endl;
system("pause");
return 0;
}
对应截图如下:
公式:
物理地址=页号对应的页块页面大小+页内偏移
页内偏移=逻辑地址-页面大小页面数