本课程设计深入探讨了内存管理中的分页与分段机制,包括两种方式下虚拟地址到物理地址的转换原理及实现方法。
### 一、课程设计目的
本课程设计是学生在完成《计算机操作系统》课程学习后进行的一次全面综合训练。通过这次实践操作,旨在帮助学生更好地掌握操作系统的基本原理及其实现方法,并加深对相关基础理论及重要算法的理解和应用能力。
### 二、课程设计内容
1. 分页方式的地址转换。
2. 分段方式的地址换算。
3. 段页式的地址换算。
### 三、程序运行步骤
#### 1. 分页式地址转换:
- 输入逻辑地址:223
- 页面大小(字节):23
#### 2. 分段式地址转换:
- 输入段号:223
- 段内地址:23
#### 3. 段页式地址换算:
- 输入逻辑地址的段号:2
- 页号:3
### 四、程序源代码
```c
#include
#include
int page(int A, int L);
int Segment(int sn, int sl);
int SegPagt(int sn, int pn, int pd);
typedef struct segtable {
int segf[256];
int segl[256];
}segtable;
struct segtable st;
typedef struct segpagt{
int segf[256];
int segl[256];
int ptl[256];
int pt[256];
int pf[256];
int pl;
}segpagt;
struct segpagt sp;
int main() {
int code, pa, sn, sd, pd ,pn ; //定义变量
do{
printf(----------------地址换算过程----------------------------\n\n);
printf(1. 分页式地址换算\n2. 分段式地址换算\n3. 段页式地址换算\n4. 结束运行 \n);
printf(\n请输入您的选择:);
scanf(%d,&code);
switch(code) {
case 1:
{
printf(注意:请演示设定页表长度小于256。\n);
printf(输入逻辑地址:\n);
scanf(%d, &pa);
printf(页面大小(字节):\n);
scanf(%d,&pd);
page(pa, pd);
} break;
case 2:
{
printf(请演示设定段表长度小于256。\n);
printf(输入逻辑地址的段号:\n);
scanf(%d, &sn);
printf(段内地址:\n);
scanf(%d,&sd);
Segment(sn, sd);
} break;
case 3:
{
printf(预设定段表长为256,页面大小为1024。\n);
printf(输入逻辑地址的段号:\n);
scanf(%d, &sn);
printf(页号:\n);
scanf(%d,&pn);
printf(页内地址:\n);
scanf(%d,&pd);
SegPagt(sn, pn, pd);
} break;
case 4:
break;
}
} while (code<4);
int page(int A,int L) {
int d,P,kd,i;
int WD;
int PT[256];
for(i=1;i<256;i++) {
PT[i]=rand() % 512;
}
P=A/L;//页号等于逻辑地址/页面大小
d=A%L; //页内地址=逻辑地址%页面大小
if(P>L) printf(页号大于页表长度,越界中断\n);
else {
printf(页号= 逻辑地址/ 页面大小=%d, 页内地址 = 逻辑地址 % 页面大小=%d\n,P,d);
kd=PT[P]; //根据页号随机产生快号
printf(块号%d\n,kd);
WD=kd*L+d;
printf(物理地址 = 块号 * 页面大小 + 页内地址 =%d\n,WD);
return (0);
}
```