CPUID & Processor Identification
by Jens Olsson,
Материалы взяты тут : http://www.cyberscriptorium.com/osjournal/cgi-bin/index.pl?action=home
Introduction
Команда CPUID появилась на пентиумах .
На 486-х эта команда как правило не поддерживается .
Инструкция CPUID
Первое что нужно сделать - загрузить 0 в EAX .
CPUID возвращает различные значения в EAX, EBX, ECX и EDX
в зависимости от того , какое значение прежде положено в EAX .
|
EBX, EDX, ECX | Здесь возвращается т.н. "vendor string".
|
Каждый производитель имеет свою собственную vendor string.
Например, Intel - "GenuineIntel" , AMD - "AuthenticAMD" , Cyrix - "CyrixInstead".
Следующий пример показывает использование CPUID на С .
Кстати , показано , как на си выводить содержимое регистров на экран в 16-ричном формате
- полезная фича для инлайн-кода :
/*
* print cpu's capabilities as far as number of siblings
* and number of cores are concerned
* suresh.b.siddha@intel.com
*/
#include < stdio.h>
static inline void cpuid(int op, int cx, int *eax, int *ebx, int *ecx, int *edx)
{
__asm__("cpuid"
: "=a" (*eax),
"=b" (*ebx),
"=c" (*ecx),
"=d" (*edx)
: "0" (op),"2"(cx));
}
main()
{
int val[4];
int smp_num_siblings, smp_num_cores, j, strsize;
unsigned int max, i=0;
unsigned char *cpuidp;
printf("\nBasic CPUID Instruction Information:\n");
printf("====================================\n");
/* eax = 0 */
printf("\nProcessor Detection - CPUID.%d:\n", i);
cpuid(i, 0, &val[0], &val[1], &val[2], &val[3]);
printf("Max Input Value for Basic CPUID:\n");
printf(" EAX: 0x%08x\n", val[0]);
printf("Vendor ID:\n");
printf(" EBX: 0x%08x\n", val[1]);
printf(" ECX: 0x%08x\n", val[2]);
printf(" EDX: 0x%08x\n", val[3]);
cpuidp = (unsigned char *)&val[1];
strsize = sizeof(val[1]) + sizeof(val[2]) + sizeof(val[3]);
printf(" ");
for (j=0; j> 20 & 0xff);
printf(" Extended Model: 0x%x\n", val[0] >> 16 & 0xf);
printf(" Processor Type: 0x%x\n", val[0] >> 12 & 0x3);
printf(" Family Code: 0x%x\n", val[0] >> 8 & 0xf);
printf(" Model Number: 0x%x\n", val[0] >> 4 & 0xf);
printf(" Stepping ID: 0x%x\n", val[0] & 0xf);
printf("\nMisc. Info Feature Flags:\n");
printf(" EBX: 0x%08x\n", val[1]);
printf(" ECX: 0x%08x\n", val[2]);
printf(" EDX: 0x%08x\n", val[3]);
}
printf("\n\nExtended Function CPUID Information\n");
printf("====================================\n");
i = 0x80000000;
printf("\nMax Input Value for Extended CPUID.0x%x:\n", i);
cpuid(i, 0, &val[0], &val[1], &val[2], &val[3]);
printf(" EAX: 0x%08x\n", val[0]);
printf("Reserved\n");
printf(" EBX: 0x%08x\n", val[1]);
printf(" ECX: 0x%08x\n", val[2]);
printf(" EDX: 0x%08x\n", val[3]);
max = val[0];
/* eax = 0x80000001 */
if (++i <= max) {
printf("\nExtended Feature Flags - CPUID.0x%x:\n", i);
cpuid(i, 0, &val[0], &val[1], &val[2], &val[3]);
printf("Reserved:\n");
printf(" EAX: 0x%08x\n", val[0]);
printf(" EBX: 0x%08x\n", val[1]);
printf("Extended Feature Flags:\n");
printf(" ECX: 0x%08x\n", val[2]);
printf(" EDX: 0x%08x\n", val[3]);
}
}
CPUID, EAX=1
Если вызвать CPUID с EAX=1 , можно получить информацию о семействе процессора , его модели .
Можно получить также информацию о MMX, 3DNow etc.
Яковлев С: На моем компе был получен следующий вывод :
Basic CPUID Instruction Information:
====================================
Processor Detection - CPUID.0:
Max Input Value for Basic CPUID:
EAX: 0x00000002
Vendor ID:
EBX: 0x756e6547
ECX: 0x6c65746e
EDX: 0x49656e69
GenuntelineI
Processor Signature - CPUID.1:
EAX: 0x000006b1
Extended Family: 0x0
Extended Model: 0x0
Processor Type: 0x0
Family Code: 0x6
Model Number: 0xb
Stepping ID: 0x1
Misc. Info Feature Flags:
EBX: 0x00000003
ECX: 0x00000000
EDX: 0x0383f9ff
Extended Function CPUID Information
====================================
Max Input Value for Extended CPUID.0x80000000:
EAX: 0x80000004
Reserved
EBX: 0x00000000
ECX: 0x00000000
EDX: 0x00000000
Extended Feature Flags - CPUID.0x80000001:
Reserved:
EAX: 0x00000000
EBX: 0x00000000
Extended Feature Flags:
ECX: 0x00000000
EDX: 0x00000000
|
|
|