您的当前位置:首页正文

模拟实现页面地址重定位实习报告

来源:个人技术集锦
编号:

实验 成绩 一 二 三 四 五 六 七 八 九 十 总评 教师签名

武汉大学计算机学院

课程实验(设计)报告

专业(班): 计算机科学与技术 计科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 #include #include #include using namespace std;

#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].page_num = i; temp = rand() % 3 + 1; sum = sum + temp;

PT[i].pic_num += sum; //所对应的物理内存块号 /*cout<> process; cout << \"输入页长\\n\"; cin >> Page_length; cout << \"输入逻辑地址\\n\"; cin >> Logical_Address;

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

因篇幅问题不能全部显示,请点此查看更多更全内容