Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
iakovlev.org
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
 
 
Оставьте свой комментарий !

Ваше имя:
Комментарий:
Оба поля являются обязательными

 Автор  Комментарий к данной статье