简介
在操作系统中,引入分段存储管理方式的目的,主要是为了满足用户(程序员)在编程和使用上多方面的要求,如方便编程、信息共享、信息保护、动态增长、动态链接。段表长度即段表中段的个数。段表长度在分段系统中可以判断一个段访问是否越界。例如,每个段在表中占有一个表项, 其中记录了该段在内存中的起始地址(又称为 “基址” )和段的长度。执行中的进程可通过查找段表找到每个段所对应的内存区。段表是用于实现从逻辑段到物理内存区的映射。每个段都有段号,在进行地址变换时,一般先将段号和段表长度比较,确定是否访问越界。
分段在分段存储管理方式中,作业的地址空间被划分为若干个段,每个段定义了一组逻辑信息。例如,有主程序段 MAIN、子程序段 X、数据段 D 及栈段 S 等,如图 1所示。每个段都有自己的名字。为了实现简单起见,通常可用一个段号来代替段名,每个段都从 0开始编址,并采用一段连续的地址空间。段的长度由相应的逻辑信息组的长度决定,因而各段长度不等。整个作业的地址空间由于是分成多个段,因而是二维的,亦即,其逻辑地址由段号(段名)和段内地址所组成。分段地址中的地址具有如下结构:
在该地址结构中,允许一个作业最长有 64 K 个段,每个段的最大长度为 64 KB。分段方式已得到许多编译程序的支持,编译程序能自动地根据源程序的情况而产生若干个段。例如,Pascal 编译程序可以为全局变量、用于存储相应参数及返回地址的过程调用栈、每个过程或函数的代码部分、每个过程或函数的局部变量等等,分别建立各自的段。类似地,Fortran 编译程序可以为公共块(Common block)建立单独的段,也可以为数组分配一个单独的段。装入程序将装入所有这些段,并为每个段赋予一个段号。1
地址变换机构为了实现从进程的逻辑地址到物理地址的变换功能,在系统中设置了段表寄存器,用于存放段表始址和段表长度 TL。在进行地址变换时,系统将逻辑地址中的段号与段表长度TL 进行比较。若 S>TL,表示段号太大,是访问越界,于是产生越界中断信号;若未越界,则根据段表的始址和该段的段号,计算出该段对应段表项的位置,从中读出该段在内存的起始地址,然后,再检查段内地址 d 是否超过该段的段长 SL。若超过,即 d>SL,同样发出越界中断信号;若未越界,则将该段的基址 d 与段内地址相加,即可得到要访问的内存物理地址。
段表机制在请求分段式管理中所需的主要数据结构是段表。由于在应用程序的许多段中,只有一部分段装入内存,其余的一些段仍留在外存上,故须在段表中增加若干项,以供程序在调进、调出时参考。下面给出请求分段的段表项。
在段表项中,除了段名(号)、段长、段在内存中的起始地址外,还增加了以下诸项。
(1) 存取方式:用于标识本分段的存取属性是只执行、只读,还是允许读/写。
(2) 访问字段 A: 其含义与请求分页的相应字段相同, 用于记录该段被访问的频繁程度。
(3) 修改位 M:用于表示该页在进入内存后是否已被修改过,供置换页面时参考。
(4) 存在位 P:指示本段是否已调入内存,供程序访问时参考。
(5) 增补位:这是请求分段式管理中所特有的字段,用于表示本段在运行过程中是否做过动态增长。
(6) 外存始址:指示本段在外存中的起始地址,即起始盘块号。