通常,用户把自己的作业按照逻辑关系划分为若干个段,每个段都是从0开始的。并且有自己的名字和长度。因此,希望要访问的逻辑地址是由段名和段内地址偏移量决定的。如下指令:
Load 1 ,[A]|<d> 其中,含义是将分段A中D单元内的值读入到寄存器1.
2) 信息共享
在实现程序和数据的共享时,是以信息的逻辑单位为基础的。比如共享某个函数,页面只是存放信息的物理块,不具备完整的意义。而段是信息的逻辑单位。为了实现段的共享,希望存储管理能与用户程序分段的组织方式相适应。
3) 信息保护
同样是对信息的逻辑单位进行保护
4) 动态增长
在实际应用中,有些段,特别是数据段,是不断增长的,而事先无法知道大小。分段存储管理可以很好的解决这个问题。
5) 动态链接
在作业运行之前,并不是把几个目标程序段链接起来。要运行时,先将主程序对应的目标程序装入内存启动运行,当运行过程中又要调用某段时,才将该段调入内存并进行链接。可见,动态链接也要求以段作为管理的单位。
分段系统的基本原理
1 分段原理
在分段存储管理方式中,作业的地址空间被划分为若干个段,每个段定义了一组逻辑信息。例如主程序段,子程序段,数据段,栈段。为了实现简单起见,通常可用一个段号来代替段名,每个段都从0开始编址,并采用一段连续的地址空间。
对于一个作业,由于是分成多个段,因而是一个二维的。所以说逻辑地址是由段号和段内地址组成的。
2 段表
在分段式存储管理系统中,为每一个分段分配一个连续的分区,而进程中的各个段可以离散地移入内存中不同的分区中。为使程序能正常运行,亦即,能从物理内存中找出每个逻辑段所对应的位置,就像分页系统那样,在系统中为每个进程建立一张段映射表,简称“段表”。
每个段在表中占有一个表项,其中记录了该段在内存中的起始地址和段的长度。段表可以放在寄存器中,这样有利于提高地址转换速度;但更常见的是把段表放在内存中。在配置了段表后,执行中的进程可通过查找段表,找到每个段所对应的内存区。可见,段表是用于实现从逻辑到物理内存区的映射。
3 地址变换机构
为了实现从进程的逻辑地址到物理地址的变换功能,在系统中设置了段表寄存器,用于存放段表始址和段表长度。在进行地址变换时,系统将逻辑地址中的段号与段表长度进行比较,如果段号太大,表示越界,于是产生越界中断信息。如果没有越界,则用段表的始址+段号,得到所在段表的项。之后,就找到了此段的基址。然后,决断位移量与此段的长度大小,如果越界,发现越界中断信息,否则就可以找到物理地址了。
4 分页与分段的区别
1) 页是信息的物理单位,分页是为了实现离散分配方式,以消减内存的外零头,提高内存的利用率。分页只是为了系统管理的需要;而分段则是为了程序员的需要。
2) 页的大小固定且由系统决定,由系统把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的。所以说系统中只有一种长度的页面。而段的长度不是固定的,决定它的长度的是用户编写的程序。通常是编译程序在对源程序进行编译时,根据信息的性质来划分。
3) 分页的作业地址空间是一维的,即单一的线性地址空间,而分段的作业地址是二维的。
段页式存储管理
我们知道了分页可以提高内存的利用率,而分段则可以实现信息保护,信息共享,动态链接,动态增长等,那能不能合二为一呢?这就是段页式存储管理。
基本原理