实验 成绩 一 二 三 四 五 六 七 八 九 十 总评 教师签名
武汉大学计算机学院
课程实验(设计)报告
专业(班): 计算机科学与技术 计科6班 姓 名: 张伟
学 号: 2013301500217
课程名称: 操作系统设计
任课教师: 宋伟
2015年12 月22日
1
模拟实现页面地址重定位实习报告
一、 实习内容
1、 编写和调试模拟实现页式地址重定位。
2、 加深理解页式地址重定位技术在多道程序设计中的作用和意义。
二、 实习题目
当进程在CPU上运行时,如指令中涉及逻辑地址时,操作系统自动根据页长得到页号和页内偏移,把页内偏移拷贝到物理地址寄存器,再根据页号,查页表,得到该页在内存中的块号,把块号左移页长的位数,写到物理地址寄存器。
三、实验内容:
1、设计页表结构;
2、 设计地址重定位算法 3、 有良好的人机对话界面
三、 设计思想
数据结构
int Page_length; //页长 int Page_Num;//页数 int process;//进程大小 int Logical_Address;//逻辑地址
class PageTable //定义一个页表项 { public: int page_num; //页的编号
int pic_num; //对应的物理内存块号 public:
PageTable(int thepage_num, int thepic_num) { page_num = thepage_num; pic_num = thepic_num;
}
PageTable() { page_num = 0; pic_num = 0;
}
};
class LogicalAdd //定义逻辑地址 { public: int page_num; //逻辑地址对应的页号 int page_add; //对应的页地址 public:
LogicalAdd(int a, int b)
{
2
page_num = a; page_add = b;
}
LogicalAdd() { page_num = 0; page_add = 0;
}
};
PageTable PT[N]; //定义一个页表
LogicalAdd LogAdd; //logical address
主要函数
(1)void input() //输入函数
(2)int init() //初始化函数
(3)int translate() //转换函数,逻辑地址转换为物理地址(4)void output( int res) //输出结果的函数
Main函数
int main() { int choice;
cout << \"-------模拟页面地址重定位--------\" << endl; for (;;) { cout << \"1:输入信息\\n2:查看页表\\n3:查看物理地址\\n4: 退出\" << endl; cin >> choice; switch (choice) {
case 1:input(); if (init() == -1) return -1; break; case 2:
output(0); break;
case 3:
output(translate()); break;
case 4:
cout << \"已经退出\\n\"; exit(0); break;
}
}
3
}
return 1;
初始化部分
1. 由键盘输入进程大小,页面大小,所要查询的虚拟地址 2.利用随机函数将页面号与物理块号一一对应
转换算法部分
1根据相应转换算法把逻辑地址转换为物理地址。
2.自动构造页表
结果显示部分
根据相应提示输出页表或者输入的逻辑地址对应的物理地址
四、 源代码
/*C++ Source File*/
/*开发环境为Microsoft Visual Studio 2015*/ #include #define N 50 //最大值为50 int Page_length; //页长 int Page_Num;//页数 int process;//进程大小 int Logical_Address;//逻辑地址 class PageTable //定义一个页表项 { public: int page_num; //页的编号 int pic_num; //对应的物理内存块号 PageTable(int thepage_num, int thepic_num) { } PageTable() { } page_num = 0; pic_num = 0; page_num = thepage_num; pic_num = thepic_num; public: 4 }; class LogicalAdd //定义逻辑地址 { public: }; PageTable PT[N]; //定义一个页表 LogicalAdd LogAdd; //logical address void input() { } int init() //初始化函数 { srand(time(0)); //伪随机函数,实现内存随机装配 int i, temp; int sum = 1; Page_Num = process / Page_length + 1; //计算总页数 /*cout<<\"num=\"< PT[i].pic_num += sum; //所对应的物理内存块号 /*cout< int page_num; //逻辑地址对应的页号 int page_add; //对应的页地址 LogicalAdd(int a, int b) { } LogicalAdd() { } page_num = 0; page_add = 0; page_num = a; page_add = b; public: 5 } LogAdd.page_num = Logical_Address / Page_length; if (LogAdd.page_num/Page_Num >= Page_Num) { } cout << \"所查询的逻辑地址不在该页内,初始化失败\" << endl; return -1; int translate() //转换函数,逻辑地址转换为物理地址 { } void output( int res) { } int main() { int choice; if (res == 0) { } else cout << \"物理地址为:\" << res << endl; cout << \"构造的页表如下:\" << endl; cout << \"页号\ 块号\" << endl; for (int i = 0; i < Page_Num; i++) { } cout << PT[i].page_num << \"\\"; cout << PT[i].pic_num << endl; int i = 0; int res; while (i < Page_Num) { } if (i > N) return -1; return res*Page_length + LogAdd.page_add; if (PT[i].page_num == LogAdd.page_num) { res = PT[i].pic_num; break; } //找到某个逻辑地址对应的物理块号 else i++; 6 } cout << \"-------模拟页面地址重定位--------\" << endl; for (;;) { } return 1; cout << \"1:输入信息\\n2:查看页表\\n3:查看物理地址\\n4: 退出\" << endl; cin >> choice; switch (choice) { case 1:input(); } if (init() == -1) return -1; break; output(0); break; output(translate()); break; cout << \"已经退出\\n\"; exit(0); break; case 2: case 3: case 4: 五、 运行实例 用户提示界面(如图1 ) 图1 首先输入1,进行手动初始化 7 图2 再输入2,查看页表信息 图3 输入3,查看物理地址 8 图4 六、 心得与体会 通过本次实验,我对页面地址重定位有了较为浅显的认知,对于虚拟页面和物理块之间的联系有了更深的理解,从而也再次学习了内存装入与重定向的相关知识,受益匪浅,希望在以后的学习中再接再厉。 9 因篇幅问题不能全部显示,请点此查看更多更全内容