在分页存储系统中,作业的地址空间是一维线性的,这破坏了程序内部天然的逻辑结构。这样常常会把逻辑相关部分划到不同的页面,造成共享、保护的困难。加之,程序员常常用二维地址描述自己的程序,于是产生了分段的思想。如下图:
分段式存储管理的作业空间是以段为单位的,每个段将占据一个连续的存储区域,但各段之间不必连续。这样,一个作业的各个分段在主存的情况用一个段表来记录,它指出了主存中各个分段的起始地址和长度,如下图。
段表表目实际上起到了基址/限长寄存器的作用。由于每个作业都有自己的段表,地址转换应按各自的段表进行。类似于分页存储器那样,分段存储器也设置一个段表控制寄存器 ,用于存放当前占用CPU的作业的段表始址和长度。地址转换关系如下图所示。
扩充段表(每个作业一个)
中断位:1表示该页在主存;0相反。
访问位:1表示该页最近被访问过;0相反。
改变位:1表示该页内容已被修改;0相反。
记录共享段的状态,包括:当前段是否在主存(由状态位指示),该段在主存的始址 ,共享的作业数,每个作业名,作业号以及在该作业中的段号、允许的存取方式等。
每个允许被共享的段,当其调入主存 时,均在此表上登记。当一共享作业退出 系统后,则应将共享本段作业数减1,并 将相应的表目改为“可用”。若共享作业数为0,则请求系统回收相应的存储空间。
实现各分段之间有效的、一致的动态连接。在动态连接过程中调入一 分段时,在表中登记段名、访问的入口点、段名及段内地址,系统为之分配一个段号。
段的动态链接是在一个程序运行开始时,只将主程序段装配好并调入主存。其它各段的装配是在主程序段运行过程中逐步进行的。每当需要调用一个新段时,再将这个新段装配好,并与主程序段连接。
实现动态连接要附加两个功能:间接编址和连接障碍指示。
直接编址和间接编址类 似于机器指令的直接地址和间接地址,如左 图所示,设100号单元存放数值800,而800号 单元中存放着数值1000,则:
直接编址:Load 100
表示将800(100号的内容)装入。
间接编址:Load * 100
表示将1000(800号的内容)装入。
包含直接地址的字称为间接字。其格式如下:
L为障碍指示位:
L=0,表示需要连接,发出连接中断信号转操作系统处理;
L=1,表示不要连接,仅作间接地址处理。
经编译后形式目标指令 Load * 1,1|100,当执行到指令时,系统将产生连接中断, 操作系统对连接中断的处理如下:
⑴从1段100单元取出间接字
⑵取出间接字中直接地址1段108单元
⑶按直接地址取出要连接段的符号名 [X]|〈Y〉,按定义给它分配段号
⑷(这里假定[X]=4,〈Y〉= 120), 查[X]段是否在主存,若不在则从辅 存把它调入主存,并登记段号,修改主存分配表。
⑸修改间接字,取消障碍指示(L=0) 且使直接地址为连接的分段地址,即 4段120单元
⑹重新启动被中断的指令执行。当指 令重新执行时,由于100单元已无障 碍指示,不再引起中断,且直接地址 就是连接段的地址2段120单元,于是 可以从2段120单元读出所需的数据 015571装入到1号寄存器。
段式虚拟存储系统利用段的动态连接功能,很容易实现段的共享,由于不能预言各作业在什么情况下调用共用段且段号可在动态连接时分配,因而一个共享段对不同的调用表可以具有不同的段号。
例如,公共子程序COS,在作业1调用时具有段号2,而在作业2调用时可以是段号1。上图是一个共享[COS]段的例子。
我们可以设置一个“共享段表”来实现段的共享。如上图所示。
欢迎大家加我微信交流讨论(请备注csdn上添加)



