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

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不能 。

他就是电影音乐的代名词,意大利作曲大师EnnioMorricone很久以来,一直想写一个关于电影音乐大师的系列文章,向大家介绍在电影音乐史上重要的配乐大师。这个系列会介绍大致30位大师级的电影配乐家,大约为老一辈的10位,现在已经功成名就的10位网络电影营销战火再起,三平台联手献礼我们的新生活7月23日,一部名为我们的新生活的现实题材网络电影在爱奇艺腾讯视频优酷三平台拼播上线。在影片中,电影所呈现的时代发展背景比较大,从记忆中的汶川大地震进行中的5G通讯技术革命新民法典脱下绅士面具,台积电被美国盯上了,要求45天内交出商业机密随着全球缺芯潮的持续,世界各国都难逃此劫,纷纷找办法进行补救。就连美国也深受影响,为了解决芯片短缺的局面,如今它已经急疯了,脱下绅士面具,狮子大开口了。据韩国媒体报道称,美国要求台好消息!余承东带来3个华为新动态,每一项都令美国发出感叹这两年的华为可谓是多灾多难,发展遭遇了多重限制。可坚强如华为,沉寂许久的它并没有停止发展的脚步。近期华为消费者业务CEO余承东在2021华为开发者大会上宣布了三个关于华为的好消息,高温天大金毛水中游泳降温叼水瓶西瓜皮上岸被市民赞为环保狗陕西西安气温高达40度,很多市民来到灞河边游泳,一只大金毛也酷热难耐跳进河里游泳降温。这只大金毛看到河里有水瓶子,西瓜皮等垃圾就叼上岸来,人们纷纷议论西安也有一只环保狗。大金毛将瓶游客违规吸烟烟头扔到护栏外胡大姐冒险捡拾如果是你的亲人在捡还扔吗7月的甘肃省张掖市七彩丹霞旅游景区正值旅游高峰期,一号观景台是景区中最大的观景台,49岁的胡大姐一个人负责整个一号观景台的清洁打扫工作。她不仅要负责清理观景台内的卫生,还要捡拾观景彩绘集装箱式音乐创客街区亮相西安创客聚集好看好玩有活力位于陕西省西安市曲江创客大街上的音乐创客街区是全球首个集装箱式音乐创客主题社区,将音乐元素融入了创客主题。曲江音乐创客街区是由一个个集装箱组成,与创客的工匠精神不谋而合。极简的工业实拍一小时观察美食街上的一个垃圾桶经历了什么每个城市中都存在着无数垃圾桶,这些垃圾桶始终存在于各个角落,是我们生活中不可或缺,却又极易被忽视的东西。但对于靠拾荒生存的人来说,这些垃圾桶非常重要,他们每天在这些被我们忽视的垃圾热播剧白鹿原中的人物纷纷走上美食招牌嘉轩大不代言油泼面改吃鱿鱼随着电视剧白鹿原的热播,越来越多的人喜欢上了白鹿原的风土人情。电视剧的拍摄地之一白鹿原影视城吸引了众多游客和剧迷前来参观,许多白鹿原中的人物也纷纷走上了招牌,成为这里店铺招揽生意的喝十几瓶水却基本不用上厕所40度高温下工人焊接刷漆用汗水洗衣服陕西西安持续发布高温红色预警,温度超过40度,很多户外劳动者仍然在坚持工作。西安北关正街,一些工人正在烈日下进行绿化墙安装工程。他们做着焊接刷漆安装等工作,一点一滴的给街道点缀绿色鹿子霖在白鹿原的家中摆了一桌酒菜欢迎游客剧迷来品尝陕西西安的白鹿原影视城在电视剧白鹿原热播后,迎来了越来越多的游客和剧迷前来参观游玩。电视剧白鹿原中鹿子霖的家,鹿子霖这个角色收获了许多观众的喜爱。院中还摆了一桌仿真酒菜,犹如电视剧
平时喜欢玩吃鸡原神,FindX3Pro能顶得住吗?兄弟,谢邀!你这个问题就问得有问题,FindX3Pro作为OPPO十年理想之作,在硬件配置方面都是目前行业顶流的,骁龙888处理器QHD分辨率120Hz刷新率240Hz触控采样率等有人洗澡喜欢晚上,有人喜欢早上,哪个更科学?早上洗澡好还是晚上洗澡好那?哪个更为科学那?这个因人而异吧,各有各的好处,各有各的不足。接下来我给大家分别说说早晚洗澡的优点以及缺点首先早上洗澡有助于振奋精神以及增强体能促进血液流车顶维权女子被拘!特斯拉深夜回应,新华社评谁给的底气?刚刚,据警民直通车上海微博消息,4月20日,上海警方对特斯拉车主车顶维权事件进行通报2021年4月19日11时24分许,上海青浦公安分局接报,有人在上海车展一展台内闹事。民警立即赶如何低成本实现NASHTPC软路由电视盒子游戏盒子?我是软路由nas,本地播放N1刷了Coreelec,电视盒子是T1刷了yyf。游戏盒子没有需求,不是很了解。我觉得软路由和nas是比较适合集成在一起的,都是长期开机的,对CPU性能3月新能源车销量榜特斯拉越被骂越好卖自主品牌占了80日前,乘联会发布的3月销量数据显示,3月国内新能源乘用车零售量为18。5万辆,环比增长91。5,同比增长239。6。其中纯电动车型和插电混动车型零售量分别为15。5万辆和3万辆,同省内1元,省外收2元,中国移动亲情网业务仍存漫游费?漫游费是一个颇为古老的名词,早在2017年即被三大电信运营商取消。但在近日,北京移动被曝因亲情省业务向用户收取43个月漫游费。此事登上热搜后引起了广泛争议,全国各地众多网友也担心自数字货币可能会大规模加速推行4月19日,据苏州发布消息,苏沪两地将在即将到来的五五购物节上发放消费红包,进一步推动数字人民币场景的多元化。目前,六家数字人民币试点银行已与参与商家展开对接,将推出促消费优惠活动紫光展锐发布5G业务新品牌中证网讯(记者吴科任)4月20日,以构go为主题的2021紫光展锐创见未来大会在线上举行。会上,展锐发布了5G业务新品牌唐古拉系列,推出Cat。1bis新技术特性,并分享了创新业务傲慢强横且不负责!决不妥协被批的特斯拉陶琳什么来头近期的负面都是她贡献的我觉得她也很专业,背后应该是有(人)的最近几次特斯拉事件都和她有关,我们出钱做车辆检测,但她不同意,要求巨额赔偿,我们认为她的诉求是不合理的,我们不可能答应特苹果春季发布会新品汇总没AirPods3和iPadmini6,但是有它们今晚的苹果春季发布会大约一个小时,很多人都是关注这次会有哪些新品呢?这次发布会没有AirPods3没有iPadmini6,但是下面这些产品应该能满足你的需求iPhone12迎来了新3大科技巨头展开合作,启动自研芯片项目,华为将涅槃重生?众所周知,我国科技发展起步晚,很多科学技术国外都已经成熟了,我国才开始起步。因此,这也导致很多科技形成了垄断技术,想要打破垄断自己研究出来,困难程度可想而知。所以,我国能够取得现在