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 位寻址范围 00000h
到 FFFFFh
,计算出的物理地址超过 20 位,高位进位截断,导致地址“回绕”(Wrap-around)
计算出的物理地址为 0x10FFEF
,实际访问地址为 0x10FFEF & 0xFFFFF = 0x0FFEF
通过设置段寄存器和偏移寄存器访问超出 1 MB 的地址空间(100000h
到 10FFEFh
)。会被自动回绕到 00000h
到 0FFEFh
范围内
80286可寻址 224=16MB 内存空间。然而为保持与 8086 兼容性,需要解决地址回绕的问题
- 8086 上,访问
0x100000
会回绕到0x00000
- 80286 上,访问
0x100000
应该访问实际的0x100000
,而不是回绕到0x00000
解决方案:引入 A20 地址线(第 21 根地址线),控制是否启用地址回绕
- A20 禁用(A20 = 0),地址回绕行为与 8086 一致
- A20 启用(A20 = 1),地址不回绕,可以访问超过 1 MB 的内存空间
意义体现
- 兼容性:实模式下禁用 A20 可模拟 8086 地址回绕行为,确保旧软件正常运行
- 扩展性:保护模式下启用 A20 可访问超过 1 MB 内存空间,充分利用 80286 及后续处理器的地址总线扩展
保护模式不打开A20
21位恒置0,可得到地址线宽度所决定的地址空间范围内任意的奇数兆段的地址,如1M(00000hFFFFFh),3M(200000h2FFFFFh),5M(400000h~4FFFFFh),但却得不到偶数兆段的地址
所以进保护模式之前都要习惯性的开启A20,A20的相关电路虽然不是在CPU内部,但与CPU关系密切
16 位向 32 位过渡关键设计
保护模式
- 32 位地址空间: 232=4GB内存地址空间
- 分段和分页机制:更灵活的内存管理方式
- 内存保护:Ring 0 ~ 3和段描述符,防止程序访问非法内存区域
- 多任务支持:任务状态段(TSS)实现任务切换
32 位寄存器和指令集扩展
-
32 位寄存器和扩展指令集
-
新的寻址模式:如基址加变址加偏移量寻址,增强内存访问灵活性
分页机制
- 虚拟内存:物理内存划分固定页(通常 4 KB),通过页表映射到虚拟地址空间
- 地址转换:通过页目录和页表实现虚拟地址到物理地址的转换
- 页面保护:通过页表项中的权限位控制内存访问权限
内存隔离、共享和保护,现代操作系统的核心特性之一
虚拟 8086 模式(Virtual 8086 Mode)
- 兼容性:32 位保护模式下运行 16 位实模式程序
- 内存隔离:每个虚拟 8086 任务运行在独立的地址空间中,避免相互干扰
- 中断和异常处理:通过保护模式的中断机制处理虚拟 8086 任务的中断和异常
为过渡期的软件提供了平滑的迁移路径
任务状态段(Task State Segment, TSS)
- 任务切换:通过 TSS 保存和恢复任务的上下文(如寄存器状态、段选择子等)
- 权限控制:TSS 中包含任务的权限级别和堆栈指针,支持任务间的隔离和保护
为操作系统的多任务调度提供了硬件支持,是实现多任务操作系统的关键机制
中断描述符表(Interrupt Descriptor Table, IDT)
管理中断和异常处理
- 保护模式中断:通过 IDT 定义中断和异常的处理程序
- 权限控制:中断处理程序的权限级别由 IDT 中的描述符指定
为操作系统提供了统一的中断和异常处理机制,增强了系统的稳定性和安全性
浮点运算单元(FPU)
80387 是 80386 的浮点协处理器,用于加速浮点运算
- 浮点指令集:支持单精度和双精度浮点运算
- 扩展精度:支持 80 位扩展精度浮点数
FPU 显著提升了处理器的科学计算能力,为图形处理、工程计算等应用提供了支持
高速缓存(Cache)
80386 开始引入高速缓存机制,用于加速内存访问
- 一级缓存(L1 Cache):集成在处理器内部,提供高速数据访问
- 缓存一致性:通过缓存一致性协议(如 MESI)保证多处理器系统中的数据一致性