← 返回 计组与微机控制

计组与微机控制

6.0 32位微处理器

6.0 32位微处理器

32 位微处理器编程结构简介

从这里开始进入 2.2:32 位微处理器编程结构简介。

这部分不是重点讲 8086,而是从 80286、80386、80486 到 Pentium 系列的发展。

一、80286:地址线扩展到 24 位

书上说 80286 在 1982 年推出。它的重要变化是:

地址线扩展到 24 位,物理地址空间达到 16MB引入保护工作模式,支持多任务隔离保护

为什么 24 位地址线是 16MB?

因为:2^24 = 16MB

相比 8086/8088 的 1MB,80286 能访问的物理内存大了很多。

80286 的重要意义:保护模式(引入地址隔离sv39看操作系统第四章)

8086 只有实模式,程序之间隔离能力很弱。一个程序如果乱写内存,可能把操作系统或别的程序破坏掉。80286 引入保护模式以后,可以实现:

任务之间隔离用户程序和操作系统之间隔离内存访问权限检查

这就是现代操作系统多任务机制的基础之一。

二、80386:第一款 32 位微处理器

1985 年推出 80386。

80386 的意义非常大:第一款 32 位 x86 微处理器地址总线 32 位,数据总线 32 位支持 4GB 物理地址空间,为什么 32 位地址是 4GB?

2^32 = 4GB

这和 8086 的 1MB 已经完全不是一个级别。

80386 的三种工作模式

书上提到 80386 可以在三种模式下工作:

实地址模式,受保护的虚拟地址模式,虚拟 8086 模式

实地址模式:兼容 8086,启动时常用。保护模式:现代操作系统主要使用,可以实现内存保护、多任务。虚拟 8086 模式:在保护模式中模拟一个 8086 环境,用来运行旧的 8086 程序。

三、80486:集成 FPU 和 Cache

书上说 80486 相当于在 803386 基础上加入了:

80387 浮点运算协处理器8KB Cache

以前浮点运算协处理器可能是单独芯片,比如 80387。

到了 80486,把浮点单元集成进 CPU 内部。

Cache 是高速缓冲存储器,用来减少 CPU 等内存的时间。

所以 80486 比 80386 性能明显提高。

四、特权级 0~3(Machine System User)

80386/80486 提供四级特权级:0 级1 级2 级3 级

其中:0 级最高,通常给操作系统内核,3 级最低,通常给用户应用程序

这就是现代操作系统“内核态/用户态”的基础思想。

用户程序不能随便执行特权指令,也不能随便访问内核内存。

CPU 会在执行指令时检查:

当前特权级够不够?访问的内存段是否合法?有没有越界?I/O 权限是否允许?

这就是保护模式的核心。

五、Pentium 到 Pentium III

书上大概回顾了几个发展点:Pentium、Pentium MMX:增加 MMX 指令,提高多媒体处理能力。Pentium Pro:加入更大的二级 Cache,引入动态执行技术。Pentium II:可以理解为增强了 MMX 技术的 Pentium Pro。Pentium III:引入 SSE 技术,提高浮点和多媒体运算能力。

从 80386 到 Pentium 系列,性能技术不断增强,但基本编程结构仍然沿用 IA 架构。

所以书上后面选择用 80386/80486 的结构来代表 32 位 x86 编程结构。

六、虚拟 8086 模式

第 27 页中间讲:虚拟 8086 模式是 80386/80486 为了让原来的 8086 程序运行在多任务环境中而设计的。

你可以理解成:在保护模式的大环境里,CPU 给某个任务伪装出一个“8086 小环境”。

这样旧的 DOS/8086 程序以为自己还在 8086 机器上跑,但实际上它是现代保护模式下的一个任务。

所以虚拟 8086 模式的用途是:

兼容旧程序,让多个 8086 程序可以在保护环境中运行

七、SMM 系统管理模式

书上还讲了 SMM:

System Management Mode系统管理模式

它主要用于:电源管理,硬件控制,或厂商固件管理

SMM 一般不是普通程序或操作系统直接使用的。

当系统发生某种管理事件时,CPU 进入 SMM,执行专门的 SMM 代码。

执行完之后,再恢复到原来的程序状态。

可以把它理解成一种很底层、很隐蔽的系统固件管理模式。

实模式下的 32 位寄存器结构

接下来进入:实模式下的 32 位微处理器编程结构。

重点是 80386/80486 的寄存器。

一、8 个 32 位通用寄存器

80386/80486 把 8086 的 16 位通用寄存器扩展成 32 位。

6.0 32位微处理器 图 1

对应关系是:

AX → EAX BX → EBXCX → ECX DX → EDXSI → ESI DI → EDIBP → EBP SP → ESP

前面的 E 可以理解成 Extended,扩展。

所以:

EAX 是 AX 的 32 位扩展EBX 是 BX 的 32 位扩展ECX 是 CX 的 32 位扩展EDX 是 DX 的 32 位扩展

