Cpuid (cpu identification)

Оскільки архітектура Intel розвивається з додаванням нових поколінь і моделей процесорів (8086, 8088, що Intel286, Intel386, Intel486, процесори Pentium, процесори Pentium OverDrive, процесори Pentium з технологією MMX, процесори Pentium OverDrive з технологією MMX, процесори Pentium Pro, а також: Pentium II, Pentium II Xeon, Pentium II Overdrive, Intel Celeron, Mobile Intel Celeron, Pentium III, Mobile Intel Pentium III - M, Pentium III Xeon, Pentium 4. Mobile Intel Pentium 4 - M, Intel Xeon and Intel Xeon MP), важливо , щоб Intel надавав кошти, за допомогою яких програмне забезпечення може ідентифікувати характеристики кожного процесора. Цей ідентифікаційний механізм розвинувся в поєднанні з архітектурою Intel наступним чином:

Еволюція процедури ідентифікації процесора була необхідна, тому що, оскільки архітектура Intel поширюється, ринок IT-технологій повинен був бути готовий до налаштування функціональності процесора на тлі безлічі поколінь і моделей, що мають різний набір характеристик. Чекаючи, що така тенденція поширитися і на майбутні покоління процесорів, нововведення в архітектуру Intel CPUID інструкція розширювана. З огляду на сильні сторони інструкції CPUID, розробники можуть створювати додатки і інструменти, які можуть використовуватися спільно незважаючи на багату різноманітність поколінь процесорів Intel в минулому, сьогоденні і майбутньому. [1]

Перевірка можливості виконання CPUID інструкції

Сімейство процесори Intel486 і наступні процесори надають прямий метод для того, щоб визначити, чи підтримує внутрішня архітектура процесора CPUID інструкцію. Цей метод використовує спеціальний прапор ID, що знаходиться в 21 бите регістру EFLAGS. Якщо програма зможе змінити значення цей прапора, то процесор підтримує CPUID інструкцію, інакше - не підтримує. Цей біт проілюстрований нижче.

Cpuid (cpu identification)

Рис.1. 21 біт в різних типах процесорів

Результат роботи CPUID інструкції

Cpuid (cpu identification)

Рис.2 Результати виконання інструкції CPUID

Інструкція CPUID підтримує два набори функцій. Перший набір функцій повертає базову інформацію про процесор. За допомогою другого набору можна отримати додаткову інформацію про процесор. На малюнку 2 проілюстровано те, яка базова інформація про процесор може бути отримана і де вона зберігається. Вихідні дані інструкції CPUID повністю залежні від змісту регістра EAX. Це означає, що, розміщуючи різні значення в регістр EAX, а потім виконуючи інструкцію CPUID, інструкція CPUID виконує певну функцію в залежності від того, яке значення було поміщено в регістр EAX (див. Таблицю 1). Щоб визначити максимально допустимий вхідний значення регістра EAX і функцій CPUID, які повертають базову інформацію про процесор, програму слід встановити значення параметра регістра EAX в нульове, а потім виконати інструкцію CPUID наступним чином:

Після виконання інструкції CPUID повертається значення буде присутній в регістрі EAX. Завжди використовуйте значення EAX, яке більше або дорівнює нулю і менше або дорівнює максимально допустимого значення EAX.

Щоб визначити максимально допустимий вхідний значення регістра EAX і функцій CPUID, які повертають додаткову інформацію, програми слід встановити значення параметра регістра EAX, рівне 80000000h а потім виконати інструкцію CPUID наступним чином:

Після виконання інструкції CPUID повертається значення буде в регістрі EAX. Завжди використовуйте значення параметра регістра EAX, яке більше або дорівнює 80000000h і менше або дорівнює максимального допустимого значення EAX. На сьогоднішніх і майбутніх IA-32 процесорах 31 біт в регістрі EAX буде очищений, коли виконається CPUID з вхідним параметром, більшим, ніж максимальне значення для будь-якого набору функцій, і коли розширені функції не підтримуються. Всі інші значення бітів, які повертаються процесором у відповідь на інструкцію CPUID зі значенням в EAX більше відповідного для цього процесора, є унікальними для даної моделі і не рекомендується їх змінювати.

ідентифікатор виробника

