请求分段存储管理方式
目录
参考资料:
在分页基础上建立的请求分页式虚拟存储器系统,是以页面为单位进行换入、换出的。而在分段基础上所建立的请求分段式虚拟存储器系统,则是以分段为单位进行换入、换出的。它们在实现原理以及所需要的硬件支持上都是十分相似的。在请求分段系统中,程序运行之前,只需先调入少数几个分段便可启动运行。当所访问的段不在内存中时,可请求 OS 将所缺的段调入内存。
1 请求分段中的硬件支持——请求段表机制
在请求分段式管理中所需的主要数据结构是请求段表。在该表中除了具有请求分页机制中有的访问字段 A、修改位 M、存在位 P 和外存始址四个字段外,还增加了存取方式字段和增补位。这些字段供程序在调进、调出时参考。
在段表项中,除了段名(号)、段长、段在内存中的起始地址(段基址)外,还增加了以下字段:
- **存取方式:**由于应用程序中的段是信息的逻辑单位,可根据该信息的属性对它实施保护,故在段表中增加存取方式字段,如果该字段为两位,则存取属性是只执行、只读和允许读/写。//读写方式
- **访问字段 A:**其含义与请求分页的相应字段相同,用于记录该段被访问的频繁程度。提供给置换算法选择换出页面时参考。
- **修改位 M:**该字段用于表示该页在进入内存后是否已被修改过,供置换页面时参考。
- **存在位 P:**该字段用于指示本段是否已调入内存,供程序访问时参考。
- **增补位:**这是请求分段式管理中所特有的字段,用于表示本段在运行过程中是否做过动态增长。
- **外存始址:**指示本段在外存中的起始地址,即起始盘块号。
// 缺段中断机构,以及地址变换机构等硬件的支持不再做赘述
2 分段的享与保护
分段存储管理方式的优点是便于实现分段的共享与保护。
2.1 共享段表
为了实现分段共享,可在系统中配置一张共享段表,所有各共享段都在共享段表中占有一表项。在表项的上面记录了共享段的段号、段长、内存始址、状态(存在)位、外存始址以及共享计数等信息,接下去就是记录了共享此分段的每个进程的情况。共享段表如下图所示:
其中各项说明如下:
- **共享进程计数 count:**非共享段仅为一个进程所需要。当进程不再需要该段时,可立即释放该段,并由系统回收该段所占用的空间。而共享段是为多个进程所需要的,为记录有多少进程正在共享该分段,须设置共享进程计数 count。当某进程不再需要而释放它时,系统并不立即回收该段所占内存区,而是检查 count 是否为 0,若不是 0,则表示还有进程需要它,仅当所有共享该段的进程全都不再需要它时,此时 count 为 0,才由系统回收该段所占内存区。
- **存取控制字段:**对于一个共享段,应为不同的进程赋予不同的存取权限。例如对于文件主,通常允许他读和写;而对其它进程,则可能只允许读,甚至只允许执行。
- **段号:**对于一个共享段,在不同的进程中可以具有不同的段号,每个进程可用自已进程的段号去访问该共享段。
2.2 共享段的分配与回收
(1)共享段的分配
由于共享段是供多个进程所共享的,因此,对共享段的内存分配方法,与非共享段的内存分配方法有所不同。
在为共享段分配内存时,对第一个请求使用该共享段的进程,由系统为该共享段分配一物理区,再把共享段调入该区,同时将该区的始址填入请求进程的段表的相应项中,还须在共享段表中增加一表项,填写请求使用该共享段的进程名、段号和存取控制等有关数据,把 count 置为 1。
当又有其它进程需要调用该共享段时,由于该共享段已被调入内存,故此时无须再为该段分配内存,而只需在调用进程的段表中增加一表项,填写该共享段的物理地址。在共享段的段表中增加一个表项,填上调用进程的进程名、该共享段在本进程中的段号、存取控制等,再执行 count = count + 1 操作,以表明有两个进程共享该段。//在段表中加记录
以后,凡有进程需要访问此共享段的,都按上述方式在共享段的段表中增加一个表项。
(2)共享段的回收
当共享此段的某进程不再需要该段时,应将该段释放,包括撤消在该进程段表中共享段所对应的表项,以及执行 count = count - 1 操作。若结果为 0,则须由系统回收该共享段的物理内存,以及取消在共享段表中该段所对应的表项,表明此时已没有进程使用该段;否则(减 1 结果不为 0),只是取消调用者进程在共享段表中的有关记录。//在段表中减记录
2.3 分段保护
在分段系统中,由于每个分段在逻辑上是相对独立的,因而比较容易实现信息保护目前,常采用以下几种措施来确保信息的安全。
(1)越界检查
越界检查是利用地址变换机构来完成的。为此,在地址变换机构中设置了段表寄存器用于存放段表始址和段表长度信息。在进行地址变换时,首先将逻辑地址空间的段号与段表长度进行比较,如果段号等于或大于段表长度,将发出地址越界中断信号。此外,还在段表中为每个段设置有段长字段,在进行地址变换时,还要检查段内地址是否等于或大于段长,若大于段长,将产生地址越界中断信号,从而保证了每个进程只能在自己的地址空间内运行。
(2)存取控制检查
存取控制检查是以段为基本单位进行的。为此,在段表的每个表项中都设置了一个“存取控制”字段,用于规定对该段的访问方式。通常的访问方式有:
- 只读,即只允许进程对该段中的程序或数据进行读访问。
- 只执行,即只允许进程调用该段去执行,但不准读该段的内容,更不允许对该段执行写操作。
- 读/写,即允许进程对该段进行读/写访问。
对于共享段而言,存取控制就显得尤为重要,因而对不同的进程应赋予不同的读写权限。这时,既要保证信息的安全性,又要满足运行需要。例如,对于一个企业的财务账目,应该只允许会计人员进行读或写,允许领导及有关人员去读。而对于一般人员,则既不准读,更不能写。值得一提的是,这里所介绍的存取控制检查是基于硬件实现的,它能较好地保证信息的安全,因为攻击者很难对存取控制字段进行修改。//企业应用程序中也可用软件的方式
(3)环保护机构
这是一种功能较完善的保护机制。在该机制中规定:低编号的环具有高优先权。OS 核心处于 0 号环内;某些重要的实用程序和操作系统服务占居中间环,而一般的应用程序,则被安排在外环上。//用户态和内核态
在环系统中,程序的访问和调用应遵循以下规则
- 一个程序可以访问驻留在相同环或较低特权环(外环)中的数据
- 一个程序可以调用驻留在相同环或较高特权环(内环)中的服务