題 微代碼如何加載到處理器?


我讀到每次重啟時微處理器都會加載到處理器中。它駐留在閃存上,當機器啟動時,它會被複製到CPU。或者在Linux的情況下,OS本身俱有處理器的微代碼副本。 但是如何將微碼複製到處理器? 所有數據都在CPU的同意下在計算機中移動。 CPU以機器語言給出指令。 由於微碼對於執行這些機器語言指令是必不可少的,因此如果處理器中沒有微碼,那麼CPU如何進行訪問閃存和進行後續操作的指令呢? 這是否意味著硬連線非微編碼指令以實模式複制微碼?


4
2017-07-01 21:53


起源


“我讀到每次重啟都會在處理器中加載微碼。”  - 您的來源/前提不正確。 - sawdust
@sawdust CPU微代碼確實在每次冷啟動時加載,可以在系統BIOS或操作系統的早期啟動過程中加載。 - misha256
@ misha256 - “CPU微碼確實會在每次冷啟動時加載,”  - 這意味著雞或蛋的難題。你是否混淆了(可能) 更新 微生物與(據稱) 裝載 微碼?這兩者之間存在著天壤之別。 - sawdust
@sawdust好點。我需要更清楚。現代CPU配備 硬連線微碼。微碼 更新 然後根據需要由BIOS或OS應用。為此,CPU包含少量易失性“補丁”RAM。 - misha256
@Kraken你有點太迂腐了。 ROM編程 是 一種硬接線的形式。和 微碼 只是另一個概念抽象層(很多)。如果需要,您可以將微碼放入RAM,ROM或“直接在電路上蝕刻”。不過,它仍然是微碼 怎麼樣 你在CPU中實際實現它。 - misha256


答案:


我讀到每次重啟時微處理器都會加載到處理器中。

BIOS可以在引導期間發出微代碼更新。操作系統也可以。  通常需要這些更新,尤其是對於以後的Intel CPU。

它駐留在閃存上,當機器啟動時,它會被複製到CPU。或者在Linux的情況下,OS本身俱有處理器的微代碼副本。但是如何將微碼複製到處理器?

現代英特爾和CPU有一種稱為“模型特定寄存器”的機制,以及用於讀取(RDMSR)和寫入它們的特殊CPU指令(WRMSR)。雖然這些寄存器會影響CPU設置,但使用新微碼的地址寫入特定的寄存器會告訴CPU讀取內存區域並應用現有的微碼。

所有數據都在CPU的同意下在計算機中移動。 CPU以機器語言給出指令。由於微碼對於執行這些機器語言指令是必不可少的,因此如果處理器中沒有微碼,那麼CPU如何進行訪問閃存和進行後續操作的指令呢?

總有一個微碼。上面的機制更新了微碼。英特爾/ AMD並沒有真正發布它的工作原理細節,它們只提供更新機制。顯然,它正在將ROM微碼複製到某種CPU內部存儲器。但是CPU啟動時會有一些微碼。一些最近的英特爾和可能的AMD CPU在啟動後無法通過BIOS完成微代碼更新後可靠工作,但顯然它們將能夠很好地運行以執行初始微代碼更新。

這是否意味著硬連線非微編碼指令以實模式複制微碼?

初始微碼設置由CPU內部完成,並且不執行任何指令來實現該目的。它是在執行第一條CPU指令之前設置的。

要更新BIOS,必須執行相應的RDMSR和WRMSR指令。

參考:“此指令必須在特權級別0或實地址模式下執行;否則,將生成一般保護異常#GP(0)。”如果它不是在實模式下執行,則必須在環0或內核模式下完成。您可以隨時更新微碼。


6
2018-04-20 21:24



感謝您首先閱讀我的錯誤的年份問題。您的答案非常精確且充滿洞察力。 +1。再次感謝。 - Kraken


現代CPU已經安裝了完整的微碼。該微碼位於CPU本身的特殊ROM區域,無法更改/擦除。因此,CPU可以開箱即用。

然後,系統BIOS和/或操作系統可以啟動微碼的加載 更新 進入CPU。這樣的更新是  一個完整的微碼,而不是一個小補丁來解決錯誤。為此,CPU包含一小塊易失性RAM。

