SHUTDOWN AP CPU后续

启动顺序对于不一样的CPU是不一样的。 英特尔的系统程序员手册包含了英特尔至强处理器的初始化协议,不包括较旧的CPU。 对于通用的“全部CPU类型”算法,请参阅英特尔的多处理器规范。程序员

对于80486(APIC是外部82489DX),必须在使用INIT IPI后使用“INIT level de-assert”IPI,而不须要任何SIPI。 这意味着你不能告诉他们哪里开始执行(SIPI的向量部分),而且它们老是开始执行BIOS代码。 在这种状况下,要将BIOS的CMOS复位值设置为“以远跳进行热启动("warm start )”(即将CMOS位置0x0F设置为0xa),以便BIOS将执行一个jmp far ptr [0:0x0469] “,而后将AP入口点的段和偏移量填写到【0:0x0469】。 (使用82489DX的CPU在接收到INIT IPI时重置,并开始执行BIOS代码,该代码检查关机代码并跳转到热复位向量。)可以使用这种方法启动和中止AP CPU的 ,CPU类型大概是奔腾75及之前的CPU,大概就是这样。(这个方法也是286从保护模式返回实模式的方法,在386,486还能够利用这个办法检查CPU类型)。算法

较新的CPU(Pentium 4和Intel Xeon)不支持“INIT level de-assert”IPI,在这些CPU上发布这个IPI CPU会产生APIC ERROR,ERROR STATUS 寄存器会提示接收到无效中断,但这不影响CPU继续执行下一条指令,基本上能够看作CPU是忽略这个IPI!ide

内置APIC的CPU(奔腾有一部分有内置APIC),INIT IPI是一个内部的信号,所以不会去执行BIOS代码(这是我猜想的,狠屡次实验代表在发送INIT IPI后 CPU只能接收SIPI而不会按照286从保护模式返回实模式的方式去执行代码)。所以在有内置APIC的CPU上shutdown AP CPU,只能是发布INIT IPI,在AMD手册上也说明了发布INIT IPI后,CPU只接收SIPI,其余的IPI都忽略!(BOCHS 在发布INIT IPI后将CPU是放在地址:0XFFFF_FFF0处的!实机也是如此cs:ip= 0xf000:0xfff0,INIT IPI发布后个寄存器的值在INTEL手册上能查到)ui

 MP规范规定AP应经过INIT-SIPI-SIPI启动,对于较新的CPU(P6,Pentium 4以及如今的I7),一个SIPI就能够了。AMD的A10 一样也能够。第二个SIPI能够看作是冗余,用来对付启动失败。ip

前几天找到之前下载的PDF,发现一本ci

MultiprocessorSpecification
Version 1.1
September 1994it

在这本手册的Appendix B Operating System Programming Guidelinesio

详细说明了INIT IPI和 STARTUP IPI:sed

B.4.1 INIT IPI With Warm Reset
This startup technique is used with systems based on the 82489DX APIC.
B.4.2 STARTUP IPI
This startup technique is used with systems based on version 1.x or higher of the local APIC.
These APICs recognize the STARTUP IPI, which is an APIC Interprocessor Interrupt with trigger
mode set to edge and delivery mode set to “110” (bits 8 through 10 of the interprocessor interrupt
register).sso

而shutdown cpu和启动AP CPU是同一种IPI 也即上面那2种,第一种只适合82489DX APIC,这已经被淘汰了,所以现代CPU shutdown只能用SIPI。

相关文章
相关标签/搜索