CPU信息
原理
利用 __cpuid 的调用,获取CPU的信息,但是因为获取的信息存储在16个字节的内存区,需要自己去解析,所以可以预先定义对应的结构体来实现,主要利用结构体的一个特性.
代码
cpu_def.h#ifndef __CPU_DEF_H__
#define __CPU_DEF_H__
#include "cpu_def.h"
typedef struct tagCpu0
{int nMaximum;int nIdStr1;int nIdStr2;int nIdStr3;
}CPU_0, *PCPU_0;typedef struct tagCpu1
{unsigned int nStepId:4; // 单步执行 IDunsigned int nModel:4; // 模型unsigned int nFamily:4; // Familyunsigned int nProcessortype:2; // 处理器类型 (Intel)unsigned int nReserved1:2; // 保留unsigned int nExtendedmodel:4; // 扩展设计unsigned int nExtendedFamily:8; // 用主页unsigned int nReserved2:4; // 保留unsigned char nBrandIndex:8; // 品牌索引unsigned char nSizeOfCacheLine:8; // CLFLUSH 缓存行的大小,在多次字长unsigned char nLogicalProcessorCount:8; // 逻辑处理器计数unsigned char nInitApicId:8; // 初始 APIC IDunsigned char bSSE3:1; // SSE3 新命令unsigned char nReserved3:2; // 保留unsigned char bMonitor:1; // MONITOR/MWAITunsigned char bCPLDebugStore:1; // 限定 CPL 调试存储 (Intel)unsigned char bVirtualMacExt:1; // 虚拟机扩展 (Intel)unsigned char bSaferModeExt:1; // 安全模式扩展 (Intel)unsigned char bEnhancedSpeedStep:1; // 增强的 Intel SpeedStep 技术 (Intel)unsigned char bThermalMonitor:1; // 热量监视器 (Intel)unsigned char bSIMDExt3:1; // 添加的流 SIMD 扩展 3 (SSSE3)unsigned char nL1ContextID:1; // L1 上下文 ID (Intel)unsigned char nReserved4:1; // 保留unsigned char b256BitFMAExt:1; // 256 位 FMA 扩展 (Intel)unsigned char bCMPXCHG16B:1; // CMPXCHG16B 支持unsigned char bXTPRUpdateCtrl:1; // xTPR 更新控件unsigned char bDebugCapabilityMSR:1; // 穿孔机/调试功能 MSRunsigned char nReserved5:2; // 保留unsigned char bDCA:1; // 直接缓存支持 (DCA) (Intel)unsigned char bSSE4_1Ext:1; // SSE4.1 扩展unsigned char bSSE4_2Ext:1; // SSE4.2 扩展unsigned char bX2APIC:1; // x2APIC 支持 (Intel)unsigned char bMOVBE:1; // MOVBE 支持 (Intel)unsigned char bPOPCNT:1; // POPCNT 命令支持unsigned char nReserved6:1; // 保留unsigned char bAES:1; // AES 支持 (Intel)unsigned char bXSAVE:1; // XSAVE 支持 (Intel)unsigned char bOSXSAVE:1; // OSXSAVE 支持 (Intel)unsigned char b256AVX:1; // 256 位 Intel 高级矢量扩展 (Intel)unsigned char nReserved7:3; // 保留unsigned int bFPU:1; // 芯片的 x87 FPUunsigned int bVME:1; // 虚拟模式提高 8086unsigned int bDE:1; // 调试扩展unsigned int bPSE:1; // 页大小扩展unsigned int bTSC:1; // 时间戳计数器unsigned int bMSR:1; // RDMSR 和 WRMSR 支持unsigned int bPAE:1; // 物理地址扩展unsigned int bMCE:1; // 检查计算机的异常unsigned int bCX8:1; // CMPXCHG8 B 命令unsigned int bAPIC:1; // 芯片的 APICunsigned int nReserved8:1; // 保留unsigned int bSEP:1; // SYSENTER 和 SYSEXITunsigned int bMTRR:1; // 内存类型之间注册unsigned int bPGE:1; // PTE 全局位unsigned int bMCA:1; // 检查计算机的体系结构unsigned int bCMOV:1; // 条件移动/比较命令unsigned int bPAT:1; // 页属性表unsigned int bPSE36:1; // 36 位页大小扩展unsigned int bPSN:1; // 处理器号unsigned int bCLFSH:1; // CFLUSH 命令unsigned int nReserved9:1; // 保留unsigned int bDS:1; // 调试存储unsigned int bACPI:1; // 热量监视和时钟控件unsigned int bMMX:1; // MMX 技术unsigned int bFXSR:1; // FXSAVE/FXRSTORunsigned int bSSE:1; // SSE 扩展unsigned int bSSE2:1; // 将扩展unsigned int bSS:1; // 自爱与闲事的用户unsigned int bHTT:1; // 多线程处理unsigned int bTM:1; // 热量监视器unsigned int nReserved10:1; // 保留unsigned int bPBE:1; // 等待中断启用
}CPU_1, *PCPU_1;
#endif
test.cpp
#include "cpu.h"
#include "cpu_def.h"
#include
#include
#include
int main()
{int pnCpuInfo[4] = {0};void* pCpu = NULL;{__cpuid(pnCpuInfo, 0);pCpu = (PCPU_0)pnCpuInfo;}printf("%d", sizeof(CPU_1));{__cpuid(pnCpuInfo, 1);pCpu = (PCPU_1)pnCpuInfo;}return 0;
} 本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
