Как надежно определить максимальные дополнительные уровни CPUID?
Я хотел бы запросить функции процессора, используя cpuid
инструкция. Я заинтересован во всех дополнительных уровнях CPUID, в том числе 0x80000000
а также 0xc0000000
(Centaur). Проблема в том, что я не вижу четкого способа определить, поддерживается ли определенный уровень.
В частности, меня беспокоит этот конкретный фрагмент из Руководства разработчика программного обеспечения для архитектуры Intel(R) 64 и IA-32:
Возвращаются два типа информации: основная и расширенная информация о функциях. Если значение, введенное для CPUID.EAX, больше, чем максимальное входное значение для базовой или расширенной функции для этого процессора, тогда возвращаются данные для наивысшего базового информационного листа.
Это означает, что если я сделаю запрос cpuid
с EAX = 0x80000000
или же EAX = 0xc0000000
Я могу получить максимальный уровень CPUID в EAX
или вывод для некоторого случайного базового уровня листа.
Существует ли надежный и относительно простой способ определения того, поддерживается ли определенный уровень?
1 ответ
Вам следует начать с определения идентификации поставщика процессора (12-символьная текстовая строка на уровне 0), а затем продолжить, основываясь на этом значении. Для Intel поддерживаются два диапазона уровней, начиная с 0 и 0x80000000 (первый - родной Intel, а второй - какой-то вариант совместимости с AMD); для AMD поддерживаются те же два диапазона, но некоторые биты могут изменить свое значение; затем для других поставщиков вы можете посмотреть их собственные диапазоны в соответствии с их документацией.