前几天经过查资料,得到网络上获取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位序列号,但是维基里面说了。