模拟分页式存储管理中硬件的地址转换和产生缺页中断
合肥学院
计算机科学与技术系
实验报告
2011~2012学年第一学期
课程
课程设计名称 学生姓名 学号 专业班级 指导教师
09计本(1)班
操作系统原理
模拟分页式存储管理中硬件的地址转换和产生缺页中断
2011年11月
模拟分页式存储管理中硬件的地址转换和产生缺页中断
1. 实验目的:
通过实验模拟分页式存储管理中硬件的地址转换和产生缺页中断帮助理解在分页式存储管理中怎样虚拟存储器。
2. 实验内容:
分页式虚拟存储系统是把作业信息的副本存放在磁盘上,当作业被选中时,可把作
业的开始几页先装入主存且启动执行。作业执行时,指令中的逻辑地址指出了参加运算的操作存放的页号和单元号,硬件的地址转换机构按页号查页表,若该页对应标志为“1”,则表示该页已在主存,这时根据关系式:
绝对地址=块号×块长+单元号
计算出欲访问的主存单元地址。如果块长为2的幂次,则可把块号作为高地址部分,把单元号作为低地址部分,两者拼接而成绝对地址。若访问的页对应标志为“0”,则表示该页不在主存,这时硬件发“缺页中断”信号,由操作系统按该页在磁盘上的位置,把该页信息从磁盘读出装入主存后再重新执行这条指令。
3. 实验步骤:
任务分析:
(1)分页式虚拟存储系统是把作业信息的副本存放在磁盘上,当作业被选中时,可把作业的开始几页先装入主存且启动执行。为此,在为作业建立页表时,应说明哪些页已在主存,哪些页尚未装入主存,页表的格式为:
其中,标志----用来表示对应页是否已经装入主存,标志位=1,则表示该页已经在主存,标
志位=0,则表示该页尚未装入主存。
主存块号----用来表示已经装入主存的页所占的块号。
在磁盘上的位置----用来指出作业副本的每一页被存放在磁盘上的位置。
(2)作业执行时,指令中的逻辑地址指出了参加运算的操作存放的页号和单元号,硬件的地址转换机构按页号查页表,若该页对应标志为“1”,则表示该页已在主存,这时根据关系式: 绝对地址=块号×块长+单元号
计算出欲访问的主存单元地址。如果块长为2的幂次,则可把块号作为高地址部分,把单元号作为低地址部分,两者拼接而成绝对地址。若访问的页对应标志为“0”,则表示该页不在主存,这时硬件发“缺页中断”信号,由操作系统按该页在磁盘上的位置,把该页信息从磁盘读出装入主存后再重新执行这条指令。
(30设计一个“地址转换”程序来模拟硬件的地址转换工作。当访问的页在主存时,则形成绝对地址,但不去模拟指令的执行,而用输出转换后的地址来代替一条指令的执行。当访问的页不在主存时,则输出“* 该页页号”,表示产生了一次缺页中断。
(4)假定主存的每块长度为128个字节;现有一个共七页的作业,其中第0页至第3页已经装入主存,其余三页尚未装入主存;该作业的页表为:
(1)概要设计:
定义页表结构体typedef struct
{页号、标志、主存块号、在磁盘存储位置
模拟分页式存储管理中硬件的地址转换和产生缺页中断
} table用以存放页表的数据结构信息, 定义一个操作表数据结构 typedef struct {
操作、页号、单元号 }list;
用以存放输入的操作指令,当输入操作指令时,通过操作表中的页号访问页表,查看页表的标志位flag是否为1,若flag= 1 ,则表示在内存通过绝对 地址=块号×块长+单元号 模拟出硬件的地址转换工作,若flag=0,则表示不再内存,产生一次缺页中断输出“* 该页页号”,表示产生了一次缺页中断。
主函数main()用以实现指令的输出和地址的转换工作。
(2)流程图如下:
(3)详细设计:
typedef struct //页表定义 { int pagenum; //页号 int flag; //标志
模拟分页式存储管理中硬件的地址转换和产生缺页中断
int block;//主存块号 int location; 磁盘上的位置 }table;存储页表信息
typedef struct //操作表定义 { char ope[10];//操作 int pagenum;//页号 int address;//单元号 }list;
table p1[7]= { {0,1,5,11},{1,1,8,12},{2,1,9,13}, {3,1,1,21},{4,0,NULL,22},{5,0,NULL,23},{6,0,NULL,121}
};模拟输入页表信息,期中0,1,2,3,表示存入内存,4,5,6,表示未装入内存。
Main主函数的实现如下 {
定义一个数组p2[N]用以存储输入的指令 用for(i=0;i<N;i++)实现操作指令数循环 { 、、、、、、 page=p2[i].pagenum; flag=p1[page].flag;//通过页号访问页表的标志位 if(flag==0&&p2[i].pagenum<7)//不在主存 { 输出缺页中断 } else if(页面数<7) { 绝对地址=块号×块长+单元号; 输出模拟转换的地址; } else 页面超出; }
}
(4)调试分析:
程序只是实现简单的模拟地址转换工作,当缺页时也不做任何处理功能简单 (5)测试结果:
在内存输出模拟的地址:
模拟分页式存储管理中硬件的地址转换和产生缺页中断
不在内存
(1)
使用说明:
当输入页号为0、1、2、3时,访问标志位为1,表示在主存,此时输出存储物理地址menaddress=block*size+address,当输入页号为4、5、6时,访问标志位为0,表示不在主存,输出*pagename=4 Page fault generated表示缺页中断,
(6)实验总结:本次的实验花费了我们整个小组不少的精力,虽然每个人的
分工不同,有轻有重,但我们每一个人都还是尽心尽力去完成自己的任务,实验的过程中,让我们深刻体会到即使是再怎么简单的原理,要想写出一个完整且完美的程序也还是很困难的。我们都只能力所能及的去做到最好。
模拟分页式存储管理中硬件的地址转换和产生缺页中断
7.附录:
#include "stdio.h" #include "string.h"
#define size 128 //块长 #define N 12 typedef struct { int pagenum; int flag; int block; int location;//页表定义 }table;
typedef struct //操作表定义 { char ope[10]; int pagenum; int address; }list;
table p1[7]= { {0,1,5,11},{1,1,8,12},{2,1,9,13}, {3,1,1,21},{4,0,NULL,22},{5,0,NULL,23},{6,0,NULL,121} };
void main() {
list p2[N];
int i,page,flag, memaddress;
printf("the Operating command has(+,-,*,int,out,displace)\n"); for(i=0;i<N;i++) { printf("Enter the command:\nope= "); scanf("%s",&p2[i].ope); printf("pagename= "); scanf("%d",&p2[i].pagenum); printf("Unitnum= "); scanf("%d",&p2[i].address); page=p2[i].pagenum;
模拟分页式存储管理中硬件的地址转换和产生缺页中断
flag=p1[page].flag; if(flag==0&&p2[i].pagenum<7)//不在主存 { printf("*pagenum=%d Page fault generated\n\n",p2[i].pagenum); } else if(p2[i].pagenum<7) { memaddress=p1[page].block*size+p2[i].address;
printf(" memaddress=block(%d)*size(%d)+address(%d);\n memaddress= %ld\n\n", p1[page].block,size,p2[i].address,memaddress); } else printf("page over! again\n"); } }