资源描述
课 程 设 计 课程名称 操作系统 学 院 计算机学院 专 业 年级班别 学 号 学生姓名 指导教师 2013 年 1 月 7 日 操作系统 课程设计任务书学生姓名陈泳鑫专业班级学号题 目编程演示三种存储管理方式的地址换算过程指导教师林穗题目编号2012秋-14主要内容1、分页方式的地址换算2、分段方式的地址换算3、段页式的地址换算任务要求要求演示正确、清晰,编程所用工具不限。参考文献1 计算机操作系统, 汤小丹等 ,西安电子科技大学出版社2 操作系统实验指导书,傅秀芬,广东工业大学(自编)3 计算机操作系统教程 ( 第二版 ), 张尧学、 史美林,清华大学出版社4 现代操作系统,A.S.Tanenbaum 著,陈向群等译机械工业出版社审查意见指导教师签字:系主任签字: 年 月 日 1、 设计思想说明 1.1 设计环境 在实现地址转换的程序实现时,运用了C+6.0来实现,因为对C语言程序的编写稍微熟悉点,可以很好的编写及调试。程序很容易看懂,输入条件在后边备注。1.2 设计思想编程演示三种存储管理方式的地址换算过程,分别为分页方式的地址换算,分段方式的地址换算,段页式的地址换算。分页方式通过逻辑地址算出页号与叶内地址,然后通过页表来实现向物理地址的转换。分段方式通过段号和段内地址得到物理地址。段叶式通过段号得到页表首地址,通过页号得到块号,进而得到物理地址。2、系统结构程序主要有三个功能,分别是分页方式的地址换算,分段方式的地址换算,段页式的地址换算。Switch函数包含3个case语句,分别用page,Segment,SegPagt完成分页方式的地址换算,分段方式的地址换算,段页式的地址换算。3、数据结构的说明typedef struct segtableint segf256;int segl256;segtable;struct segtable st;typedef struct segpagtint segf256;int segl256;int ptl256;int pt256;int pf256;int pl;segpagt;struct segpagt sp; 4、算法流程图分页式:分段式:段页式:5、 主要函数列表函数原型功能入口、出口参数说明void main()输入、输出Int 整形变量6、测试与分析分页式地址换算结果:分页式地址越界中断:分段式地址转换结果:分段式地址段号越界中断:分段式地址段内越界中断:段页式地址转换结果:段页式地址转换段号越界中断:段页式地址转换页号越界中断:段页式地址转换段内地址越界中断:结束:7、 用户使用说明根据提示输入1-4,然后有相应的提示说明,分别输入,错误的时候有提示,正确的输入会输出相应的正确的结果。附录:#include #include int page(int A,int L );int Segment(int sn,int sl);int SegPagt(int sn,int pn,int pd);typedef struct segtableint segf256;int segl256;segtable;struct segtable st;typedef struct segpagtint segf256;int segl256;int ptl256;int pt256;int pf256;int pl;segpagt;struct segpagt sp; int main()int code; int pl,pa,sn,sd,pd,pn,pc; /const int ptl ; int temp; do printf(-地址换算过程-nn); printf(*本程序由陈泳鑫设计-2013年1月3号*n); printf( 1.分页式地址换算n); printf( 2.分段式地址换算n); printf( 3.段页式地址换算n); printf( 4.结束运行nn); printf(-n); printf(请输入1-4:); scanf(%d,&temp); switch(temp) case 1: printf(预设页表长度为256n); page(pl,pa); break; case 2: int pl,pa; printf(预设段表长度为256n); printf(请输入您的逻辑地址段号:); scanf(%d,&pl); printf(请输入您的页内地址:); scanf(%d,&pa); if(pl256) printf(段号%d大于段表长度256,越界中断n,pl); else if(pa256) printf(段内地址%d大于段长度256,越界中断n,pa); else Segment(pl,pa); break; case 3: printf(预设段表长度为256,页面大小为256n); printf(请输入您的逻辑地址段号:); scanf(%d,&pl); printf(请输入您的页号:); scanf(%d,&pa); printf(请输入您的页内地址:); scanf(%d,&pc); if(pl256) printf(段号%d大于段表长度256,越界中断n,pl); else if(pa256) printf(页号长度%d大于页表长度256,越界中断n,pa); else if(pc256) printf(页内地址%d大于页面长度256,越界中断n,pc);else SegPagt(pl,pa,pc); break; while(temp != 4);return 0;/分页式地址换算部分: int page(int A,int L) int pl,pa;printf(请输入您的逻辑地址:);scanf(%d,&pl); printf(请输入您的页面大小:);scanf(%d,&pa);if(pl256)printf(页号%d大于页表长度256,越界中断n,pl);else int d,P,kd,i; int WD; int PT256; for(i=0;i=256) printf(页号大于页表长度,越界中断nn);/如果页号大于页表长度,输出越界中段 else printf(页号=逻辑地址/页面大小=%d,页内地址=逻辑地址页面大小=%dn,P,d);/输出页号和页内地址 kd=PTP;/根据页号随机产生快号 printf(根据页号%d得到块号%dn,P,kd); WD=kd*L+d;/计算物理地址的公式 printf(物理地址=块号*页面大小+页内地址n); printf(物理地址=%d*%d+%dn,kd,L,d);/输出物理地址=块号*页面大小+页内地址 printf(逻辑地址%d换算后的物理地址=%dnn,A,WD);/输出物理地址的结果 return (0); /分段式地址换算部分: int Segment(int sn,int sd) int i,wd; for(i=0;i256) printf(段号%d大于段表长度256,越界中断nn,sn);/如果段号大于段表长度,输出越界中断 else if(sdst.seglsn) printf(段内地址%d大于段长度%d,越界中断nn,sd,st.seglsn);/如果段内地址大于段长度,输出越界中断 else printf(根据段号找到段首地址%dn,st.segfsn); printf(物理地址=段首地址+段内地址n); printf(物理地址=%d+%dn,st.segfsn,sd); /输出物理地址=段首地址+段内地址 wd=st.segfsn+sd;/计算物理地址的算法 printf(换算得到的物理地址=%dnn,wd);/输出物理地址 return (0); /段页式地址换算部分:int SegPagt(int sn,int pn,int pd)int i,wd;sp.pl=256;for(i=0;i=256) printf(段号%d大于段表长度256,越界中断nn,sn);/如果段号大于段表长度256,输出越界中断else if(pn=256) printf(页号%d大于页表长度256,越界中断nn,pn);/如果页号大于页表长度,输出越界中断 else if(pdsp.pl) printf(页内地址%d大于页面长度%d,中断nn,pd,sp.pl);/如果页内地址大于页面长度,输出中断 else printf(通过段号%d找到页表首地址%dn通过页号%d找到块号%dn,sn,sp.pfsn,pn,sp.ptpn);/输出页表首地址和块号 printf(物理地址=页表首地址+块号*页面长度+页内地址n); printf(物理地址=%d+%d*%d+%dn,sp.pfsn,sp.ptpn,sp.pl,pd);/输出物理地址=页表首地址+快号*页面长度+页内地址 wd=sp.pfsn+sp.ptpn*sp.pl+pd;/计算物理地址的公式 printf(物理地址为:%dnn,wd);/输出物理地址的最好结果return (0);
展开阅读全文