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。

相關文章
相關標籤/搜索