1. 低 16 位仍然可以单独访问

比如 EAX 是 32 位:EAX = 高 16 位 + AX

AX 就是 EAX 的低 16 位。

例如:EAX = 12345678H

那么:AX = 5678H

如果你执行:MOV AX, 1111H

只会修改 EAX 的低 16 位。

结果变成:EAX = 12341111H

高 16 位 1234H 不变。

2. AX、BX、CX、DX 的低 8 位和高 8 位仍然可以访问

和 8086 一样:

AX = AH + ALBX = BH + BLCX = CH + CLDX = DH + DL

所以 EAX 的结构可以这样看:EAX 32 位,低 16 位是 AXAX 的高 8 位是 AH,AX 的低 8 位是 AL

如果:EAX = 12345678H

那么:AX = 5678HAH = 56H,AL = 78H

注意,EAX 的高 16 位没有单独的名字。

也就是说,没有类似 EAH 这种寄存器。

二、段寄存器增加 FS 和 GS

8086/8088 原来有 4 个段寄存器:

CS、DS、ES、SS

80386/80486 增加了两个:

FS、GS

所以一共有 6 个段寄存器:

CS、DS、ES、SS、FS、GS

FS 和 GS 是附加段寄存器。

作用类似 ES,可以让程序多几个可用的数据段寄存器。

简单理解:8086 同一时刻主要有 4 个当前段。80386/80486 增加 FS、GS 后,同一时刻可使用的段更多。

三、IP 扩展为 EIP

8086 的指令指针是:IP:16 位

80386/80486 中扩展成:EIP:32 位

EIP 用来保存下一条指令的偏移地址。

在 32 位保护模式下,EIP 可以表示更大的偏移范围。

但在实模式兼容环境下,很多机制仍然要考虑 8086 的兼容性。

四、FLAGS 扩展为 EFLAGS

8086 的 FLAGS 是 16 位。

80386/80486 扩展成:EFLAGS:32 位

图 2.17 画的是 EFLAGS。

6.0 32位微处理器 图 2

其中低位的一些标志仍然和 8086 兼容,比如:

CF、PF、AF、ZF、SF、TF、IF、DF、OF

这些前面已经讲过。

80386/80486 又增加了一些新的标志位,书上重点列了:

IOPLNTRFVMAC

五、IOPL:I/O 特权级

IOPL 全称:I/O Privilege Level

它占 EFLAGS 中的两个位,用来表示 I/O 特权级。

它主要在保护模式下使用。作用是控制程序能不能执行 I/O 操作,比如:

INOUT

普通用户程序不能随便访问硬件端口,否则可能破坏系统安全。

所以 CPU 用 IOPL 和当前特权级一起判断:

这个程序有没有权限访问 I/O 端口?

六、NT:嵌套任务标志

NT 是:Nested Task

意思是嵌套任务。

它用于任务切换和任务嵌套。

如果一个任务是在另一个任务中被调用或中断进入的,CPU 可以通过 NT 标志帮助维护任务之间的返回关系。

这个标志主要服务于保护模式下的硬件任务机制。

普通 8086 汇编学习里不常直接用它。

七、RF:恢复标志

RF 是:Resume Flag

恢复标志。它和调试异常有关。

当调试器设置断点或单步调试时,有时一条指令执行后可能马上再次触发调试异常。

RF 可以让 CPU 在恢复执行时暂时避免重复触发同一个调试异常。

简单记:RF 用于调试恢复,避免调试故障反复发生

八、VM:虚拟 8086 模式标志

VM 是:

Virtual-8086 Mode

如果:VM = 1

表示 CPU 当前处于虚拟 8086 模式。

也就是在保护模式下模拟 8086 运行环境。

这个标志很关键,因为它告诉 CPU:

当前任务要按照虚拟 8086 的方式解释和执行。

九、AC:对齐检查标志

AC 是:Alignment Check

也就是对齐检查。书上讲它和内存访问地址是否对齐有关。

之前讲过对齐方式

比如:字节操作可以在任意地址访问。

字操作最好放在偶地址。

双字操作最好放在 4 的整数倍地址。

四字操作最好放在 8 的整数倍地址。

为什么?

因为地址对齐时,CPU 访问内存更快,可能一次总线访问就能完成。

如果不对齐,可能要多次访问内存,速度下降。不对齐如何解决也有提过(3.8节)

所以 AC 标志用于检查地址对齐问题。

更准确地说,在保护模式下,当相关条件满足时,AC 可以让 CPU 对不符合对齐要求的访问产生异常,用来帮助系统发现不规范的内存访问。

你可以先按考试层面记:

AC 用于地址对齐检查,主要和保护模式有关

8086 常用标志:

CF、PF、AF、ZF、SF、OF、TF、IF、DF

80386/80486 新增保护相关标志:

IOPL、NT、RF、VM、AC

前一组经常用于普通算术、跳转、串操作。

后一组更多用于保护模式、调试、多任务、虚拟 8086、地址对齐等系统级功能。