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

本文纠正了关于通过CPU序列号获取处理器信息的误解,并指出该方法在现代处理器中已不再适用。在64位系统中,由于微软不再支持内联汇编,可以使用__cpuid和__cpuidex函数来获取CPUID,以识别处理器的特性。
摘要由CSDN通过智能技术生成

前几天经过查资料,得到网络上获取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

  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值