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
 Go Web ...231 
 System...210 
 Intel 386...209 
 Ethreal 1...204 
 Alg1...203 
 C->Pusher...201 
 Trees...201 
 Mod_parrot...201 
 Rust...200 
 Kernel 3.4...197 
 Benchmark...196 
 Эльбрус...196 
 Linux Kernel 2.6...195 
 Тренажёр...195 
 Assembler...194 
 Интервью-> Але...193 
 BFS...193 
 Kernel 5.13...192 
 Ext4 FS...192 
 Максвелл 3...189 
 
  01.01.2025 : 3803065 посещений 

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

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

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