8086之前是4位和8位机天下,没有段的概念。程序访问内存要给出内存的实际物理地址,源码很多硬编码物理地址。难重定位,可控性弱,结构丑陋

8086

8086 地址空间需求

16 位cpu 8086,设计目标是支持 1 MB(220 = 1,048,576 字节) 内存地址空间

16 位寄存器的限制

16 位地址总线只能寻址 216=64KB内存,20位地址总线才满足需求

16 位寄存器基础上支持更大地址空间 8086 寄存器(AX、BX、CX、DX 等)单个寄存器只能存储 16 位地址,最大寻址范围 64 KB。为了突破这个限制,8086 引入了 分段内存管理机制

分段内存管理(地址翻译)机制

借鉴 PDP-11 MMU

4个段寄存器,CS,DS,SS,ES

20 位物理地址由两个部分组成: segment:offset 段寄存器(Segment Register) 和 偏移寄存器(Offset Register)

物理地址=(段寄存器×16)+偏移寄存器

segment << 4 + offset

物理地址=(0x1234×16)+0x5678=0x12340+0x5678=0x179B8

后续发展

80286 引入 保护模式

80286 地址总线扩展到 24 位,80386 32 位

现代 CPU 采用 平坦内存模型,不再需要分段机制,用分页机制管理内存

A20

经典历史问题,涉及硬件设计和软件兼容性

地址翻译后理论最大 物理地址=(0xFFFF×16)+0xFFFF=0xFFFF0+0xFFFF=0x10FFEF

20 位寻址范围 00000hFFFFFh ,计算出的物理地址超过 20 位,高位进位截断,导致地址“回绕”(Wrap-around)

计算出的物理地址为 0x10FFEF,实际访问地址为 0x10FFEF & 0xFFFFF = 0x0FFEF

通过设置段寄存器和偏移寄存器访问超出 1 MB 的地址空间(100000h10FFEFh)。会被自动回绕到 00000h0FFEFh 范围内


80286可寻址 224=16MB 内存空间。然而为保持与 8086 兼容性,需要解决地址回绕的问题

解决方案:引入 A20 地址线(第 21 根地址线),控制是否启用地址回绕

意义体现

  1. 兼容性:实模式下禁用 A20 可模拟 8086 地址回绕行为,确保旧软件正常运行
  2. 扩展性:保护模式下启用 A20 可访问超过 1 MB 内存空间,充分利用 80286 及后续处理器的地址总线扩展

保护模式不打开A20

21位恒置0,可得到地址线宽度所决定的地址空间范围内任意的奇数兆段的地址,如1M(00000hFFFFFh),3M(200000h2FFFFFh),5M(400000h~4FFFFFh),但却得不到偶数兆段的地址

所以进保护模式之前都要习惯性的开启A20,A20的相关电路虽然不是在CPU内部,但与CPU关系密切

16 位向 32 位过渡关键设计

保护模式

32 位寄存器和指令集扩展

分页机制

内存隔离、共享和保护,现代操作系统的核心特性之一

虚拟 8086 模式(Virtual 8086 Mode)

为过渡期的软件提供了平滑的迁移路径

任务状态段(Task State Segment, TSS)

为操作系统的多任务调度提供了硬件支持,是实现多任务操作系统的关键机制

中断描述符表(Interrupt Descriptor Table, IDT)

管理中断和异常处理

为操作系统提供了统一的中断和异常处理机制,增强了系统的稳定性和安全性

浮点运算单元(FPU)

80387 是 80386 的浮点协处理器,用于加速浮点运算

FPU 显著提升了处理器的科学计算能力,为图形处理、工程计算等应用提供了支持

高速缓存(Cache)

80386 开始引入高速缓存机制,用于加速内存访问