范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

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

  最近测试反馈了一个问题,每次重启服务器,我们某个版本的业务系统中的机器码都会改变,导致根据机器码算出来的许可证失效,从而使软件无法使用。 这个问题反馈了有一段时间了,但是本地一直没复现。然后前几天测试说又复现了,马上去看了下测试环境,服务器是一台国产化FT S2500服务器,验证了下,果然如此,马上去看了下关键代码。public static String executeLinuxCmd(int type) {         try {             String cmd = "dmidecode |grep "Serial Number"";             if (type == 1) {                 cmd = "fdisk -l";             }             //...         } catch (IOException e) {//         }         return null;     }          public static String getSerialNumber(int type, String record, String symbol) {             String execResult = executeLinuxCmd(type);             String[] infos = execResult.split(" ");             for (String info : infos) {                 info = info.trim();                 if (info.indexOf(record) != -1) {                     String[] sn = info.replace(" ", "").split(symbol);                     return sn[1];                 }             }        //...         }                /**      * 获取CPUID、硬盘序列号、MAC地址、主板序列号      *      * @return      */     public static Map getAllSn() {         String os = System.getProperty("os.name");         Map snVo = new HashMap();         if ("LINUX".equalsIgnoreCase(os)) {             String mainboardNumber = getSerialNumber(0, "Serial Number", ":");             String diskNumber = getSerialNumber(1, "Disk identifier", ":");             snVo.put("diskid", diskNumber == null ? "tmpDiskId" : diskNumber.toUpperCase().replace(" ", ""));             snVo.put("mainboard", mainboardNumber == null ? "tmpMainboard" : mainboardNumber.toUpperCase().replace(" ", ""));         } else {
  这下明白了,它是取的CPU序列号作为机器码。dmidecode的输出中有多个Serial Number,它只取了第一个,恰恰就是Processor Information,也就是我们常说的CPU序列号。Handle 0x0001, DMI type 4, 48 bytes Processor Information         Socket Designation: CPU0         Type: Central Processor         Family: ARMv8         Manufacturer: Phytium         ID: 33 66 1F 70 00 00 00 00         Signature: Implementor 0x70, Variant 0x1, Architecture 15, Part 0x663, Revision 3         Version: S2500         Voltage: 0.8 V         External Clock: 100 MHz         Max Speed: 2100 MHz         Current Speed: 2100 MHz         Status: Populated, Enabled         Upgrade: Unknown         L1 Cache Handle: 0x1001         L2 Cache Handle: 0x1002         L3 Cache Handle: 0x1003         Serial Number: A5F9B0AD-E023-7E89-CF01-47772188AD003         Asset Tag: 9EEC0F35-D6DB-EE11-4788-C0EE56755439         Part Number: ABD15C29-35D3-1659-BFAF-AD57F39874C3         Core Count: 64         Core Enabled: 64         Thread Count: 64         Characteristics:                 64-bit capable                 Multi-Core                 Execute Protection                 Enhanced Virtualization                 Power/Performance Control
  CPU支持过序列号功能,但是被人指责侵犯隐私,所以现在的规范中,CPU完全没有所谓的序列号。
  关于CPU序列号,其实还有一段历史。在奔腾3中短暂地引入过这个功能,但是后来很快就被移除了。
  EAX=3: Processor Serial Number
  See also: Pentium III § Controversy about privacy issues(https://en.wikipedia.org/wiki/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来判断。1.Windows下获取CPU ID
  如果是windows系统,根据MSDN文档:http://msdn.microsoft.com/en-us/library/aa394373(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#include "stdafx.h" #include   int main() {       int32_t deBuf[4];       __cpuidex(deBuf, 01, 0);     printf("%.8x%.8x", deBuf[3], deBuf[0]);       getchar();     return 0; }
  本地没有msvc编译环境,就不做测试了。2.linux x86/amd64获取CPU ID
  在Linux上呢,我们也可以用C内联汇编来实现#include  static inline void native_cpuid(unsigned int *eax, unsigned int *ebx,                                 unsigned int *ecx, unsigned int *edx) {         /* ecx is often an input as well as an output. */         asm volatile("cpuid"             : "=a" (*eax),               "=b" (*ebx),               "=c" (*ecx),               "=d" (*edx)             : "0" (*eax), "2" (*ecx)); }  int main(int argc, char **argv) {   unsigned eax, ebx, ecx, edx;    eax = 1; /* processor info and feature bits */   native_cpuid(&eax, &ebx, &ecx, &edx);    printf("stepping %d ", eax & 0xF);   printf("model %d ", (eax >> 4) & 0xF);   printf("family %d ", (eax >> 8) & 0xF);   printf("processor type %d ", (eax >> 12) & 0x3);   printf("extended model %d ", (eax >> 16) & 0xF);   printf("extended family %d ", (eax >> 20) & 0xFF);    /* EDIT */   eax = 3; /* processor serial number */   native_cpuid(&eax, &ebx, &ecx, &edx);    /** see the CPUID Wikipedia article on which models return the serial        number in which registers. The example here is for        Pentium III */   printf("cpu serial number 0x%08x%08x ", edx, ecx);
  native_cpuid这段代码来自linux kernel里的源码,其实gcc里有cpuid.h这个文件,它封装了ASM代码,直接引入即可。
  看下运行结果:[root@localhost xx]# gcc cpu_x86.c -o cpu_x86 [root@localhost xx]# ./cpu_x86 stepping 4 model 5 family 6 processor type 0 extended model 5 extended family 0 serial number 0x0000000000000000
  如上所示,eax, ebx, ecx, edx这四个寄存器对应的内容就是cpu id。跟dmidecode的结果比较下,可以对应上。[root@localhost xx]# dmidecode -t 4 # dmidecode 3.0 Getting SMBIOS data from sysfs. SMBIOS 2.7 present.  Handle 0x0004, DMI type 4, 42 bytes Processor Information         Socket Designation: CPU #000         Type: Central Processor         Family: Unknown         Manufacturer: GenuineIntel         ID: 54 06 05 00 FF FB AB 0F         Version: Intel(R) Xeon(R) Gold 6152 CPU @ 2.10GHz         Voltage: 3.3 V         External Clock: Unknown         Max Speed: 30000 MHz         Current Speed: 2100 MHz         Status: Populated, Enabled         Upgrade: ZIF Socket         L1 Cache Handle: 0x0016         L2 Cache Handle: 0x0018         L3 Cache Handle: Not Provided         Serial Number: Not Specified         Asset Tag: Not Specified         Part Number: Not Specified         Core Count: 1         Core Enabled: 1         Characteristics:                 64-bit capable                 Execute Protection  3.aarch64下获取CPU ID
  如果是aarch64架构,CPU架构不一样,就不能用同样的ASM汇编了,找了下ARM官方文档,https://developer.arm.com/documentation/ddi0500/d/system-control/aarch64-register-descriptions/main-id-register–el1?lang=en,参考CPU架构,可以从MIDR_EL1寄存器获取#include   int main(int argc, char **argv) {    unsigned long arm_cpuid;   __asm__("mrs %0, MIDR_EL1" : "=r"(arm_cpuid));   printf("%-20s: 0x%016lx ", "MIDR_EL1=", arm_cpuid); }
  输出如下[root@master98 xx]# gcc cpu.c -o cpu [root@master98 xx]# ./cpu MIDR_EL1=           : 0x00000000701f6633
  正好与dmidecode中的ID对应。经过测试,重启后cpuid是不会改变的。4.CPU ID or Serial Number?
  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不能 。

荷兰也在研发芯片新技术,ASML似乎被全世界抛弃近日拥有ASML公司的荷兰正式官宣,将斥资11亿欧元研发下一代芯片技术光子芯片,为何荷兰也在投入芯片新技术的研发,原因是随着芯片制造技术日益接近天花板,全球都已展开了芯片新技术的研你家的电视升级了吗?更新之后体验飞升,家里长辈都夸好用!现在的智能电视,就像我们的手机一样,很多时候为了维护系统漏洞更新功能等需要,厂商都会定期全面推送新的系统包,不知道你们家的电视升级了吗?由于我家买的是小米的电视,因此今天来分享下更没有订单司机生存困难,网约车平台都干了什么?网约车内参讯(文彭小伟)近半个月,网约车内参持续刊发了各地司机师傅订单少流水少的情况。4月15日,成都又有网约车司机向我们爆料,当地不少网约车司机聚集在一起要求退车。。艰难时刻,各应采儿夫妇代言索爱,8GB256GB不足九百,穷人都买得起应采儿夫妇代言索爱,8GB256GB仅899元,百元机皇性价比不输小米,OV如今的手机功能非常多,可以用于大家的工作和生活,可以办公手机化,特别是现在特殊时期,限制了很多人员的流动原来真的有简约又大气的车!AITO问界M7来了近日工信部刚刚公布了最新第355批道路机动车辆生产企业及产品公告,AITO第二款车问界M7来了!这是一款什么样的车?用手机来比喻,在华为所有的机型中,Mate7对于华为而言是一款里高清大图来了,奇瑞QQ无界Pro造型泄密!4月2日,奇瑞QQ官宣了新款车型奇瑞QQ无界Pro定名并且开启了限时盲订。在无界Pro盲订开启之后,这款集战斗力魔法力吸睛力和防御力于一身性能小怪兽以376分钟订单量破万的成绩创造我为何选择一加10Pro外观性能和拍照的超预期表现大家应该明显地感受到,在挑选手机的时候对于硬件的纸面参数我们关注的越来越少了,更多聚焦在综合体验方面。这主要是硬件性能已经过剩,所以像一加这样深度关注用户体验的厂牌受到了更多机友们华为叛将正式造车,首款车型完整公布,团队仅有千余人现在很多公司都在积极地布局智能电动汽车行业,有华为小米这样的手机行业巨头,奔驰大众这些传统汽车企业,从这点可以看出,智能电动汽车将成为万亿规模的超级风口。所以无论是行业巨头还是传统混合动力车型的油耗究竟有多低混合动力的车型究竟有哪些优点,燃油车纯电动混合动力这三种类型到底该如何选择?今天,它来了!混合动力车型的特点混合动力车型分两种插电混动和油电混动。插电混动是两套驱动系统可以完全纯电恒大汽车终于到店!恒驰5外观似保时捷,续航602KM,或15万这两年购买恒大房子的小伙伴,心里一定不会好受吧?恒大也一直在积极自救,所以恒大又瞄准了新能源汽车赛道,毕竟这个赛道相当的宽广,而且很有实力。目前恒大的第一款产品恒驰5已经曝光,并且威马汽车发展一路好转再次将前沿技术融入新车型威马M7环顾目前,智能新能源汽车的发展一路好转。作为智能汽车的头号实力派威马汽车,以科技包容性为初衷,在推出众多威马SUV车型后,再次将前沿技术融入新车型威马M7,让大众感受到智能驾驶的魅
马斯克不到万不得已不希望发展任何武器技术头号周刊马斯克我当然希望spaceX和特斯拉不要强迫发展任何一种武器技术,只有万在不得已的情况下才会做这样的事,我想我能在冲突中有所帮助,我试着采取一系列最有可能提高未来往好的方向奇瑞新能源小蚂蚁,技术领先不止一筹奇瑞新能源小蚂蚁,技术领先不止一筹。如今,新能源车技术成熟么?很多新能源品牌都承诺三电终身质保,是不是就证明技术已经很成熟了呢?不,这只能说明新能源车的三电系统技术已经非常成熟了,从京东卸任后,刘强东开始套现了前段时间由于阿里的市值缩水,马云一直占据热搜榜。进入4月份以后,退居幕后的刘强东接替了马云的热搜位置。4月份,刘强东卸任京东CEO,将事务全权交给了接班人徐雷。另外,由于上海受疫时安运科技2021年净利1646。35万同比增长24。48市场需求增加挖贝网5月5日,安运科技(430562)近日发布2021年度报告,报告期内公司实现营业收入77,722,993。03元,同比增长13。51归属于挂牌公司股东的净利润16,463,5一夫一妻真的会阻止人类进化,太可怕了,是真的吗奇妙知识季一夫一妻居然会让人类停止进化,导致自然选择失效,太可怕了,这究竟是为什么!相信很多人都看过物种起源,对达尔文提到的很多观点相信大家都知道,但是有的人却也不知道。比如19世新买的苹果手机必须设置的功能,看看你都设置了吗?苹果手机目前还是非常受欢迎的,当你买了新iPhone,为了使用更方便,阿楠推荐几个实用的设置,绝对用的上新买的苹果手机必须设置的功能,看看你都设置了吗?苹果手机目前还是非常受欢迎的罚款366亿美元,欧盟正式对苹果开刀,限制第三方支付成争议焦点近来苹果公司限制第三方支付成争议焦点,欧盟正式对苹果开刀,指责苹果公司违反竞争法。对于这一指责,苹果公司予以否认,并且承诺将与欧盟委员会进行接触。此消息曝光后引发争议,如果欧盟对苹谁举报了苹果?苹果或因垄断被罚2400亿,马斯克接棒吐槽苹果税中国经济周刊记者周瑞峰编译近日,欧盟反垄断机构对苹果公司(Apple)提出指控,称苹果滥用其在移动支付领域的主导地位,限制用户在其移动设备上使用NFC非接触式支付技术。(截图来源彭145元的抹布26元的原装卡针苹果销售新高度145元的抹布,还只能用来擦屏幕?上次听到这种事还是Tiffany的回形针你没有看错,普通商店2元一盒的回形针,在Tiffany要1500刀,这就要合人民币那真是天价了,就是全金的美国天空传来一阵巨响,突然飞过一个熊熊火球,最后砸到地面如果天上有一个高速飞行的物体坠落到地面,可能会对地面造成比较严重的破坏。像月球表面就存在大量陨石坑,这些陨石坑主要都是来自宇宙深处的小行星彗星陨石等小天体撞击月球时留下的。相比之下索尼系列微单又开始搞活动了!这次价格全面探底,正是入手的时机最近一段时间,微单缺货严重,尼康富士和索尼的多数主流微单机型都买不到,这让很多小伙伴比较郁闷。要知道,现在很多人都有提升画质的要求,购买全画幅高像素微单成为很多人的选择,价格不是问