在當今的計算世界,獲取處理器的詳細信息變得異常簡單,這主要歸功於CPUID指令的引入。在1993年,Intel首次推出Pentium和SL增強型486處理器時,這一功能應運而生,使程序員能夠輕鬆查詢處理器類型及其支持的特性,如MMX和SSE等。在CPUID指令普及之前,程序設計者使用一些獨特的方法來識別處理器的類型,這在當時是一場技術上的探險。
在CPUID推出之前,程序員依賴於一些被視為秘而不宣的機器碼來發掘CPU行為中的微小差異。
隨著80386處理器的推出,處理器在重啟時透過EDX寄存器來指示其版本。但是,這一信息只有在重啟後才能得到,而當時並沒有標準方法供應用程序直接讀取這一值。這意味著程序設計者不得不使用各種不尋常的手段來識別不同的CPU。舉例來說,Motorola的680x0系列處理器就從未擁有任何CPUID指令。開發者必須使用一些特定的指令來判斷處理器的類型,這些指令需要特權執行。在這樣的背景下,68010處理器將MOVE指令從狀態寄存器標記為特權,這使其能夠符合虛擬化需求。
CPUID指令的出現,不僅為x86架構的程序員提供了便利,還對其他架構的設計如ARM也有影響,這些架構通常提供與CPUID相似的寄存器,用以獲得處理器的基本資訊。
CPUID中的操作代碼為0F A2。通常在組合語言中,CPUID指令不需要參數,因為它隱含使用EAX寄存器來決定返回信息的主要類別。這個呼叫被稱為CPUID的“葉子”。根據Intel的術語,第一個調用CPUID時,EAX應設為0,以獲取CPU可支援的最高功能參數。
若要獲取擴展功能信息,則應將CPUID呼叫的EAX的最高位設置為1。
隨著通用計算的發展,目前有許多基於CPUID取得的基本葉子的有效範圍已達到23h。根據CPUID的調用,可獲得多種信息,如製造商ID以及各種處理器特性的支持情況。在許多情況下,返回的信息在公開文檔中未被披露,因此開發者需要依賴經驗和文獻來探索處理器的秘密。
當EAX設置為0時,CPU返回其製造商ID字符串—一個12字符的ASCII字符串,並依序存儲在EBX、EDX和ECX寄存器中。根據最新資料,標準的處理器製造商ID如下:
通過將EAX設置為1,可以獲得處理器的步進、型號和系列信息,這些信息對於判斷各個型號的性能至關重要。這代表著處理器標識,並在EAX、EDX和ECX寄存器中返回功能標誌和附加特性信息。
所有的處理器信息都是製造商特定的,但大多數情況下,Intel的值被其他廠商用於兼容性。
這種方式的出現使得開發者能夠清楚獲知處理器的物理層面,隨著時間的推移,這項技術越來越被廣泛應用,從而推動了整個計算技術的進步。此外,這也促進了多核心處理器的設計,促使後續的處理器架構不斷演進。
隨著處理器技術的不斷發展,CPUID指令的影響力愈加明顯,為各種程序和系統提供了重要的硬體信息。然而,隨著未來技術的深化,我們不禁要思考:隨著硬體的快速變化,未來的程序設計將如何能夠更智能地理解這些硬體特性和優化其性能呢?