武汉大学第五次操作系统实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编号:
武汉大学计算机学院
课程实验(设计)报告
专业(班):2014级计算机科学与技术4班
学号:2014301500385
姓名:颜子琦
课程名称:操作系统设计
任课教师:
2016年12月18日
实习题目:模拟页面地址重定位
实习内容及设计思想:
1、设计思路:
1、定义逻辑地址,物理地址,页表,页长,进程大小等数据结构
2、提示并接受用户输入页长,进程大小,逻辑地址
3、根据输入的进程大小得到进程所需块数,加上逻辑地址的页号,检查是否超出
页表范围,若是重新输入
4、搜索页表将页号转换为物理块号,左移页长后加上页内偏移地址得到物理地址2、主要数据结构:
1、逻辑地址logadd
2、物理地址寄存器phyadd
3、页表pagelength[16][2]={{0,13},{1,7},{2,11},{3,8},{4,0},{5,12},{6,3},{7,9},{8,5},
{9,2},{10,15},{11,4},{12,10},{13,6},{14,1},{15,14}};
4、页长pagelength
5、进程大小process
3、主要代码结构及代码段分析:
phyadd=logadd%pagelength;//页内偏移拷贝到物理地址寄存器
if(process/pagelength+1+logadd/pagelength>15){//若超过页表范围
//logadd/pagelength为页号,process/pagelength+1为进程需要分配的块数
printf("页数超过页表表项数,请重新输入!\n");
main();
return;
}
for(i=0;i<16;i++)
if(pagetable[i][0]==logadd/pagelength){//在页表中找到该页号
phyadd+=pagetable[i][1]*pagelength;//物理地址寄存器加上物理块号左移页长得到物理地址
break;
}
上机实习所用平台及相关软件:windows10、codeblocks
调试过程:
1、测试数据设计:
2、测试结果分析:
90=5*16+10 5→12 12*16+10=202
180/16+1=12 12+5>15
233=14*16+9 14+2>15
233=7*32+9 7→9 9*32+9=297
500/32+1=16 16+7>15
500=15*32+20 15+1>15
程序得到的结果与预期一致
总结:
1、实习中遇到的问题及解决方法:
程序比较简单,没有遇到什么问题
2、实习中产生的错误及原因分析:
同上。
3、实习体会及收获
第五个实验只需要对页面地址重定位有一个最基本的了解,无论是对内部机制的理解和编程难度都不大
源代码:
#include
#include
int logadd;//逻辑地址
int phyadd;//物理地址寄存器
int pagetable[16][2]={{0,13},{1,7},{2,11},{3,8},{4,0},{5,12},{6,3},{7,9},{8,5},
{9,2},{10,15},{11,4},{12,10},{13,6},{14,1},{15,14}};//页表
int pagelength;//页长
int process;//进程大小
void main(){
int i;
printf("请输入页长:");
scanf("%d",&pagelength);
printf("请输入进程大小:");
scanf("%d",&process);
printf("请输入需要转换的逻辑地址:");
scanf("%d",&logadd);
phyadd=logadd%pagelength;//页内偏移拷贝到物理地址寄存器
if(process/pagelength+1+logadd/pagelength>15){//logadd/pagelength为页号,process/pagelength+1为进程需要分配的块数
printf("页数超过页表表项数,请重新输入!\n");
main();
return;
}
for(i=0;i<16;i++)
if(pagetable[i][0]==logadd/pagelength){
//printf("%d",pagetable[i][1]);
phyadd+=pagetable[i][1]*pagelength;
break;
}
printf("物理地址是:%d",phyadd);
return;
}