문제

여기 주변의 누군가가 관리되는 .NET 언어에서 참조 할 수있는 C ++ CPUID 구현의 좋은 예를 가지고 있는지 알고 싶습니다.

또한, 이것이 사실이 아닐까요, x86과 x64 사이의 특정 구현 차이를 알고 있어야합니까?

CPUID를 사용하여 소프트웨어가 실행중인 컴퓨터에 대한 정보를 얻고 싶습니다 (CrashReporting 등). 가능한 한 모든 것을 널리 호환 할 수 있습니다.

내가 묻는 주된 이유는 CPU 레지스터에 대한 기본 지식이 있지만 모든 기계 지침을 작성하는 데있어서 총 멍청이이기 때문입니다.

사람들이 Google에 말하기 전에 : 온라인에서 몇 가지 예를 찾았지만 일반적으로 관리 코드와의 상호 작용을 허용하지 않았으며 예제 중 어느 것도 X86과 X64를 목표로하지 않았습니다. 대부분의 예는 x86 특정 인 것으로 보입니다.

도움이 되었습니까?

해결책

원시 CPUID 정보에 액세스하는 것은 실제로 매우 쉽습니다. Windows, Linux 및 OSX에서 작동하는 C ++ 클래스는 다음과 같습니다.

#ifndef CPUID_H
#define CPUID_H

#ifdef _WIN32
#include <limits.h>
#include <intrin.h>
typedef unsigned __int32  uint32_t;

#else
#include <stdint.h>
#endif

class CPUID {
  uint32_t regs[4];

public:
  explicit CPUID(unsigned i) {
#ifdef _WIN32
    __cpuid((int *)regs, (int)i);

#else
    asm volatile
      ("cpuid" : "=a" (regs[0]), "=b" (regs[1]), "=c" (regs[2]), "=d" (regs[3])
       : "a" (i), "c" (0));
    // ECX is set to zero for CPUID function 4
#endif
  }

  const uint32_t &EAX() const {return regs[0];}
  const uint32_t &EBX() const {return regs[1];}
  const uint32_t &ECX() const {return regs[2];}
  const uint32_t &EDX() const {return regs[3];}
};

#endif // CPUID_H

클래스의 인스턴스를 인스턴스화하려면 관심있는 CPUID 명령을로드하고 레지스터를 검사하십시오. 예를 들어:

#include "CPUID.h"

#include <iostream>
#include <string>

using namespace std;

int main(int argc, char *argv[]) {
  CPUID cpuID(0); // Get CPU vendor

  string vendor;
  vendor += string((const char *)&cpuID.EBX(), 4);
  vendor += string((const char *)&cpuID.EDX(), 4);
  vendor += string((const char *)&cpuID.ECX(), 4);

  cout << "CPU vendor = " << vendor << endl;

  return 0;
}

이 Wikipedia 페이지는 cpuid를 사용하는 방법을 알려줍니다. http://en.wikipedia.org/wiki/cpuid

편집하다: 추가 #include <intrin.h> Windows의 경우 의견 당.

다른 팁

보다 __cpuid에 대한이 MSDN 기사.

Visual Studio 2005 이상을 컴파일하는 포괄적 인 샘플이 있습니다. Visual Studio 6의 경우 컴파일러 악기 대신 __cpuid 대신에 사용할 수 있습니다.

void __cpuid(int CPUInfo[4], int InfoType)
{
 __asm 
  {
     mov    esi, CPUInfo
     mov    eax, InfoType
     xor    ecx, ecx  
     cpuid  
     mov    dword ptr [esi +  0], eax
     mov    dword ptr [esi +  4], ebx  
     mov    dword ptr [esi +  8], ecx  
     mov    dword ptr [esi + 12], edx  
  }
}

Visual Studio 2005의 경우 컴파일러 기기 대신 __cpuidex 대신에 사용할 수 있습니다.

void __cpuidex(int CPUInfo[4], int InfoType, int ECXValue)
{
 __asm 
  {
     mov    esi, CPUInfo
     mov    eax, InfoType
     mov    ecx, ECXValue
     cpuid  
     mov    dword ptr [esi +  0], eax
     mov    dword ptr [esi +  4], ebx  
     mov    dword ptr [esi +  8], ecx  
     mov    dword ptr [esi + 12], edx  
  }
}

정확히 당신이 찾고있는 것이 아닐 수도 있지만 인텔은 좋은 기사와 샘플 코드 인텔 64 비트 플랫폼 아키텍처 (프로세서, 캐시 등)를 열거하는 경우 32 비트 X86 프로세서를 다루는 것으로 보입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top