Вам нужно будет загрузить Руководства разработчика программного обеспечения 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 в этом случае (см. Описание выше).