Как мне вывести выходные данные этого регистра MSR - IA32_VMX_PROCBASED_CTLS2, чтобы узнать, поддерживается/включен ли неограниченный гостевой режим?
Контекст — это любопытство.
Я знаю, что Docker в случае Mac OSX, а может быть и в случае Windows, требует неограниченного режима / неограниченного гостевого режима.
И я прочитал
https://software.intel.com/en-us/forums/virtualization-software-development/topic/277958
«Существует ряд MSR, которые сообщают, поддерживает ли данный ЦП настройку «1» неограниченного гостя и ряд других функций виртуализации. Конкретный MSR — IA32_VMX_PROCBASED_CTLS2, и я полагаю, что неограниченный гость — это бит 7 в поле VMCS управления вторичным процессом».
я не знаю, покажут ли это powershell или wmic. Я знаю, что в win7 32bit есть отладка (которая, возможно, может это показать? знаю, что отладка может показывать некоторые регистры, я однажды использовал отладку, чтобы переместить значение в регистр AX), хотя у меня win7 64bit, и там отладки нет.
Может быть, кто-то, кто немного знает ассемблер, сможет показать, какой ассемблер нужно установить и какие строки запустить, чтобы отобразить биты этого регистра?
Я не настолько хорошо разбираюсь в ассемблере, чтобы задавать вопросы на StackOverflow, потому что на данном этапе я подхожу к этому вопросу с точки зрения «суперпользователя».
решение1
Я предполагаю, что в Windows есть какой-то инструмент для чтения и записи MSR, как и в Linux.msr-инструменты. Инструмент дает вам две команды rdmsr
и wrmsr
. Можно прочитать значение MSR с помощью rdmsr
команды. Вотсвязьк одному такому инструменту для Windows.
Существует два элемента управления выполнением VM для процессорного выполнения — элементы управления выполнением VM на основе первичного процессора ( IA32_VMX_PROCBASED_CTLS
) и элементы управления выполнением VM на основе вторичного процессора ( IA32_VMX_PROCBASED_CTLS2
). Бит неограниченного гостевого режима является частью IA32_VMX_PROCBASED_CTLS2
(как уже упоминалось в вопросе). Элемент управления выполнением VM на основе вторичного процессора доступен только тогда, когда бит 63 равен IA32_VMX_PROCBASED_CTLS
1. (См. раздел 24.6.2 вИнтел СДМ)
Итак, нам нужно сначала прочитать IA32_VMX_PROCBASED_CTLS
с помощью rdmsr
и проверить, равен ли бит 63 1 или нет. Если значение бита равно1затем прочитайте, IA32_VMX_PROCBASED_CTLS2
используя ту же команду.
Адреса обоих MSR следующие:
IA32_VMX_PROCBASED_CTLS - 482H
IA32_VMX_PROCBASED_CTLS2 - 48BH
Команда в Linux:
sudo rdmsr 0x482 // To read IA32_VMX_PROCBASED_CTLS
sudo rdmsr 0x48B // To read IA32_VMX_PROCBASED_CTLS2
Вывод команды rdmsr
осуществляется в шестнадцатеричном формате, и мы можем вручную преобразовать его в двоичный формат или воспользоваться для этого каким-либо онлайн-инструментом.
Теперь нам нужно проверить бит для неограниченного гостя, IA32_VMX_PROCBASED_CTLS2
а для этого нам нужно проверить бит в позиции 7 (как показано на следующем рисунке).
Добавляю полную IA32_VMX_PROCBASED_CTLS2
структуру на всякий случай, если вы захотите проверить и другие варианты.