模拟实现页面地址重定位实习报告.docx
《模拟实现页面地址重定位实习报告.docx》由会员分享,可在线阅读,更多相关《模拟实现页面地址重定位实习报告.docx(12页珍藏版)》请在冰点文库上搜索。
模拟实现页面地址重定位实习报告
编号:
实验
一
二
三
四
五
六
七
八
九
十
总评
教师签名
成绩
武汉大学计算机学院
课程实验(设计)报告
专业(班):
计算机科学与技术计科6班
学号:
2013301500217
姓名:
张伟
课程名称:
操作系统设计
任课教师:
宋伟
2015年12月22日
模拟实现页面地址重定位实习报告
一、实习内容
1、编写和调试模拟实现页式地址重定位。
2、加深理解页式地址重定位技术在多道程序设计中的作用和意义。
二、实习题目
当进程在CPU上运行时,如指令中涉及逻辑地址时,操作系统自动根据页长得到页号和页内偏移,把页内偏移拷贝到物理地址寄存器,再根据页号,查页表,得到该页在内存中的块号,把块号左移页长的位数,写到物理地址寄存器。
三、实验内容:
1、设计页表结构;
2、设计地址重定位算法
3、有良好的人机对话界面
三、设计思想
数据结构
intPage_length;//页长
intPage_Num;//页数
intprocess;//进程大小
intLogical_Address;//逻辑地址
classPageTable//定义一个页表项
{
public:
intpage_num;//页的编号
intpic_num;//对应的物理内存块号
public:
PageTable(intthepage_num,intthepic_num)
{
page_num=thepage_num;
pic_num=thepic_num;
}
PageTable()
{
page_num=0;
pic_num=0;
}
};
classLogicalAdd//定义逻辑地址
{public:
intpage_num;//逻辑地址对应的页号
intpage_add;//对应的页地址
public:
LogicalAdd(inta,intb)
{
page_num=a;
page_add=b;
}
LogicalAdd()
{
page_num=0;
page_add=0;
}
};
PageTablePT[N];//定义一个页表
LogicalAddLogAdd;//logicaladdress
主要函数
(1)voidinput()//输入函数
(2)intinit()//初始化函数
(3)inttranslate()//转换函数,逻辑地址转换为物理地址
(4)voidoutput(intres)//输出结果的函数
Main函数
intmain()
{
intchoice;
cout<<"-------模拟页面地址重定位--------"<for(;;)
{
cout<<"1:
输入信息\n2:
查看页表\n3:
查看物理地址\n4:
退出"<cin>>choice;
switch(choice)
{
case1:
input();
if(init()==-1)return-1;
break;
case2:
output(0);
break;
case3:
output(translate());
break;
case4:
cout<<"已经退出\n";
exit(0);
break;
}
}
return1;
}
初始化部分
1.由键盘输入进程大小,页面大小,所要查询的虚拟地址
2.利用随机函数将页面号与物理块号一一对应
转换算法部分
1根据相应转换算法把逻辑地址转换为物理地址。
2.自动构造页表
结果显示部分
根据相应提示输出页表或者输入的逻辑地址对应的物理地址
四、源代码
/*C++SourceFile*/
/*开发环境为MicrosoftVisualStudio2015*/
#include
#include
#include
#include
usingnamespacestd;
#defineN50//最大值为50
intPage_length;//页长
intPage_Num;//页数
intprocess;//进程大小
intLogical_Address;//逻辑地址
classPageTable//定义一个页表项
{
public:
intpage_num;//页的编号
intpic_num;//对应的物理内存块号
public:
PageTable(intthepage_num,intthepic_num)
{
page_num=thepage_num;
pic_num=thepic_num;
}
PageTable()
{
page_num=0;
pic_num=0;
}
};
classLogicalAdd//定义逻辑地址
{public:
intpage_num;//逻辑地址对应的页号
intpage_add;//对应的页地址
public:
LogicalAdd(inta,intb)
{
page_num=a;
page_add=b;
}
LogicalAdd()
{
page_num=0;
page_add=0;
}
};
PageTablePT[N];//定义一个页表
LogicalAddLogAdd;//logicaladdress
voidinput()
{
cout<<"请输入进程大小"<cin>>process;
cout<<"输入页长\n";
cin>>Page_length;
cout<<"输入逻辑地址\n";
cin>>Logical_Address;
}
intinit()//初始化函数
{
srand(time(0));//伪随机函数,实现内存随机装配
inti,temp;
intsum=1;
Page_Num=process/Page_length+1;//计算总页数
/*cout<<"num="<PT[0].pic_num=1;
for(i=0;i{
PT[i].page_num=i;
temp=rand()%3+1;
sum=sum+temp;
PT[i].pic_num+=sum;//所对应的物理内存块号
/*cout<}
LogAdd.page_num=Logical_Address/Page_length;
if(LogAdd.page_num/Page_Num>=Page_Num)
{
cout<<"所查询的逻辑地址不在该页内,初始化失败"<return-1;
}
}
inttranslate()//转换函数,逻辑地址转换为物理地址
{
inti=0;
intres;
while(i{
if(PT[i].page_num==LogAdd.page_num)
{
res=PT[i].pic_num;
break;
}//找到某个逻辑地址对应的物理块号
elsei++;
}
if(i>N)
return-1;
returnres*Page_length+LogAdd.page_add;
}
voidoutput(intres)
{
if(res==0)
{
cout<<"构造的页表如下:
"<cout<<"页号\t块号"<for(inti=0;i{
cout<cout<}
}
elsecout<<"物理地址为:
"<}
intmain()
{
intchoice;
cout<<"-------模拟页面地址重定位--------"<for(;;)
{
cout<<"1:
输入信息\n2:
查看页表\n3:
查看物理地址\n4:
退出"<cin>>choice;
switch(choice)
{
case1:
input();
if(init()==-1)return-1;
break;
case2:
output(0);
break;
case3:
output(translate());
break;
case4:
cout<<"已经退出\n";
exit(0);
break;
}
}
return1;
}
五、运行实例
用户提示界面(如图1)
图1
首先输入1,进行手动初始化
图2
再输入2,查看页表信息
图3
输入3,查看物理地址
图4
六、心得与体会
通过本次实验,我对页面地址重定位有了较为浅显的认知,对于虚拟页面和物理块之间的联系有了更深的理解,从而也再次学习了内存装入与重定向的相关知识,受益匪浅,希望在以后的学习中再接再厉。