解开内存寻址的历史密码|计算机内存分段

这文章讲述了计算机内存分段的历史和原理,解释了为什么需要分段以及如何使用段基址和段内偏移来访问内存。分段解决了早期计算机内存寻址的限制,使不同程序能够并存于内存中,同时避免了地址冲突。分段概念对计算机体系结构至关重要。

内存结构

首先先来看一下内存的结构吧,如下图所示

这是一段内存,从下向上内存地址依次升高。由于内存是随机读写设备,在进行内存访问时,可以访问任意的内存地址,不需要从头开始访问。比如 CPU 想要访问 0x03 这个内存地址中的数据,只需要将 0x03 这个内存地址写入总线即可送入内存,访问数据送回 CPU。

这种访问方式本来没什么问题,那么好端端的内存为啥要搞个分段呢?

分段是从 8086 CPU 开始的,由于在 8086 那个年代,CPU 和寄存器都是 16 位的,所以计算机还是很昂贵的设备,16 位的寄存器意味着只能寻址 2 ^ 16 次方的,即 65536 字节,64 KB 。那时的计算机还没有虚拟地址的概念,任何内存访问都访问的是实实在在的物理地址。

若要加载程序时,不论是内核程序还是用户程序,程序中的地址都是物理地址,那么这个程序必须固定在内存中的某个地方不会动,这样就可能会存在编译出来两个相同的内存地址,程序只能运行其中一个。针对这种情况,计算机设计人员提出了分段的概念。

分段的本质是让 CPU 采用了段基址 + 段内偏移的方式来访问任意位置的内存。每个应用程序访问的物理地址都会经过重定位,虽然都是访问物理地址,但是不同应用程序编译出来访问物理地址却是不同的。

假设有两个程序,每个大小各为 16 KB

从图上可以看出,这是两个不同的 16KB 程序的装载过程,a 程序首先会跳转到地址 24,那里是一条 MOV 指令,然而 b 程序会首先跳转到地址 28,地址 28 是一条 CMP 指令。这是两个程序被先后加载到内存中的情况,假如这两个程序被同时加载到内存中并且从 0 地址处开始执行,内存的状态就如上面 c 图所示,程序装载完成开始运行,第一个程序首先从 0 地址处开始运行,执行 JMP 24 指令,然后依次执行后面的指令(许多指令没有画出),一段时间后第一个程序执行完毕,然后开始执行第二个程序。第二个程序的第一条指令是 28,这条指令会使程序跳转到第一个程序的 ADD 处,而不是事先设定好的跳转指令 CMP,由于这种不正确访问,可能会造成程序崩溃。

重定位就是把每个应用程序的相对物理地址合成为绝对物理地址的过程,这个描述大家能理解吗?

既然 CPU 要使用段基址 + 段内偏移这种方式来寻址,就必须提供相应的寄存器,段基址用 cs、ds、ss 来表示。程序中需要用到哪部分内存,就直接用段基址定位所在的段,然后给出段内偏移即可找到物理地址。

如上图所示,假如想访问 0x04 地址,那么各应用程序可以给出不同的内存访问方式:段地址为 0x00 ,偏移地址为 0x04,段地址为 0x01,偏移地址为 0x03,段地址为 0x02,偏移地址为 0x02,段地址为 0x03 ,偏移地址为 0x01 ,段地址为 0x04,偏移地址为 0 ,所以,分段后的程序如果想要访问任意内存位置,只需给出段地址 + 偏移地址即可,这是很重要的一个概念。

相关推荐
岑梓铭4 小时前
考研408《计算机组成原理》复习笔记,第二章(3)数值数据的运算和存储(定点数计算)
笔记·考研·408·计算机组成原理
2301_801821711 天前
实验-设计一个应用系统(计算机组成原理)
cpu·risc-v·计算机组成原理·logisim
眸生2 天前
自制操作系统day7(获取按键编码、FIFO缓冲区、鼠标、键盘控制器(Keyboard Controller, KBC)、PS/2协议)
c语言·汇编·计算机外设·操作系统·计算机组成原理·寄存器
眸生4 天前
至此(day1-day4)代码详解(ai辅助整理)
c语言·汇编·操作系统·计算机组成原理·显存·i/o外设
岑梓铭9 天前
考研408《计算机组成原理》复习笔记,第二章(2)数值数据的表示(浮点数篇)
笔记·考研·408·计算机组成原理
尸僵打怪兽13 天前
软考错题集
java·python·计算机网络·操作系统·c·软考·计算机组成原理
岑梓铭20 天前
考研408《计算机组成原理》复习笔记,第二章计算机性能
笔记·考研·408·计算机组成原理
Nelson_hehe25 天前
考研408-计算机组成原理冲刺考点(4-5章)
考研·计算机组成原理·知识点总结·指令系统·中央处理器·考点冲刺
Nelson_hehe1 个月前
考研系列-计算机组成原理第四章、指令系统
408·计算机组成原理·计算机体系结构·指令系统·考研知识整理
Nelson_hehe1 个月前
考研系列-计算机组成原理第二章:数据的表示和运算
计算机组成原理·补码·ieee754·考研408·移码