На додаток до повернення максимально допустимого значення в регістрі EAX одночасно може бути також перевірений ідентифікатор виробника Intel. Якщо регістр EAX містить на вході нуль, то інструкція CPUID також повертає ідентифікатор виробника в EBX, EDX і ECX регістрах (див. Рисунок 2). Ці регістри містять рядок ASCII: GenuineIntel.

У той час як будь-який імітатор архітектури Intel може підтримати інструкцію CPUID, жодні з них не може претендувати на те, що він є справжньою частиною Intel. Таким чином, присутність рядки GenuineIntel є гарантією того, що інструкція CPUID і ідентифікатор реалізовані відповідно до документа, що містить опис процесорів Intel і інструкції CPUID. Якщо така рядок не з'явилася після виконання інструкції, не покладайтеся на інформацію в цьому документі для інтерпретації інформації, повернутої інструкцією CPUID.

Таблиця 1. Інформація, яка повертається інструкцією CPUID

Початкове значення EAX

Надана інформація про процесор

EAX, EBX, ECX, EDX Продовження рядка бренду

Процесорна ідентифікаційна підпис

Починаючи з сімейства процесорів Intel486, регістр EDX містить ідентифікаційну підпис процесора, що з'являється там після скидання (див. Малюнок 3). Ідентифікаційна підпис процесора - це 32-розрядне значення. Підпис процесора складається з 8 різних бітових полів. Поля сірого кольору є зарезервовані біти і повинні кешуватися. Решта 6 полів формують таку нормативну підпис процесора.

Рис.3 Регістр EDX після скидання

  • Біти з 20 по 27. додаткова інформація про сімейство, використовується в поєднанні з основним кодом сімейства, певним між бітами 8 і 11, щоб вказати, чи належить процесор Intel386, Intel486, Pentium, Pentium Pro або Pentium 4 родин.
  • Біти з 16 по 19. додаткова інформація про модель, використовується в поєднанні з номером моделі, певним між бітами 4 і 7, використовуються для ідентифікації моделі процесора в сімействі. ID в бітах 0 до 3 вказує номер ревізії тієї моделі.
  • Біти з 12 по 13. інформація про тип процесора, вказує, чи є процесор вихідним процесором OEM, OverDrive або здвоєним (Dual). Значення типу процесора, повернутий в бітах 12 і 13 з регістра EAX, представлені в таблиці 2.
  • Біти з 8 по 11. основний код сімейства процесора
  • Біти з 4 по 7. модель сімейства процесора
  • Біти з 0 по 3. номер ревізії моделі

Таблиця 2. Типи процесора (біти 12 і 13)

Прапори і характеристики

Коли регістр EAX містить значення 1, інструкція CPUID (на додаток до завантаження підписи процесора в регістрі EAX), завантажує EDX і регістр ECX зі значеннями прапорів. Значення прапорів (коли Прапор = 1) показують, які функції підтримує процесор. Щоб дізнатися, які функції підтримує процесор, слід звернутися до керівництва для розробників, користувачів або іншій відповідній документації процесора.

Розмір кешу, формат і інформація TLB

Коли регістр EAX містить значення 2, інструкція CPUID завантажує EAX, EBX, ECX і регістри EDX з дескрипторами, які вказують кеш процесорів і характеристики TLB. Останні 8 біт регістра EAX (AL) містять значення, яке показує, скільки разів повинна виконатися інструкція CPUID, щоб отримати повну картину системи кешування процесора. Наприклад, процесор Pentium 4 повертає значення 1 в останніх 8 бітах регістра EAX, щоб вказати, що інструкція CPUID повинна бути виконана один раз (при EAX = 2) для отримання повної картини конфігурації процесора.

Решта EAX регістр, EBX, ECX і EDX регістри містять кеш і дескриптори TLB. Таблиця 3 показує, що коли біт 31 в даному регістрі дорівнює нулю, цей реєстр містить допустимі 8-розрядні дескриптори. Щоб декодувати дескриптори, перейдіть послідовно від старшого значущого байта регістра вниз до молодшого значущого байта регістра. Припускаючи, що 31 біт дорівнює 0, то в цьому випадку регістр містить допустимий кеш або дескриптори TLB в бітах з 24 по 31, з 16 по 23, з 8 по 15 і з 0 по 7. Програма повинна порівняти значення, що знаходиться в кінці бітових полів дескриптора зі значеннями, декодуючими дескриптор, і таким чином визначити кеш і TLB характеристики процесора.

