基本分段存储管理系统

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录

一、课程设计的目的--------------------- 2

二、课程设计的内容及要求----------------- 2

三、实验原理------------------------- 2

四、地址换算变换过程结构----------------- 2

五、关键算法实现流程图------------------- 3

六、程序代码------------------------- 4

七、运行结果及分析 -------------------- 7

八、心得体会------------------------- 9

九、参考文献------------------------- 9

课程设计的目的

操作系统课程设计是重要的实践课程,课程开设的目的是让学生学习完《计算机操作系

统》课程后,进行一次全面的综合训练,让学生更好地掌握操作系统的原理及实现方法,加

深对操作系统基础理论和重要算法的理解,加强学生的动手能力。

二、课程设计的内容及要求

基本分段存储管理系统的设计

要求:(1)建立段表

(2)设计地址变换机构

(3)将变换后的结果显示出

三、实验原理

为了实现从进程的逻辑地址到物理地址的变换功能,在系统中设置了段表寄存器,用于存放段首地址,段长和段表长度TL。首先建立段表,段表内容包括段首地址,段长和段表

长度。在建立段表时,应判断段表地址是否冲突(如第一个段的首地址为1段长为50,在

建立第二个段的时候,段首地址应大于1+50),若不冲突,该段建立成功,否则重新建立该

段。然后进行地址变换,在进行地址变换时,系统将逻辑地址中的段号与段表长度进行比较。若S>TL,表示段号太大,是访问越界,于是产生越界中断信号;若未越界,则根基段表的首地址和该段的段号,计算出该段在在段表项的位置,从中读出该段在内存中的首地址,然后,再检查,段内地址d是否超过该段的段长SL。若超过,即d>SL,同样发出越界中断信号;若未越界则将该段的基址与段内地址相加,即可得到要访问内存的物理地址。最后,再

将得到的物理地址显示出来。

四、地址换算变换过程结构

芒制赛存器

股克將址段去长.度2100

L-------- ---------- J

段弓段长时.

0丄监6K

16004K

S*- r

500S K

8292 物理社址:

320fl92A0

五、关键算法实现流程图

六、程序代码

**************************************************** #in clude

#in clude typedef struct segtable // {

int segadd[256]; int segle n[256]; int len;

}segtable;

struct segtable st;

// 定义一个段表

地址换算程序流程图

//*

段表结构说明

//段首地址 //段长 //表的长度

〃*****************************************************

//段表的建立

void create()

{

char ch;

int i=0;

printf("建立段表\n");

st.le n=0;

printf(”请输入第1个段首地址:”);

scan f("%d", &st.segadd[O]);

printf(”请输入第1个段的长度:");

scan f("%d", &st.segle n[0]);

st.le n=1;

i=1;

while(i<256)

{

fflush(stdi n);

printf("是否继续输入(y/n)?\n");

ch=getchar();

if(ch==' n')

break;

printf("第%4 个段首地址应大于%d\n",i+1,st.segadd[i-1]+st.segle n[i-1]);

printf(" 请输入第%d个段首地址:",i+1);

scan f("%d", &st.segadd[i]);

if(st.segadd[i]<=st.segadd[i-1]+st.segle n[ i-1])

{

prin tf(" 地址冲突,请重新输入:");

scan f("%d", &st.segadd[i]);

}

printf(" 请输入第%d个段的长度:",i+1);

scan f("%d", &st.segle n[ i]);

st.le n++;

i++;

}

}

〃*****************************************************

//地址换算

int segment(int sn,int sd) 〃sn 为逻辑地址,sd为段内地址

{

int i,add;

if(s n> st.le n)

{

printf(" 段号%d大于段表长度%d越界中断\n",sn,st.len);

return 0;

}

else if(sd>st.segle n[sn-1])

{

printf(" 段内地址%4大于段长,越界中断\n",sd);

return 0;

}

else

{

prin tf(" 根据段号找到段首地址为%

d\n",st.segadd[s n-1]);

printf(" 物理地址=段首地址%d+段内地址%d\n",st.segadd[sn-1],sd);

add=st.segadd[s n-1]+sd;

}

return (add);

}

〃*****************************************************

void mai n()

相关文档
最新文档