一個有用的參考: https://www.dcddcc.com/pubs/paper_microcode.pdf


8
2017-07-01 23:34



硬連線,如“由邏輯構成並蝕刻在電路上”或“存在於永久存儲器中,隨時可執行”。 - 因為如果它們是硬連線的,它們就不應該被標記為微碼。 - Kraken
“現代CPU具有硬連線微碼”  - 這是一個矛盾的說法,因為它與“微編碼”(又稱微編程)相比是“硬連線”。更好的描述符可能是“內置的”。 - sawdust
什麼? “內置”微碼,存在於CPU內部的非易失性存儲器中。還是內置的硬連線組合邏輯系統? - Kraken
@ misha256有哪些簡單的指令直接由硬件執行? - Kraken
@Kraken像任何復雜的系統一樣,CPU設計包含許多層。但最終,所有層都被視為一個整體 硬件。例如,在設計CPU時,您可能會將這樣的內容分開:邏輯/門層 - >微操作層 - >微指令層 - >微代碼層, - >機器碼層。這些層是 概念上的 而不是身體上的。完成設計後,您可以自由地按照自己喜歡的方式實現這些圖層。最後,一切都以矽片硬連線。包括微碼。 - misha256


問題不明確。現代x86 / IA64 CPU中有許多“微代碼”,“微代碼補丁”和微代碼之間存在差異。

微代碼在其經典理解中(作為執行長CPU指令的逐步元素)幾乎可以肯定地融入矽片中,因為當新的矽片/ RTL時,沒有理由在多代CPU中保持不固定的錯誤。與每個新的製造節點一起編譯。

但是,所有最近的CPU都有幾個內部單元,由嵌入在x86 CPU芯片內的獨立微處理器控制。

最值得注意/眾所周知的是所謂的 “P-unit”,一個處理器 它控制CPU的動態電源管理。隨著CPU晶體管的進一步小型化,核心頻率上升並且洩漏增加,將功率保持在合理限制的唯一方法是積極的時鐘節流和動態功率門控。問題是CPU可以執行各種各樣的軟件代碼,並且每個都達到一定的功耗峰值。在CPU最終確定零售時,可能不知道某些“電源病毒”模式,並且必須糾正管理算法的一些參數。這是通過專用的“微代碼補丁”完成的。

還有幾種這樣的微處理器可以控制其他CPU塊 喜歡圖形 和記憶。

修補過程的細節是絕密,以防止惡意干擾。這是一些 黑客的報告 試圖對機制進行逆向工程。

簡而言之,x86架構微碼未加載到現代CPU中,但各種輔助嵌入式微處理器的微碼可以有補丁。


3
2018-01-22 22:19





微代碼更新僅是對現有CPU微碼的補丁,該微碼永久地刻錄到ROM中。 CPU具有永久ROM和可以包含新代碼的補丁RAM。 RAM中還有一個“匹配”值表。該表有一個ROM的每個可修補部分的條目。當CPU執行可修補指令時,它會檢查該表。如果有條目,則它使用RAM中的代碼。如果它具有默認值,則跳轉到ROM。因此,要修補CPU,必須將新代碼上載到RAM,然後適當地修改匹配表中的條目。執行此操作的過程大致如下:

  1. 清除EAX,使用CPUID讀取當前處理​​器簽名,並將匹配的微碼更新加載到內核內存中。

  2. 清除EAX和EBX,並使用修訂匹配特定寄存器中的RDMSR指令讀取當前的微碼修訂版。

  3. 使用WRMSR指令將微碼更新的存儲器地址寫入更新匹配特定寄存器。

  4. 閱讀新的微碼修訂版,如果匹配更新,則返回成功。否則,返回失敗。

在基於Linux的操作系統中,此過程由稱為“微代碼”的特定內核模塊在引導時完成。您可以閱讀此模塊的源代碼以查看確切的過程。

請注意,補丁文件具有記錄的標題,但補丁數據本身(實際代碼)由密鑰加密,該密鑰被硬編碼到處理器中。除非你知道這個密鑰,否則你無法編寫自己的補丁。


1
2018-01-08 04:47