计算机操作系统实验 源码 模拟请求分页虚拟存储管理中的硬件地址变换过程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
模拟请求分页虚拟存储管理中的硬件地址变换过程
【实验目的】
1.通过实验加深对请求分页虚拟存储器管理中的地址变换加深理解。
2.熟练使用所学知识完成地址转换过程。
【实验原理】
1. 请求分页虚拟存储管理技术是把作业地址空间的全部信息存放在磁盘上。当作业被选中运行时,,先把作业的开始几页装入主存并启动运行。为此在为作业建立页表时,应说明哪些页已在主存,哪些页不在主存。页表的格式如表1-1所示,其中,”标志”表示对应页是否已经装入主存:
“1”表示对应页已经装入主存;
“0”表示对应页未装入主存;
“主存快号”表示该页对应的主存快号;
“修改位”指示该页调入主存后是否修改过的标志。
“外存地址”指示该页所在的外存地址。
自己设计一个主存分块表。
2. 作业业执行时,指令中的逻辑地址指出参加运算的操作数(或指令)地址中的页号和页内偏移量。硬件地址转换机构按页号查页表。
若该页的标志为1 ,则表示该页已在主存,从而找到该页对应的主存块号。
根据关系式:
绝对地址=块号*块的长度+页内偏移量
计算出欲访问的主存地址。由于页号为2的整次幂,所以只要将块号与页内偏移量相拼接,放入主存地址寄存器即可。按照该地址取指令或取操作数,完成指定的操作。
3. 设计一个”地址变换”程序,模拟硬件地址变化过程。当访问的页在主存时,则形成绝对地址后,不去模拟指令的执行,而是输出被转换的地址。当访问的页不在主存时,输出”该页不在主存,产生缺页中断”,以表示产生一次缺页中断。
4. 进行缺页中断处理。中断返回后,重新执行该指令。
假定主存的每块长度为64个字节,现有一个具有8页的作业,系统为其分配了4个主存块(即m=4),且最多分4块。其中第0页至第3页已经装入主存。该作业的页表如表10—2所示。
地址变换算法框图如图10—1所示。
运行设计的地址变换程序,显示或打印运行结果。。因为只是模拟地址变换,并不
【实验源码】
#include
using namespace std;
struct Page{
int pno;//页号
int flag;//标志位
int cno;//主存号
int modf;//修改位
int addr;//外存地址
}Page;
void changeaddr(struct Page p[],int logaddr){//地址变换
int j=logaddr/64;//对应的块号
int k=logaddr%64;//对应的偏移量
int flag=0;
int addr;
for(int i=0;i<8;i++)
{
if(p[i].pno==j)//找到对应的页号
{
if(p[i].flag==1)//页面标志为1
{
addr=p[i].cno*64+k;
cout<<"物理地址为: "< cout<<"详细信息: "<<"\t页面号:"< flag=1; break; } } } if(flag==0) cout<<"该页不在主存,产生缺页中断"< } void main() { int menu; int ins;//指令逻辑地址 struct Page p[8]; p[0].pno=0;p[0].flag=1;p[0].cno=5;p[0].modf=1;p[0].addr=011; p[1].pno=1;p[1].flag=1;p[1].cno=8;p[1].modf=1;p[1].addr=012; p[2].pno=2;p[2].flag=1;p[2].cno=9;p[2].modf=0;p[2].addr=013; p[3].pno=3;p[3].flag=1;p[3].cno=10;p[3].modf=0;p[3].addr=015; p[4].pno=4;p[4].flag=0;p[4].addr=017; p[5].pno=5;p[5].flag=0;p[5].addr=025; p[6].pno=6;p[6].flag=0;p[6].addr=212; p[7].pno=7;p[7].flag=0;p[7].addr=213; cout<<"----------欢迎使用分页虚拟存储器硬件地址变换算法---------"< cout<<"----------\t\t1.输入指令\t\t---------"< cout<<"----------\t\t2.退出程序\t\t---------"< cout<<"----------欢迎使用分页虚拟存储器硬件地址变换算法---------"< cout< cin>>menu; while(menu) { switch(menu) { case 1: cout<<"请输入指令的逻辑地址:"; cin>>ins; changeaddr(p,ins); break; case 2: cout<<"谢谢使用,下次再见!"< exit(0); break; default: cout<<"输入有误,请重新输入!"< break; } cout< cin>>menu; } } 【实验截图】