Как мне вывести выходные данные этого регистра MSR - IA32_VMX_PROCBASED_CTLS2, чтобы узнать, поддерживается/включен ли неограниченный гостевой режим?

Как мне вывести выходные данные этого регистра MSR - IA32_VMX_PROCBASED_CTLS2, чтобы узнать, поддерживается/включен ли неограниченный гостевой режим?

Как мне вывести выходные данные этого регистра 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_CTLS1. (См. раздел 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структуру на всякий случай, если вы захотите проверить и другие варианты.

введите описание изображения здесь

Связанный контент