本文用于汇总整理Intel80386对协处理器与多处理器的支持,
参考文献:
- 《INTEL 80386 programmer's reference manual 1986》
本文是系列文章《Intel80386知识总结》的一部分。
===================================================================
协处理器与多处理器都是i386提供的并行计算支持。其中协处理器提供专门领域的辅助并行处理,多处理器机制提供通用的并行计算接口。
1. 协处理器
i386可以使用80287或者80387作为协处理器,自检后,若ET位=1,则处理器正在使用协处理器80387,否则正在使用协处理器80287或者没有协处理器。
1.1 ESC指令和WAIT指令
ESC指令和WAIT指令用以控制处理器与协处理器交互。以11011开头的指令被称作ESC指令,用来向协处理器发送指令。处理器在遇到ESC指令之后会进行以下操作,然后将指令发送给协处理器:
- 检查标志位EM,确定协处理器功能是否由软件模拟。若使用软件模拟协处理器,则在此时触发7号异常,由软件介入模拟。
- 检查标志位TS,确定自上一条ESC指令始到现在,有没有发生过上下文切换。
- 检查ERROR针脚,确定上一条ESC指令有没有发生错误
WAIT指令用以同步处理器与协处理器的协作执行,当处理器遇到WAIT指令时进行如下操作:
- 检查MP(Monitor Coprocesser)标志位是否为1,若为1,则进一步检查TS标志位,若TS=1,则触发7号异常。系统软件可以借此机会,切换协处理器的上下文,来保持当前任务上下文一致。
- 等待,直到协处理器释放BUSY针脚
- 检查ERROR针脚确定是否出错,若出错则触发17号异常
1.2 协处理器异常
共包括3个:
- 7号:协处理器不可用
- 9号:协处理器段用尽
- 16号:协处理器错误
2. 多处理器
多处理器支持的题中之义主要在于多处理器并发访问内存时的同步控制。
2.1 LOCK指令
LOCK是一个指令前缀,用它可以设置处理器的LOCK针脚,LOCK指令的目标操作数所在的内存区域将被锁定,LOCK之后的指令将获得独占修改该区域的权力。LOCK指令必须被用在下列指令之前,否则将会产生undefined-opcode异常:
- Bit test and change: BTS, BTR, BTC.
- Exchange: XCHG.
- Two-operand arithmetic and logical: ADD, ADC, SUB, SBB, AND, OR, XOR.
- One-operand arithmetic and logical: INC, DEC, NOT, and NEG.
2.2 隐式的内存同步访问
在下列情形中,处理器将自动设置LOCK针脚,同步内存访问,而不需要显示的调用LOCK指令:
- 接收中断时:中断发生后,中断处理器需要把中断ID和中断源通过数据总线发送给处理器,此时处理器将会通过LOCK信号保证在此期间不会有其他数据出现在数据总线上。
- 设置TSS的Busy位时:处理器通过设置TSS的Type字段Busy位来保证任务不可重入,在设置和检查Busy的时候,处理器会自动建立LOCK信号。
- 载入段描述符时:载入段描述符到段寄存器时,处理器将通过建立LOCK信号保证在此期间段描述符不会被其他处理器修改。为了避免在修改一个段描述符时处理器对其进行载入操作,系统软件在修改段描述符前应显式的设置标志,即遵循这样三步:1)使用带LOCK的修改指令修改段描述符的access-rights byte,使其处于not-present状态;2)更新段描述符(这一步可能多次访存,在此期间使用LOCK前缀是无效的);3)使用带LOCK的修改指令修改段描述符的access-rights byte,使其再次处于present状态。
- 更新页表的Access位和Dirty位时:更新页表的Access位和Dirty位时将通过建立LOCK信号保证原子性,同时这些更新也会绕过页表缓存
- 执行XCHG指令时:XCHG是由处理器保证的原子指令,该指令的多次访存被保证有原子性。