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
Последние статьи :
  Rust 07.11   
  Go 25.12   
  EXT4 10.11   
  FS benchmark 15.09   
  Сетунь 23.07   
  Trees 25.06   
  Apache 03.02   
  SQL 30.07   
  JFS 10.06   
  B-trees 01.06   
 
TOP 20
 Trees...615 
 Go Web ...398 
 Python...199 
 Rubni-Corbet -> Глав...197 
 2.0-> Linux IP Networking...183 
 Steve Pate 3...174 
 Stein-MacEachern-> Час...167 
 Стивенс 9...155 
 Rubni-Corbet -> Глав...141 
 Stevens-> Глава 4...139 
 Mike Perry...138 
 Daniel Bovet 2...138 
 Stewens -> IPC 9...137 
 Advanced Bash Scripting G...136 
 Stewens -> IPC 7...135 
 Rodriguez 6...134 
 Rubni-Corbet -> Глав...134 
 Secure Programming for Li...134 
 Ethreal 4...133 
 Stevens-> Глава 23...129 
 
  01.12.2017 : 2356398 посещений 

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

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

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