操作系统拾遗--内存管理之分段式存储
0. 概念
考虑到用户和程序员,已满足方便编程、信息保护和共享、动态增长、动态链接等多方面需求。
段是实现虚拟地址到线性地址转换机制的基础。在保护方式下,段的特征有以下三个:段基址,段限长,段属性。这三个特征存储在段描述符(segment descriptor)之中,用以实现从逻辑地址到线性地址的转换。段描述符存储在段描述符表之中,通常,我们使用段选择符定位段描述符在这个表中的位置。每个逻辑地址由16位的段选择符+32位的偏移量组成。
分段:按照用户进程中的自然段划分逻辑空间,例如:用户的进程由主程序、两个子程序、栈和一段数据组成,五部分划分为 5 个段,每段都从 0 开始编址,并分配一段连续的地址空间(段内要求连续、段间不要求连续)其逻辑地址由段号 S 和偏移地址 W 两部分组成。
段基址规定线性地址空间中段的开始地址。在保护模式下,段基地址长32位。因为基地址长度与寻址地址的长度相同,所以段基地址可以是 0~4GB 范围内的任意地址,而不像实方式下规定的边界必须被16整除。不过,还是建议应当选取那些 16 字节对齐的地址。尽管对于 Intel 处理器来说,允许不对齐的地址,但是,对齐能够使程序在访问代码和数据时的性能最大化。
段界限规定段的大小。在保护模式下,段界限用20位表示,而且段界限可以是以字节为单位或以4K字节为单位。偏移量是从 0 开始递增,段界限决定了偏移量的最大值。对于向下扩展的段,如堆栈段来说, 段界限决定了偏移量的最小值。
1. 段表
在段式系统中,段号和段内偏移量必须由用户提供,高级程序语言中,这个工作由编译程序完成。
段表:每个进程都有一张逻辑空间与内存空间映射的段表,每一个段表项对应进程的一个段。段表项记录该段在内存中的起始地址和段的长度。段表项的组成 = 段号+段长+本段在主存中的起始地址 b
执行中的进程可以根据段表找个每个段对应的内存区域,段表用于实现从逻辑段到物理内存区的映射。
2. 地址变换方法
- 从逻辑地址A中取出前几位为段号S,后几位为段内偏移量W(段号和段内偏移量所占的位数不确定);
- 比较段号 S 与段表长度 M(存在控制寄存器中),S ≥ M产生越界中断,否则继续执行;
- 段号S 对应的段表项地址 = 段表项起始地址F + 段号S * 段表项长度。
取出该段表项的前几位得到段长C,若段内偏移量 W ≥ C产生越界中断,否则继续执行; - 取出段表项中该段的起始地址b,物理地址:E = b + W。
![](https://img.haomeiwen.com/i2744494/643837296995d70d.png)
3. 段的共享与保护
共享:在分段系统中,段的共享是通过两个作业的段表中相应表项指向被共享段的同一个物理副本来实现的。当一个作业正在从共享段中读取数据时,必须防止另一个作业修改此共享段中的数据。不能修改的代码称为纯代码或可重入代码,这样的代码和不能修改的数据是可以共享的,可修改的代码或数据不能共享。
保护:上面的存取控制保护和越界控制保护
4. 分段与分页的比较
Paging | Segmentation | |
---|---|---|
1 | Non-Contiguous memory allocation | Non-contiguous memory allocation |
2 | Paging divides program into fixed size pages. | Segmentation divides program into variable size segments. |
3 | OS is responsible | Compiler is responsible. |
4 | Paging is faster than segmentation | Segmentation is slower than paging |
5 | Paging is closer to Operating System | Segmentation is closer to User |
6 | It suffers from internal fragmentation | It suffers from external fragmentation |
7 | There is no external fragmentation | There is no external fragmentation |
8 | Logical address is divided into page number and page offset | Logical address is divided into segment number and segment offset |
9 | Page table is used to maintain the page information. | Segment Table maintains the segment information |
10 | Page table entry has the frame number and some flag bits to represent details about pages. | Segment table entry has the base address of the segment and some protection bits for the segments. |