Как надежно определить максимальные дополнительные уровни 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 поддерживаются те же два диапазона, но некоторые биты могут изменить свое значение; затем для других поставщиков вы можете посмотреть их собственные диапазоны в соответствии с их документацией.

Другие вопросы по тегам