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
 Advanced Bash Scripting G...2010 
 Ethreal 4...1464 
 Secure Programming for Li...1258 
 CPAN-> FAQ...1129 
 Assembler...1122 
 Intel 386...818 
 Go Web ...789 
 Тренажёр...737 
 Ethreal 1...694 
 Trees...684 
 Alg1...652 
 Максвелл 3...638 
 Rust...631 
 C + UNIX...585 
 Ext4 FS...581 
 William Gropp...570 
 Mod_parrot...529 
 Go...524 
 Benchmark...505 
 System...495 
 
  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
 
 
Оставьте свой комментарий !

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

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