我想知道周围是否有人可以从任何托管的.net语言中引用C++ CPUID实现的良好示例。

另外,不是这样吗,我是否应该了解X86和X64之间的某些实现差异?

我想使用CPUID来获取我的软件正在运行的机器上的信息(崩溃报告等),并且我希望所有内容都尽可能地广泛兼容。

我问的主要原因是,尽管我对CPU寄存器等有基本的了解,但是在编写什么可能是所有机器指令时我还是个菜鸟。

在人们开始告诉我Google之前:我在网上找到了一些示例,但通常它们并不是要允许托管代码进行交互,而且这些示例都不是针对X86和X64的。大多数示例似乎都是X86特定的。

最佳答案

访问原始CPUID信息实际上非常容易,这是一个C++类,适用于Windows,Linux和OSX:

#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;
}

维基百科页面告诉您如何使用CPUID:http://en.wikipedia.org/wiki/CPUID

编辑:每个注释都为Windows添加了#include <intrin.h>

关于c++ - C++中的CPUID实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1666093/

10-12 23:34