前几天经过查资料,得到网络上获取CPU序列号的方法是错误的,首先我找到了一篇论文,这篇论文里面是这么说的:

这篇论文是错误的。这篇是错误的这篇是错误的!!!!!!!!!

2、CPU序列号

CPU序列号是一个建立在处理器内部的、唯一的、不能被修改的编号。它由96位数字组成。高32位是CPUID,用来识别CPU类型。低64位每个处理器都不同,唯一地代表了该处理器。CPU号可以用来识别每一个处理器。为了适应这一新特征,Intel在处理中增加了两条指令(“读取”和“禁止”)和一个寄存器位。读取指令扩展了CPUID读取指令。当执行读取指令时可以得到96位的处理器序列号。禁止指令可以禁止对处理器序列号的读取。为了配合CPU序列号的读取和禁止,设置了MSR位。当MSR位为“0”时可以读取CPU序列号;当MSR为“1”时只能读取高32位(即CPUID)而低64位全为零。

2、实现过程

(1)CPU号的读取

硬盘的序列号只能采用对硬盘控制器直接操作的方式进行读取,也就是说只能采用CPU的I/O指令操作硬盘控制器,对于CPU号的读取采用了在DELPHI嵌入汇编的方法读取。

其读取方法如下:MOVEAX,01H

如果返回的EDX中,低18位为1,那么这个CPU就是支持序列号的。此时EAX就是序列号的高32位。这32位对同一型号的CPU是一样的。再执行:

MOVEAX,03H

此时的EDX:ECX就是序列号的第64位。

这就是这篇论文所说的关于CPU序列号的问题,当时我被这个问题困扰了好久,因为在我的机器上他所谓的EDX:ECX是获取不到的,而且网络上也没有关于MSR这个寄存器 的说明,因此,我怀疑网上的这篇论文可能是错误的。

于是机缘巧合下我去查了维基百科。

https://en.wikipedia.org/wiki/CPUID

有兴趣的人可以自己去研究下。这里我只说重点,当__cpuid()这个命令输入的是3的时候按商编的文章我们可以得到低64位序列号,但是维基里面说了。

EAX=3: Processor Serial Number[edit]

See also:  Pentium III § Controversy about privacy issues

This returns the processor's serial number. The processor serial number was introduced on Intel Pentium III, but due to privacy concerns, this feature is no longer implemented on later models (PSN feature bit is always cleared). Transmeta's Efficeon and Crusoe processors also provide this feature. AMD CPUs however, do not implement this feature in any CPU models.

For Intel Pentium III CPUs, the serial number is returned in EDX:ECX registers. For Transmeta Efficeon CPUs, it is returned in EBX:EAX registers. And for Transmeta Crusoe CPUs, it is returned in EBX register only.

Note that the processor serial number feature must be enabled in the BIOS setting in order to function.

他说,这个是返回的处理器的序列号,但是这个序列号早在奔腾3就被废弃了,主要是为了保护个人的隐私。而且这个值之后的处理器也不再使用,所以。你们那些博客里面说能够获取到的是在逗我么,不考虑正确性就瞎转。关于那篇文章我后来查了下根源,发现是某个杂志上面的。但是这个东西真的是错误的,这个是获取不到的。我们可以获取到的是这个值:(相对于这种杂志我更相信维基)

C:\Users\Admin>wmic CPU get ProcessorID
ProcessorId
BFEBFBFF000206A7

****************************************我是萌萌的分割线********************************************************************

说了这么多这些,我来说说如何在64位系统下获得CPUID

因为微软在64位系统下不再支持内联汇编这么程序的编写方式,所以我们就不能使用像32位程序的内联汇编来获取CPUID。如何获取,也是在网上搜索到的一种方法是不能用内联汇编,那就用外部调用,好吧外部编写汇编程序,反真我是不会。这里就不说了。

另一种方法:人性化的微软为我们提供了两个函数:

我们来看看MSDN:

__cpuid, __cpuidex

Generates the cpuid instruction that is available on x86 and x64. This instruction queries the processor for information about the supported features and CPU type.

这个cpuid函数可以用于获取处理器的信息(关于被支持的特征和处理器的种类)。

void __cpuid(int CPUInfo[4],int InfoType
);void __cpuidex(int CPUInfo[4],int InfoType,int ECXValue
);
Parameters
[out]  CPUInfo

An array of four integers that contains the gathered information about supported features and the CPU.

[in]  InfoType

A code that indicates what information this instruction retrieves.

[in]  ECXValue

The value of the ECX register before this intrinsic generates the cpuid instruction.

Intrinsic

Architecture

__cpuid

x86, x64

__cpuidex

x86, x64

Header file  <intrin.h>

我们要获取ProcessorID的值就像在CMD输入命令一样的值,例子如下:(用法跟内联汇编一样的参数,但是比汇编简单多了32 64 都支持!!!)

#include<iostream>
#include<intrin.h>
using namespace std;int main()
{
INT32 deBuf[4];__cpuidex(deBuf,01,0);
printf(%.8x%.8x,deBuf[0],deBuf[3]);
return 0;
}

