内存分段是处理器为访问内存而设计的机制,称为内存分段机制。
简单的内存知识
- 内存结构(连续且地址依次升高)
- 访问方式
内存是随机读写设备,即访问其内部任何处,不需要从头开始找,只要直接给出其地址便可。如访问内存 0XC00,只要将此地址写入地址总线便可。
pro:那内存访问为什么要分段?
原因1:重定位
分段是从 CPU 8086 开始的,当时CPU 和寄存器等宽度都是 16 位的。16 位寄存器意味着其可存储的数字范围是2的16次方,即 64 KB,8086 的 CPU 还没有 虚拟地址,只有物理地址,也就是说,如果两个相同的程序编译出来的地址相同,那么这两个程序是无法同时运行的。为了解决这个问题,操作系统设计人员提出了让 CPU 使用 段基址 + 段内偏移 的方式来访问任意内存。
重定位的定义:简单来说就是将程序中指令的地址改 成另外 个地址,但该地址处的内容还是原地址处的内容。
所以,CPU 采用 段基址+段内偏移地址的形式访问内存,就需要专门提供段基址寄存器,这些是 cs ds,es 。程序中需要用到哪块内存,只要先加载合适的段到段基址寄存器中,再给出相对于该段基址的偏移地址便可, CPU 中的地址单元会将这两个地址相加后的结果用于内存访问,送上地址总线实现访存。
简单来说,就是程序分了段,把整个段平移到任何位置后,段内的地址相对于段基址是不变的,无论段基址是多少,只要给出段内偏移地址, CPU 就能访问到正确的指令。于是加载用户程序时,只要将整个段的内容复制到新的位置,再将段基址寄存器中的地址改成该地址,程序便可准确无误地运行。
原因2:访问到所有内存
8086 的 CPU 有 20 根地址总线,最大的寻址能力是 1MB.
段基址所在的寄存器宽度只有 16 位,最大为 64 KB 的寻址能力.
64 KB 显然不能满足 1MB 的最大寻址范围,所以就要把内存分段,每个段的最大寻址能力是 64KB,但是仍旧不能达到最大 1 MB 的寻址能力,所以这时候就需要 偏移地址的辅助,偏移地址也存入寄存器,同样为 64 KB 的寻址能力,这么一看还是不能满足 1MB 的寻址,所以 CPU 的设计者对地址单元动了手脚,将段基址左移 4 位,然后再和 16 位的段内偏移地址相加,就达到了 1MB 的寻址能力。所以内存分段的第二个目的就是能够访问到所有内存。
参考资料
-
《操作系统真象还原》
-
内存为什么要分段?