Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
 iakovlev.org 
 OS
 osjournal 
 Protected Mode 
 Hardware 
 Kernels
  Dark Fiber
  BOS
  QNX
  OS Dev
  Lecture notes
  MINIX
  OS
  Solaris
  История UNIX
  История FreeBSD
  Сетунь
  Эльбрус
NEWS
Последние статьи :
  Тренажёр 16.01   
  Эльбрус 05.12   
  Алгоритмы 12.04   
  Rust 07.11   
  Go 25.12   
  EXT4 10.11   
  FS benchmark 15.09   
  Сетунь 23.07   
  Trees 25.06   
  Apache 03.02   
 
TOP 20
 Linux Kernel 2.6...5164 
 Trees...935 
 Максвелл 3...861 
 Go Web ...814 
 William Gropp...794 
 Ethreal 3...778 
 Ethreal 4...766 
 Gary V.Vaughan-> Libtool...764 
 Rodriguez 6...755 
 Clickhouse...748 
 Steve Pate 1...748 
 Ext4 FS...748 
 Ethreal 1...736 
 Secure Programming for Li...718 
 C++ Patterns 3...711 
 Ulrich Drepper...691 
 Assembler...686 
 DevFS...653 
 Стивенс 9...643 
 MySQL & PosgreSQL...621 
 
  01.01.2024 : 3621733 посещений 

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
 
 
Оставьте свой комментарий !

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

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