Как надежно определить максимальные дополнительные уровни CPUID?

Я хотел бы запросить характеристики ЦП с помощью инструкции cpuid. Меня интересуют все дополнительные уровни CPUID, включая 0x80000000 и 0xc0000000 (Centaur). Проблема в том, что я не вижу четкого способа определить, поддерживается ли тот или иной уровень.

В частности, меня беспокоит именно этот бит из Руководство разработчика программного обеспечения для архитектур Intel (R) 64 и IA-32:

Возвращаются два типа информации: базовая и расширенная информация о функциях. Если значение, введенное для CPUID.EAX, выше, чем максимальное входное значение для базовой или расширенной функции для этого процессора, то возвращаются данные для наивысшего основного информационного листа.

Это означает, что если я запрашиваю cpuid с помощью EAX = 0x80000000 или EAX = 0xc0000000, я могу либо получить максимальный уровень CPUID в EAX, либо вывести какой-то случайный лист базового уровня.

Есть ли надежный и относительно простой способ определить, поддерживается ли тот или иной уровень?


person Michał Górny    schedule 13.07.2015    source источник


Ответы (1)


Вам следует начать с определения идентификатора производителя процессора (12-символьная текстовая строка на уровне 0), а затем продолжить, основываясь на этом значении. Для Intel поддерживаются два диапазона уровней, начиная с 0 и 0x80000000 (первый - собственный Intel, а второй - некоторый набор параметров для совместимости с AMD); для AMD поддерживаются те же два диапазона, но некоторые биты могут изменять свое значение; тогда, для других поставщиков, вы можете посмотреть их собственные диапазоны в соответствии с их документацией.

person Netch    schedule 13.07.2015