简介
在存储管理中,为了将虚拟地址变换成内存实地址,需要一个段表。每个程序段在段表中都占有一登记项,内容有:段号、段起点、段长、装入位等。段号指虚拟段号,装入位为1,表示该段已经装入主存,段起点指出该段调进主存时存放的实地址,段长指出该段的长度。段表有存储管理软件设置。1段表起始地址放在段表基址寄存器。CPU访问主存时,将虚拟地址中虚段号与段表起始地址相拼接,得到段表中相应项的地址,简称段表地址,即段表中相应段号在内存中地址,通过段表地址可以找到段号对应的项,从该项内容中取出该段在内存中的起点与虚地址中的段内地址相加,最后得到要访问的信息的实地址。
分段在分段存储管理方式中,作业的地址空间被划分为若干个段,每个段定义了一组逻辑信息。例如,有主程序段 MAIN、子程序段 X、数据段 D 及栈段 S 等,如图 所示。每个段都有自己的名字。为了实现简单起见,通常可用一个段号来代替段名,每个段都从 0开始编址,并采用一段连续的地址空间。段的长度由相应的逻辑信息组的长度决定,因而各段长度不等。整个作业的地址空间由于是分成多个段,因而是二维的,亦即,其逻辑地址由段号(段名)和段内地址所组成。
在该地址结构中,允许一个作业最长有 64 K 个段,每个段的最大长度为 64 KB。分段方式已得到许多编译程序的支持,编译程序能自动地根据源程序的情况而产生若干个段。例如,Pascal 编译程序可以为全局变量、用于存储相应参数及返回地址的过程调用栈、每个过程或函数的代码部分、每个过程或函数的局部变量等等,分别建立各自的段。类似地,Fortran 编译程序可以为公共块(Common block)建立单独的段,也可以为数组分配一个单独的段。装入程序将装入所有这些段,并为每个段赋予一个段号。2
分段存储管理方式的引入引入分段存储管理方式,主要是为了满足用户和程序员的下述一系列需要:
方便编程通常,用户把自己的作业按照逻辑关系划分为若干个段,每个段都是从 0 开始编址,并有自己的名字和长度。因此,希望要访问的逻辑地址是由段名(段号)和段内偏移量(段内地址)决定的。例如,下述的两条指令便是使用段名和段内地址:
LOAD 1,[A] |〈D〉 ;
STORE 1,[B] |〈C〉 ;
其中,前一条指令的含义是将分段 A 中 D 单元内的值读入寄存器 1;后一条指令的含义是将寄存器 1 的内容存入 B 分段的 C 单元中。
信息共享在实现对程序和数据的共享时,是以信息的逻辑单位为基础的。比如,共享某个例程和函数。分页系统中的“页”只是存放信息的物理单位(块),并无完整的意义,不便于实现共享;然而段却是信息的逻辑单位。由此可知,为了实现段的共享,希望存储管理能与用户程序分段的组织方式相适应。
信息保护信息保护同样是对信息的逻辑单位进行保护,因此,分段管理方式能更有效和方便地实现信息保护功能。
动态增长在实际应用中,往往有些段,特别是数据段,在使用过程中会不断地增长,而事先又无法确切地知道数据段会增长到多大。前述的其它几种存储管理方式,都难以应付这种动态增长的情况,而分段存储管理方式却能较好地解决这一问题。
动态链接动态链接是指在作业运行之前,并不把几个目标程序段链接起来。要运行时,先将主程序所对应的目标程序装入内存并启动运行, 当运行过程中又需要调用某段时, 才将该段(目标程序)调入内存并进行链接。可见,动态链接也要求以段作为管理的单位。