分段 基本概念
在编写代码的时候,程序员认为它是由主程序加上一组方法,过程或者函数的集合。他还包括这种数据结构:对象,数组,堆栈,变量。每个模块或者数据元素通过名字来引用。而不关心具体的内存位置。
分段就是支持这种用户视图的内存管理方法。逻辑地址空间是由一组段构成。每个段都有名称和长度,比如,代码段,数据段,堆栈,堆等等。
地址指定了段名称和段内偏移。所以段一般是由两个量来进行表示:
<段号, 偏移>
通常,在编译用户程序的时候,编译器会自动生成:
- 代码
- 全局变量
- 堆
- 栈
- 程序库
分段的硬件实现
虽然用户可以实现通过二维地址来引用程序内的对象,但是实际物理内存还是一维的字节数组。因此需要我们需要定义一个映射方法,把二维地址转换为一维地址。
这个地址是通过段表来实现的。段表的每个条目都有一个段基地址和段界限。段基地址包含该段在内存中的开始物理地址,而界限地址指定该段的长度。
从图中,我们可以看到段表和每个段的分布情况。
再看看分段的硬件实现,每个逻辑地址都有两个部分来实现,段号s和偏移d。 当我们从CPU的指令中得到一个地址时,它有段号和偏移d,段号首先去段表中进行索引,获取到段基(base)地址,然后加上偏