linux 获取cpu序列号 获取cpu序列号

大家好,关于linux 获取cpu序列号很多朋友都还不太明白,今天小编就来为大家分享关于获取cpu序列号的知识,希望对各位有所帮助!

cpuid和序列号背后的那些故事

最近测试反馈了一个问题,每次重启服务器,我们某个版本的业务系统中的机器码都会改变,导致根据机器码算出来的许可证失效,从而使软件无法使用。这个问题反馈了有一段时间了,但是本地一直没复现。然后前几天测试说又复现了,马上去看了下测试环境,服务器是一台国产化FT S2500服务器,验证了下,果然如此,马上去看了下关键代码。

这下明白了,它是取的CPU序列号作为机器码。dmidecode的输出中有多个Serial Number,它只取了第一个,恰恰就是Processor Information,也就是我们常说的CPU序列号。

CPU支持过序列号功能,但是被人指责侵犯隐私,所以现在的规范中,CPU完全没有所谓的序列号。

关于CPU序列号,其实还有一段历史。在奔腾3中短暂地引入过这个功能,但是后来很快就被移除了。

EAX=3: Processor Serial Number

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.

所以,我们不应该使用CPU Serial Number来作为设备唯一性判断,而应该使用CPU ID来判断。

如果是windows系统,根据MSDN文档:(v=vs.85).aspx ProcessorId

Data type: string

Access type: Read-only

Processor information that describes the processor features. For an x86 class CPU, the field format depends on the processor support of the CPUID instruction. If the instruction is supported, the property contains 2(two) DWORD formatted values. The first is an offset of 08h-0Bh, which is the EAX value that a CPUID instruction returns with input EAX set to 1. The second is an offset of 0Ch-0Fh, which is the EDX value that the instruction returns. Only the first two bytes of the property are significant and contain the contents of the DX register at CPU reset—all others are set to 0(zero), and the contents are in DWORD format."

可以用如下代码获取CPU ID

本地没有msvc编译环境,就不做测试了。

在Linux上呢,我们也可以用C内联汇编来实现

native_cpuid这段代码来自linux kernel里的源码,其实gcc里有cpuid.h这个文件,它封装了ASM代码,直接引入即可。

看下运行结果:

如上所示,eax, ebx, ecx, edx这四个寄存器对应的内容就是cpu id。跟dmidecode的结果比较下,可以对应上。

如果是aarch64架构,CPU架构不一样,就不能用同样的ASM汇编了,找了下ARM官方文档,–el1?lang=en,参考CPU架构,可以从MIDR_EL1寄存器获取

输出如下

正好与dmidecode中的ID对应。经过测试,重启后cpuid是不会改变的。

Java代码里匹配的是Serial Number,这里一直说的是CPU ID,这俩东西到底是不是同一个事呢?

结论是: 1.CPU Serial Number是一个Embedded 96-bit code during chip fabrication,但废弃标准,不应该使用,而应该使用CPU ID来判断。

2.因为涉及隐私问题(Serial Number is Readable by networks& applications),现在的服务器架构已经不支持CPU Serial Number的获取了,用dmidecode获取到的Serial Number不保证有值的。

3.CPU ID包含的是CPU架构的一些信息,更接近条形码的概念,并不是唯一身份标识,不保证唯一性。

4.dmidecode在国产服务器架构下获取到的CPU Serial Number,其实又叫PSN(Processor Serial Number)。之所以国产化服务器能拿到PSN,是因为国产服务器是aarch64架构,并且是自主化研发,并没有遵循Intel的规范。另外同为国产化服务器,不同的厂家实现也不一样,有的重启即变,有的并不会变化。关于PSN的开启,应该是可以在BIOS里配置。其实,PSN should NOT exist at all。为什么国产服务器还保留PSN,就不做过多展开了。有兴趣的可以自行阅读PSN相关文档

最后,修改很简单,如果使用场景不严格,可以使用CPU ID,或者System Information中的UUID即可,两者都能保证重启不变,但System Information中的UUID能保证唯一性,而CPU ID不能。

如何在 Linux 中查看系统硬件制造商、型号和序列号

Linux命令行用户在获取系统硬件信息时可能会遇到一些麻烦,尽管图形界面用户和Windows用户获取这些信息相对容易。实际上,Linux中存在多种工具可以用来查询硬件制造商、型号和序列号等详细信息。

以下是获取这些信息的六种方法,您可以根据需要选择最适合您的工具。

方法一:使用dmidecode命令

dmidecode命令可以读取电脑的DMI(桌面管理接口)表内容,并以人类可读的格式显示系统硬件信息。该表包含系统硬件组件的详细描述,以及序列号、制造商、发布日期等有用信息。通过分析DMI表,您可以了解硬件的兼容性,例如支持的CPU速度和最大内存容量。

方法二:使用inxi命令

inxi是一个小巧灵活的工具,可以快速显示系统硬件、CPU、驱动、Xorg、桌面、内核、GCC版本、进程、内存使用等多种信息。它适用于技术支持和调试工具。

方法三:使用lshw命令

lshw(硬件监听器)是一个小巧灵活的工具,可以生成各种硬件组件的详细报告。它通过读取/proc目录下的文件和DMI表来获取硬件信息,必须以超级用户权限运行才能检测完整的硬件信息。

方法四:使用/sys文件系统

内核在/sys目录下的文件中公开了一些DMI信息。您可以使用grep命令或cat命令来获取机器类型或特定详细信息。

方法五:使用dmesg命令

dmesg命令用于记录内核消息,通过读取内核的环形缓冲区来获取数据。在排查问题或获取系统硬件信息时,dmesg非常有用。

方法六:使用hwinfo命令

hwinfo是一个检测当前系统硬件并显示详细信息的好工具。它报告关于CPU、内存、键盘、鼠标、显卡、声卡、存储、网络接口、磁盘、分区、BIOS等信息。hwinfo使用libhd库来收集系统上的硬件信息,适用于openSuse等发行版。

如何delphi7获取xp、win7、vista系统下主板序列号

这个问题让我来回答你吧,因为我用delphi7做这个有八九年历史了,一直用硬件序列号进行加密注册,所以还是有发言权的。又因为不要你的分数,所以就懒得登陆了。不过,答案你也会有点点失望,因为我没能解决你的问题。

先说说主板吧,如果你是想做软件加密,这个你就死了心吧,因为主板的Bios没有统一格式,而且Bios版本不同,所用的存储格式也不尽相同,所以,你即使今天把获取市面上的所有主板序列号的函数都写好了,明天出新的主板,你的函数照样识别不了,获取主板序列号就失败了。

那么什么最稳定呢?答案是硬盘序列号。其他那些什么网卡MAC、CPU序列号等等等等,都是不行的。只有硬盘序列号最稳定,几乎百分百成功,而且在VISTA和Win7下面不需要管理员权限都可以获取到。但是,硬盘种类也不少,比如有IDE的,有SATA一代、二代的,有SCSI的,要针对每种硬盘写对应的函数,这个工作量也不小。正因为这样,这种函数大多被做成了dll,商业出售。换句话说,你想用得专业,就请购买。因为人家专门研究这个,肯定也是要吃饭的。天下没有免费午餐的,即使有,也是不容易消化的。

阅读剩余
THE END