CPUID: почему MISC_ENABLE.LCMV должен быть установлен в 0 для некоторых функций? Могу ли я временно перезаписать его? - PullRequest
4 голосов
/ 30 августа 2011

Я пытаюсь использовать CPUID, но есть несколько прикрепленных строк.Согласно странице CPUID *1001* sandpile.org стандартные функции CPUID 0000_0004h и выше будут работать, только если для флага MISC_ENABLE.LCMV установлено значение 0. Этот флаг является битом 22 регистра конкретной модели (MSR) 1A0.По-видимому, это ограничение связано с ошибкой в ​​Windows NT (спасибо, что облегчили мне задачу, Microsoft;)).

Я могу проверить наличие флага LCMV с CPUID 0000_0001h (ecx flags, bit3).Предполагая, что он присутствует, зачем он нужен и почему он так влияет на CPUID?Является ли MSR 1A0 регистром чтения / записи или только для чтения?Как такой регистр специального назначения даже может считываться / записываться с использованием ассемблерного кода?

Если регистр технически считывается / записывается, безопасно ли сбрасывать бит 22 в 0 на время выполнения инструкции CPUID,прежде чем восстановить его к первоначальной настройке?Или я в значительной степени облажался, если он установлен неправильно (то есть включен)?

Наконец, sandpile использует формулировку: «Этот уровень активен, только если MISC_ENABLE.LCMV установлен в 0. Этоиз-за ошибки Windows NT. "Если по этой причине специально отключено несколько стандартных уровней, будет ли это отражено в выходных данных регистра eax уровня CPUID 0000_000h (максимальный поддерживаемый стандартный уровень)?

Фу ... Думаю, это все.

Ответы [ 2 ]

5 голосов
/ 30 августа 2011

Вам нужно будет загрузить Руководства разработчика программного обеспечения Intel® 64 и IA-32 Architectures , поскольку оно содержит всю запрашиваемую информацию.

Я могу проверить наличие флага LCMV с CPUID 0000_0001h (флаги ecx, бит 3). Предполагая, что он присутствует, зачем он нужен и почему он так влияет на CPUID?

Полное имя флага (см. Том 3B B-17 ) - «Ограничение CPUID MaxVal» и его действие определяется как «Когда этот бит установлен в 1, CPUID.00H возвращает максимум значение в EAX [7: 0] из 3 ".

Является ли MSR 1A0 регистром чтения / записи или только для чтения?

Чтение / запись в соответствии с руководством Intel (с одним предупреждением, читайте дальше).

Как такой регистр специального назначения даже считывается / записывается с использованием ассемблерного кода?

Вы читаете, используя RDMSR (Том 2B 4-301), и пишете, используя WRMSR (Том 2B 4-505), но имейте в виду, что они требуют, чтобы вы работали в реальном режиме или на уровне привилегий 0 (иначе режим ядра).

Если регистр технически предназначен для чтения / записи, безопасно ли сбрасывать бит 22 в 0 на время выполнения инструкции CPUID, прежде чем восстанавливать его в исходное значение? Или я в значительной степени облажался, если он установлен неправильно (т.е. включен)?

Это действительно должно быть установлено только на ошибочных операционных системах, и там вы не должны очищать его. Если вы пишете свое собственное ядро, во что бы то ни стало, продолжайте и очищайте его, поскольку вы сами заявляете, что это только для ошибочных версий NT и подобных обстоятельств.

Наконец, sandpile использует формулировку: «Этот уровень включается только в том случае, если для MISC_ENABLE.LCMV установлено значение 0. Это связано с ошибкой Windows NT». Если набор стандартных уровней специально отключен по этой причине, будет ли это отражено в выходных данных регистра eax уровня CPUID 0000_000h (максимально поддерживаемый стандартный уровень)?

Да, он специально разработан, чтобы заставить его возвращать 3 в этом случае (см. Описание выше).

3 голосов
/ 11 июля 2014

У меня есть только немного, чтобы добавить к очень полному ответу, приведенному выше.(Я бы добавил его в качестве комментария, но пока не могу добавлять комментарии.) Инженер Intel предоставил еще несколько исторических подробностей по этому вопросу на 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 до 3 требуется только для цели установки Windows NT 4.0.Во всех остальных ситуациях BIOS должен быть настроен так, чтобы не ограничивать максимальные значения CPUID EAX.

Когда CPUID ограничен ограничением, которое поддерживает не более листьев, чем 3, на процессоре Intel Pentium 4 и новее, лист 3 [также] не поддерживается, поэтому запрос CPUID для отчета листа 4 получит данныеиз CPUID на листе 2 (самый высокий индекс листа).Когда программное обеспечение выполняет CPUID с недопустимым входным значением EAX (т. Е. Индекс листа), CPUID сообщает о максимальном листе, который он поддерживает в текущей конфигурации времени выполнения.

Кроме того, рассматриваемый флаг MSRназывается «IA32_MISC_ENABLE.BOOT_NT4 [бит 22]» в текущей (июнь 2014 г.) редакции Руководства разработчика программного обеспечения для архитектуры Intel® 64 и IA-32.Я подозреваю, что они решили переименовать его в какой-то момент, чтобы сделать более очевидным, что это унаследованная проблема, которую можно безопасно игнорировать в настоящее время.

...