cpu微命令(CPU Micro Code)
已有 689 次閱讀 2009-05-09 11:05 標籤: cpu Micro CPU 命令 Code 在十多年前的Pentium時代, INTEL曾經發布過有缺陷的CPU, 因為浮點運算表邊界上有幾個資料錯誤, 導致在某些應用會出現錯誤, 這個錯誤機率很小, 出錯幾率小於千萬分之一, 但在還是被捅出來了. INTEL為此召回CPU.
從Pentium Pro起, INTEL決定給CPU留出一個補丁介面, 當CPU內部有缺陷的時候, 通過載入微碼(Microcode), 可以修複CPU的部分缺陷.
INTEL說, 他們只測試過的CPU都是載入了微碼的, 如果沒有載入微碼, INTEL不保證會出現什麼問題.
現在的CPU有一個CPUID, 通過執行CPUID指令, 可以知道當前CPU的版本和Stepping. 根據這個資訊, 再給CPU打相應的補丁.
就是CPUID=06D2, Rev.A2
何時給CPU打補丁?
在給CPU初始化的時候, 就需要把INTEL提供的微碼寫進CPU去, 因此, 載入CPU微碼就是系統BIOS的任務.
如果系統的CPU是可更換的, 那麼其微碼也需要更換. 因此, 在BIOD裡, 一般要包進若干個ID的CPU微碼, 以便工廠安排不同的SKU出貨. 如果BIOS發布是在CPU發布之前, 那麼BIOS裡很可能就沒有包進最新的微碼, 這個系統要使用新CPU的時候, CPU微碼是無法載入的.
另外, BIOS ROM容量有限, 一個微碼補丁最小有2K, 如果平台相容的CPU很多, 則微碼數量是十分巨大的, 台式機某些主板可能相容20多個CPU版本, 那麼微碼的體積很大, BIOS雷根本包不下這麼多東西, 於是, 廠商不得不縮水, 去掉一些不常用的微碼. 這些不常用的微碼一般都是早期的CPU, 如DOTHAN早期的A STEPPING就很可能沒有對應的微碼包進你的本本中去.
不打補丁會有什麼問題?
INTEL說他們沒測過不打補丁的CPU, 也就不知道會出什麼問題. 呵呵, 這顯然, 他們不想說太多技術細節而已. 以俺的經驗, 如果不打補丁, 99.99%的時候, 使用者是感覺不到的, 除非問題特別突出. 只是俺遇到過幾個明顯的例子, 為此出了幾身汗. 有幾個案例:
1, 某Prescott CPU, 在台式機上發熱量特別大, 超出Design Point, 後來發現沒載入微碼, 加上微碼就正常了;
2, 某Pentium D CPU, 進WINDOWS XP會藍屏, 以安全模式進去後, 安裝一個SP2補丁, 就正常了. 後來查出, 也是微碼沒載入;
3, 某Pentium M架構CPU, 在使用CPU內部TSC時, 發現測出的CPU內部頻率高出實現的4倍, 如2GHz CPU測出卻有8GHz, 後查, 也是沒載入微碼造成的異常.
此類案例很多, 特別是Core架構CPU, 不但微碼必須載入, 而且要求儘早載入, 否則, 連BIOS都跑不完, 系統就掛了. 但是INTEL但至今沒有任何官方對每個CPU微碼版本進行描述的檔案.
怎麼檢查CPU微碼是否載入?
載入微碼後, 在CPU的MSR(機器特定寄存器)裡可以讀出版本號碼. INTEL IA-32編程手冊上給出標準檢查方法:
MOV ECX, 008bh
XOR EAX, EAX
XOR EDX, EDX
WRMSR ;向MSR 8BH寫0, 清除MSR中的資訊
MOV EAX, 0001
CPUID ;讀CPUID, 讓CPU查看微碼版本, 並把微碼版本送到MSR 8B中
MOV ECX, 008bh
RDMSR ;讀出當前CPU微碼版本
執行上面的代碼後, 如果EDX的值為0, 則說明你的CPU微碼是沒有沒載入的, 你的CPU運行在有缺陷的狀態. 如果不為0, 則顯示的是當前微碼版本號碼
以上代碼可以在DOS環境下, 用DEBUG32調試介面執行.