Wie kann ich die Ausgabe dieses Registers, des MSR-IA32_VMX_PROCBASED_CTLS2, ausgeben, um zu sehen, ob der uneingeschränkte Gastmodus unterstützt/aktiviert ist?
Kontext ist Neugier.
Mir ist bewusst, dass Docker im Fall von Mac OSX und möglicherweise auch im Fall von Windows den uneingeschränkten Modus bzw. den uneingeschränkten Gastmodus erfordert.
Und ich lese
https://software.intel.com/en-us/forums/virtualization-software-development/topic/277958
„Es gibt eine Reihe von MSRs, die Ihnen mitteilen, ob eine bestimmte CPU die Einstellung ‚1‘ für uneingeschränkten Gast und eine Reihe anderer Virtualisierungsfunktionen unterstützt. Der spezifische MSR ist IA32_VMX_PROCBASED_CTLS2 und ich glaube, uneingeschränkter Gast ist Bit 7 im VMCS-Feld für sekundäre Prozesssteuerungen.“
ich weiß nicht, ob Powershell oder WMIC es anzeigen. Ich weiß, dass Win7 32bit über Debug verfügt (was es möglicherweise anzeigen könnte? Ich weiß, dass Debug einige Register anzeigen kann. Ich habe Debug einmal verwendet, um einen Wert in das AX-Register zu verschieben), aber ich verwende Win7 64bit und das hat kein Debug.
Vielleicht kann jemand, der sich ein wenig mit Assembler auskennt, zeigen, welchen Assembler man installieren muss und welche Zeilen man ausführen muss, um die Bits dieses Registers anzuzeigen?
Ich kenne mich mit Assembler nicht so gut aus, dass ich bei Stackoverflow nachfragen könnte, da ich das derzeit aus der Perspektive eines „Superusers“ angehe.
Antwort1
Ich gehe davon aus, dass es unter Windows ein Tool zum Lesen und Schreiben von MSRs gibt, so wie es auch eines für Linux gibt.msr-werkzeuge. Das Tool bietet Ihnen zwei Befehle rdmsr
und wrmsr
. Mit dem Befehl können Sie den Wert der MSRs lesen rdmsr
. Hier istVerknüpfungzu einem solchen Tool für Windows.
Es gibt zwei VM-Ausführungskontrollen für die prozessorbasierte Ausführung: Primäre prozessorbasierte VM-Ausführungskontrollen ( IA32_VMX_PROCBASED_CTLS
) und sekundäre prozessorbasierte VM-Ausführungskontrollen ( IA32_VMX_PROCBASED_CTLS2
). Das Bit für den uneingeschränkten Gastmodus ist ein Teil davon IA32_VMX_PROCBASED_CTLS2
(wie bereits in der Frage erwähnt). Die sekundären prozessorbasierten VM-Ausführungskontrollen sind nur verfügbar, wenn Bit 63 von IA32_VMX_PROCBASED_CTLS
1 ist. (Siehe Abschnitt 24.6.2 inIntel SDM)
Wir müssen also zuerst lesen IA32_VMX_PROCBASED_CTLS
und rdmsr
prüfen, ob Bit 63 1 ist oder nicht. Wenn der Bitwert1dann IA32_VMX_PROCBASED_CTLS2
mit demselben Befehl lesen.
Die Adressen für beide MSRs lauten wie folgt:
IA32_VMX_PROCBASED_CTLS - 482H
IA32_VMX_PROCBASED_CTLS2 - 48BH
Befehl unter Linux:
sudo rdmsr 0x482 // To read IA32_VMX_PROCBASED_CTLS
sudo rdmsr 0x48B // To read IA32_VMX_PROCBASED_CTLS2
Die Ausgabe des rdmsr
Befehls erfolgt im Hexadezimalformat und wir können sie manuell ins Binärformat umwandeln oder hierfür ein Onlinetool verwenden.
Jetzt müssen wir das Bit für den uneingeschränkten Gast überprüfen IA32_VMX_PROCBASED_CTLS2
und dazu müssen wir das Bit an Position 7 überprüfen (wie im folgenden Bild gezeigt).
Hinzufügen der vollständigen IA32_VMX_PROCBASED_CTLS2
Struktur, nur für den Fall, dass Sie auch andere Optionen prüfen möchten.