2011-08-30 67 views
4

我正在嘗試使用CPUID,但附加了一些字符串。根據sandpile.org's CPUID page,如果MISC_ENABLE.LCMV標誌設置爲0,CPUID標準功能0000_0004h及以上纔會起作用。該標誌是型號專用寄存器(MSR)1A0的位22。顯然,這個限制是由於Windows NT中的一個錯誤(感謝讓我更容易,Microsoft;))。CPUID:爲什麼必須爲某些功能將MISC_ENABLE.LCMV設置爲0?我可以暫時覆蓋它嗎?

我可以測試LCMV標誌的存在下用CPUID 0000_0001h(ECX標誌,位3)。假設它存在,它究竟是什麼,爲什麼它對CPUID有這樣的影響? MSR 1A0是一個讀/寫寄存器還是隻讀?這樣的專用寄存器如何使用匯編代碼讀取/寫入?

如果寄存器在技術上是讀/寫,是安全的復位位22到0的CPUID指令的時間,使其恢復到原來的設置之前?或者,如果它設置不正確(即啓用),我是不是很容易被搞砸?

最後,sandpile使用措辭「只有當MISC_ENABLE.LCMV設置爲0時才啓用此級別。這是由於Windows NT的錯誤。」如果由於這個原因特別禁用了一堆標準級別,這是否會反映在CPUID級別0000_000h的eax寄存器的輸出中(支持的最高標準級別)?

呼...我認爲這就是它。

回答

4

您將要下載Intel® 64 and IA-32 Architectures Software Developer’s Manuals,因爲它包含了所有的請求的信息。

我可以測試CPUID 0000_0001h(ecx標誌,位3)的LCMV標誌的存在。假設它存在,它究竟是什麼,爲什麼它對CPUID有這樣的影響?

標誌的全名(參見Vol. 3B B-17)是「限制CPUID MaxVal最大值」和狀態其效果爲「當此位被設置爲1,CPUID.00H返回EAX最大值[7:0] 3「。

MSR 1A0是讀/寫寄存器還是隻讀?

根據英特爾手冊的讀/寫(有一個警告,請繼續閱讀)。

這樣的專用寄存器如何使用匯編代碼讀寫?

你閱讀使用RDMSR(卷2B 4-301),並使用WRMSR寫(卷2B 4-505),但請注意,需要您在任何實模式或0級特權運行(又名內核模式)。

如果寄存器在技術上是讀/寫,是安全的復位位22到0的CPUID指令的時間,使其恢復到原來的設置之前?或者,如果它設置不正確(即啓用),我是不是很容易被搞砸?

它應該只能在buggy操作系統上設置,在那裏你不應該清除它。如果你正在編寫你自己的內核,那麼你可以繼續並清除它,因爲你自己聲明它只適用於NT和類似情況的bug版本。

最後,sandpile使用措辭「只有當MISC_ENABLE.LCMV設置爲0時才啓用此級別。這是由於Windows NT的錯誤。」如果由於這個原因特別禁用了一堆標準級別,這是否會反映在CPUID級別0000_000h的eax寄存器的輸出中(支持的最高標準級別)?

是的,它是專門設計來迫使它返回3在這種情況下(見上面的描述)。

+0

太棒了。非常感謝!你的答案實際上也是最好的情況,因爲這意味着這個位不會被設置,除非它真的需要,例如,在Windows NT中。我擔心它表示一些(主要是正交的)處理器功能被激活,而這在Windows NT上發生的並不是CPUID。我很高興,情況並非如此。 :) –

2

我只有一點添加到上面給出的非常全面的答案。 (我會增加一條,作爲一個評論,但我不能添加評論。)一位英特爾工程師https://software.intel.com/en-us/forums/topic/306523?language=en#comment-1590394提供關於這一問題的幾個歷史細節從那裏報價與少量格式/拼寫修正:

某些BIOS版本具有菜單設置,允許用戶限制CPUID在下次重新啓動後支持的最大值(或葉索引)。 BIOS提供此選項僅用於允許最終用戶解決Microsoft Windows * NT 4.0安裝問題,因爲Windows NT 4.0的安裝程序有一個錯誤,並且如果CPUID報告它支持更高超過3.啓用BIOS選項來限制CPUID EAX maxvalue僅用於安裝Windows NT 4.0的目的。在所有其他情況下,BIOS應配置爲不限制CPUID EAX max值。

當CPUID受限於支持不高於3的限制時,在Intel Pentium 4和更高版本的處理器上,第3頁也不受支持,因此請求CPUID報告第4頁將從CPUID接收數據在葉2(最高葉指數)上。當軟件使用無效的EAX輸入值(即葉索引)執行CPUID時,CPUID將報告它在當前運行時配置下支持的最高葉。

此外,所討論的MSR標誌被稱爲64和IA-32架構軟件開發人員手冊的「IA32_MISC_ENABLE.BOOT_NT4 [位22]」在當前(六月2014)版。我懷疑他們決定在某些時候重新命名它,以便更明顯地表明它是一個遺留問題,現在可以安全地忽略。

相關問題