1、3 计算机操作系统教程 ( 第二版 ), 张尧学、 史美林,清华大学出版社4 现代操作系统,A.S.Tanenbaum 著,陈向群等译机械工业出版社指导教师签字:审查意见系主任签字: 年月日 设计思想说明1.1 设计环境 在实现地址转换的程序实现时,运用了 C+6.0 来实现,因为对 C 语言程序的编写稍微熟悉点,可以很好的编写及调试。程序很容易看懂,输入条件在后边备注。1.2 设计思想编程演示三种存储管理方式的地址换算过程,分别为分页方式的地址换算, 分段方式的地址换算,段页式的地址换算。分页方式通过逻辑地址算出页号与叶内地址,然后通过页表来实现向物理地址的转换。分段方式通过段号和段内地址得
2、到物理地址。段叶式通过段号得到页表首地址,通过页号得到块号,进而得到物理地址。2、系统结构程序主要有三个功能,分别是分页方式的地址换算,分段方式的地址换算, 段页式的地址换算。Switch函数包含3个case语句,分别用page,Segment,SegPagt完成分页方式的地址换算,分段方式的地址换算,段页式的地址换算。3、数据结构的说明typedef struct segtable int segf256; int segl256;segtable;struct segtable st; typedef struct segpagt int ptl256; int pt256; int pf
3、256; int pl;segpagt;struct segpagt sp; 4、算法流程图分页式:分段式:段页式:5、主要函数列表函数原型void main() 功能输入、输出入口、出口参数说明Int 整形变量6、测试与分析分页式地址换算结果:分页式地址越界中断:分段式地址转换结果:分段式地址段号越界中断:分段式地址段内越界中断:段页式地址转换结果:段页式地址转换段号越界中断:段页式地址转换页号越界中断:段页式地址转换段内地址越界中断:结束:7、用户使用说明根据提示输入 1-4,然后有相应的提示说明,分别输入,错误的时候有提示,正确的输入会输出相应的正确的结果。附录:#include #in
4、clude int page(int A,int L );int Segment(int sn,int sl);int SegPagt(int sn,int pn,int pd); typedef struct segtable int main() int code; int pl,pa,sn,sd,pd,pn,pc; /const int ptl ; int temp; do printf(-地址换算过程-nn);* 本程序由陈泳鑫设计-2013 年 1 月 3 号*n printf( 1. 分页式地址换算n 2. 分段式地址换算n 3. 段页式地址换算n 4. 结 束 运 行 nn-n
5、请输入 1-4: scanf(%d,&temp);switch(temp) case 1: 预设页表长度为256n page(pl,pa); break; case 2:int pl,pa; 预设段表长度为256n printf( 请输入您的逻辑地址段号: scanf(pl); printf(请输入您的页内地址:pa); if(pl256) printf(段号%d 大于段表长度 256,越界中断n,pl); else if(pa printf(段内地址%d 大于段长度 256,越界中断n,pa); else Segment(pl,pa); case 3: 预设段表长度为256,页面大小为256
6、n printf(请输入您的逻辑地址段号:请输入您的页号: 请输入您的页内地址:pc); if(pl页号长度%d 大于页表长度 256,越界中断n if(pc页内地址%d 大于页面长度 256,越界中断n,pc);else SegPagt(pl,pa,pc); break;while(temp != 4); return 0;/分页式地址换算部分: int page(int A,int L) 请输入您的逻辑地址: scanf( 请输入您的页面大小:if(pl页号%d 大于页表长度 256,越界中断nelse int d,P,kd,i; int WD; int PT256; for(i=0;i=
7、256) printf( 页号大于页表长度,越界中断nn/如果页号大于页表长度, 输出越界中段 else 页号= 逻辑地址/ 页面大小 =%d, 页内地址= 逻辑地址 页面大小=%dn,P,d);/输出页号和页内地址 kd=PTP;/根据页号随机产生快号根据页号%d 得到块号%dn,P,kd); WD=kd*L+d;/计算物理地址的公式物理地址=块号*页面大小+页内地址n物理地址=%d*%d+%dn,kd,L,d);/输出物理地址=块号*页面大小+页内地址逻辑地址%d 换算后的物理地址=%dnn,A,WD);/输出物理地址的结果 return (0); /分段式地址换算部分: int Segm
8、ent(int sn,int sd) int i,wd; for(i=0;255; st.segfi=rand()%255;/ 定义随机产生段首地址为1 到 255 之间 st.segli=rand()%2048;/ 定义随机产生段长度为1 到 2048 之间 if(sn256) printf( 段号%d 大于段表长度 256,越界中断nn,sn);/如果段号大于段表长度,输出越界中断 elseif(sdst.seglsn) printf( 段 内 地 址 %d 大 于 段 长 度 %d, 越 界 中 断nn,sd,st.seglsn);/如果段内地址大于段长度,输出越界中断 else 根据段
9、号找到段首地址%dn,st.segfsn); 物理地址=段首地址+段内地址n物理地址=%d+%dn,st.segfsn,sd); /输出物理地址=段首地址+段内地址 wd=st.segfsn+sd;/ 计算物理地址的算法 换算得到的物理地址=%dnn,wd);/输出物理地址/段页式地址换算部分:int SegPagt(int sn,int pn,int pd) int i,wd; sp.pl=256;sp.pfi=sp.segfi=rand()%26624;/定义随机产生的数在1 到 26624 之间sp.ptli=sp.segli=rand()%512;/定义随机产生的数在1 到 512 之间sp.pti=rand()%256;/定义随机产生的数在1 到 256 之间 if(sn=256) 段号%d 大于段表长度