关于CPU序列号的问题,以及如何获取×64下CPU的ProcessorID相关推荐

  1. 飞腾64核服务器cpu芯片,【今日头条】飞腾64核CPU适配百度昆仑AI处理器:全国产的AI体系登场...

    原标题:[今日头条]飞腾64核CPU适配百度昆仑AI处理器:全国产的AI体系登场 继百度飞桨深度学习平台之后,百度的昆仑AI芯片日前也针对国产的飞腾CPU完成了适配.再加上已经适配的国产OS,在AI计 ...

  2. 【Linux实时编程之CPU核心隔离】Linux(ubuntu)下CPU隔离的踩坑与实践 (isolcpus的使用)

    因为车载LINUX需要实时调度,为了确保实时性,因此要讲CPU核进行隔离 LINUX环境 ubuntu 18.04 内核版本 5.4.122-rt9 综述 CPU 核隔离主要分为两个方式 第一种是在g ...

  3. Windows/Linux获取Mac地址和CPU序列号实现

    UUID(Universally Unique Identifier)即通用唯一标识符,是指在一台机器上生成的数字,保证在全球范围的唯一性.可用的开源库如libuuid,可参考https://blog ...

  4. C/C++ 获取硬件唯一标识 (CPU序列号/硬盘号)

    调用控制台来获取CPU序列号/硬盘号 不同PC的硬盘数量可能不同 若有多个硬盘,此处的输出将多个硬盘号拼接到了一起 若需拆分可自行修改. 注:插拔硬盘U盘等会造成获取到的硬盘号不同,如果想以此为机器码 ...

  5. 更改cpuID(CPU序列号)指南

    最近在使用一个软件,购买了许可.该license绑定了机器的cpuID,然该软件并不能正在运行在windows 8 64bit操作系统上,具体表现为运行3-5mins后就崩溃.于是,我计划使用VMwa ...

  6. 如何获取服务器的CPU,内存进行限流

    文章目录 如何获取服务器的CPU,内存进行限流 如何获取服务器的CPU,内存进行限流 需要包名 "github.com/shirou/gopsutil/v3/cpu""g ...

  7. 32位计算机是指该cpu,32位机指的是计算机的CPU怎么样?

    32位机指的是计算机的CPU能够同时处理32位二进制数据.32位计算机的CPU一次最多能处理32位数据,也就是4个字节的数据,例如它的EAX寄存器就是32位的,当然32位计算机通常也可以处理16位和8 ...

  8. python获取本机 ip地址、mac地址(物理地址)、计算机名、硬盘序列号、CPU序列号、主板序列号、bios序列号、bios uuid号

    文章目录 python获取本机IP地址.mac地址(物理地址).计算机名 物理地址 计算机名.ip地址 硬盘序列号 CPU序列号 主板序列号 bios序列号 bios uuid号 python获取本机 ...

  9. C# 中获取CPU序列号/网卡mac地址

    -- 1.cpu序列号2.mac序列号3.硬盘id 在给软件加序列号时这三个应该是最有用的,可以实现序列号和机器绑定,对保护软件很有好处.哈哈. using System; using System. ...

最新文章

  1. matlab 图像操作函数的详解
  2. mysql 共享表空间_MySQL共享表空间概念
  3. 如何训练解决问题的能力?
  4. JS Ajax异步请求发送列表数据后面多了[]
  5. 大盘点: KubeCon EU 2019 应用管理领域的新看点!
  6. Spring异常重试机制 - Spring Retry
  7. QTP中VBS脚本下FSO、WSH的应用(二)
  8. java 按顺序读取文件夹_java读取某个文件夹下的所有文件实例代码
  9. python采集人脸_python获取人脸的代码分享
  10. 医药行业进销存软件 零售药店管理软件
  11. Oracle 12C 最新 PSU 补丁下载与安装操作指北
  12. 一个MySQL优化案例的初步思路(r8笔记第87天)
  13. MAC word2015 插入罗马字母
  14. 关于浏览器播放视频的些许理解
  15. 通过计算机主机数来划分子网,计算机网络知识梳理(2)——子网掩码及网络划分...
  16. 基于ESP32的蓝牙鼠标键盘(二)BleMouse.h函数解析
  17. 企业怎么管理多个邮箱?如何高效地管理邮件?
  18. python在数据分析方面的应用-数据分析应用方面Python和spss有什么区别?
  19. c语言有50个学生,要求输出成绩在80分以上的学生的学号和成绩,输入50个同学的学号和成绩,输出其中80分以上的学号和成绩...
  20. 根据域名展示对应备案号内容的共用站点默认页面index.html

热门文章

  1. 小学生台灯哪个品牌更护眼?学习专用的护眼台灯品牌
  2. Yumiko Kayukawa 禅·波普·自然界
  3. fedora23 桌面工具栏fedy, 桌面美化 allow: 2'lau不是2'l2u
  4. 中年人学C语言Windows程序设计,30 DialogBox控件
  5. 智慧城市的应用挑战,昇腾AI给出了新解法
  6. 机器学习总结(三):矩估计
  7. 微信模板消息推送接口说明
  8. 数据库管理系统(基于前端+后端+数据库)
  9. python获得当前时间戳_python怎么获取当前时间戳
  10. JS Object 对象中删除属性