Таблиця 3. Формати дескриптора

Зарезервований для майбутнього використання

Дескриптори, які вказують на параметр таблиці для визначення характеристик кеша. Вказує на NULL, якщо містить 0

Серійний номер процесора

Серійний номер процесора розширює поняття ідентифікації процесора. Серійний номер процесора - 96-розрядне число, доступне через інструкцію CPUID. Він може використовуватися додатками, щоб ідентифікувати процесор.

Наявність серійного номера процесора

Щоб визначити, чи підтримується функція визначення серійного номера процесора, програмі слід встановити значення параметра регістра EAX рівним 1, а потім виконати інструкцію CPUID наступним чином:

Після виконання інструкції CPUID регістри ECX і EDX містять характеристики та прапори. Якщо прапор PSN (біт 18 регістра EDX) дорівнює 1, то серійний номер процесора підтримується і включений. При 0 він або вимкнений, або не підтримується.

Формування 96-бітного серійного номера

96-розрядний серійний номер процесора - це комбінація трьох 32-розрядний об'єктів. Щоб отримати доступ до старших 32-розрядних бітам, програмі слід встановити параметр регістра EAX в 1, а потім виконати інструкцію як показано нижче:

Після її виконання регістр EAX містить ідентифікаційну підпис процесора. Вона включає старші 32-розрядні біта серійного номера процесора. Значення в EAX має бути збережено до збору залишилися 64 бітів серійного номера.

Щоб отримати до них доступ, програмі слід встановити параметр регістра EAX в 3, а потім виконати інструкцію CPUID:

Після виконання інструкції CPUID регістр EDX містить середні 32 біта, а регістр ECX містить молодші значущі 32 біта серійного номера. Після цього програма може з'єднати збережену ідентифікаційну підпис, EDX і ECX, а потім повернути повний 96-бітний серійний номер процесора. [2]

Номер, що допомагає ідентифікувати процесор

Починаючи з процесорів Pentium 3, концепція ідентифікації процесора була розширена додаванням спеціального ідентифікаційного номера. Він являє собою 8-бітний номер, доступний через інструкцію CPUID. Може бути використаний додатками для полегшення ідентифікації процесора.

Процесори, які мають такий номер, повертають його в бітах з 0 по 7 в регістрі EBX, коли CPUID виконується зі стартовим значенням 1 регістра EAX. Процесори, які не підтримують такий номер, повертають нульове значення в цих же бітах регістра EBX.

рядок ідентифікації

Цей рядок - нове розширення інструкції CPUID, реалізована в деяких процесорах. Використовуючи її, ці процесори будуть повертати цю ідентифікаційну рядок в кодуванні ASCII і максимальну робочу частоту через інструкцію CPUID. Коли інструкція буде виконуватися з набором значень регістра EAX, зазначеним з таблиці 4, процесор буде повертати цей рядок в регістрах загального призначення. [3]

Таблиця 4. Характеристики ідентифікаційного рядка процесора

Вхідний значення EAX

EAX, EBX, ECX, EDX містять ASCII рядок

Послідовність ідентифікації процесора

Для ідентифікації процесора за допомогою CPUID інструкції, програми слід дотримуватися такої послідовності:

  1. Крок 1. Визначити, чи підтримується CPUID інструкція модифікацією прапора ID в регістрі EFLAGS. Якщо змінити його не виходить, значить - не підтримується.
  2. Крок 2. Виконайте інструкцію зі значенням в EAX 80000000h. Це потрібно зробити для того, щоб з'ясувати, чи підтримується ідентифікаційна рядок. Якщо ця функція повернула значення, більше, ніж 80000000h, ідентифікаційна рядок підтримується, і програмі слід використовувати функції з 80000002h по 80000004h для подальшої ідентифікації.
  3. Крок 3. Якщо ідентифікаційна рядок не підтримується, виконайте CPUID із значенням 1 в регістра EAX. Така функція поверне ідентифікаційну підпис в регістр EAX і номер, що допомагає в ідентифікації в біти з 0 по 7 регістра EBX. Якщо вони будуть містити відмінне від 0 значення, значить, номер підтримується. В такому випадку програмі потрібно просканувати список номерів для ідентифікації.
  4. Крок 4. Якщо номер не підтримується, програма використовує ідентифікаційну підпис разом з дескрипторами кеша для ідентифікації.