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

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

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

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

Фух ... Думаю, дело в этом.

4
Mike S 30 Авг 2011 в 10:59

2 ответа

Лучший ответ

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

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

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

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 в этом случае (см. Описание выше).

5
user786653 30 Авг 2011 в 15:44

Мне нужно лишь немного добавить к исчерпывающему ответу, данному выше. (Я бы добавил это как комментарий, но пока не могу добавлять комментарии.) Инженер 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 для ограничения максимального значения EAX CPUID до 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. Я подозреваю, что они решили переименовать его в какой-то момент, чтобы сделать более очевидным, что это устаревшая проблема, которую в настоящее время можно спокойно игнорировать.

3
Community 20 Июн 2020 в 09:12