cpuID

cpuid

CPUID

在x86体系结构中,CPUID指令(由CPUID操作码标识)是一条处理器补充指令(其名称源自CPU标识),允许软件发现处理器的详细信息。

程序可以使用CPUID来确定处理器类型以及是否实现了MMX/SSE等功能。

CPUID操作码是0Fh、A2h(作为两个字节,或者A20Fh作为单个字)。
在汇编语言中,CPUID指令不接受任何参数,因为CPUID隐式地使用EAX寄存器来确定返回的信息的主要类别。在英特尔最近的术语中,这被称为CPUID leaf。CPUID应该首先用EAX=0调用,因为这将在EAX寄存器中存储CPU实现的最高EAX调用参数(leaf)。
为了获得扩展函数信息,应该使用EAX集合的最高有效位调用CPUID。要确定最高的扩展函数调用参数,请使用EAX=80000000h调用CPUID。
只有在特定于型号的寄存器的IA32_MISC_ENABLE.BOOT_NT4[位22]=0(默认情况下)时,才可以访问大于3但小于80000000的CPUID leaves。顾名思义,WindowsNT4.0直到SP6都不能正常启动,除非设置了这个位,[4],但是Windows的更高版本不需要它,所以可以假设大于4的基本叶子在当前的Windows系统上是可见的。截至2014年7月,基本有效假期长达14小时,但部分假期返回的信息未在公开文件中披露,即“保留”。
最近添加的一些叶子也有子叶子,在调用CPUID之前通过ECX寄存器选择子叶子。

Intel 关于处理器"序列号"的处理

Intel introduced a Processor Serial Number back in the Pentium III design, readable with cpuid. That raised a huge stink because of privacy concerns and Intel was forced to back down. The feature got removed in later Pentium III designs and has never been put back.

cpuid

通常的cpuid均是对CPUID指令返回值所做的处理
向CPU传EAX为1,EAX是累加器,接收所有输入输出
然后取EAX与EDX资料暂存器的输出并成为8字节

Windows 下采用 wmic path Win32_Processor get ProcessorId
Linux 下采用其他方式

大端与小端顺序

最高有效字节,有时翻译为高位。
2个16进制数为1字节。多位数的最高有效字节放在较大地址处,称为小端序,反之为大端序。
字符串采用大端序,即为正序输出。

WMI与DMI 处理器ID

注意字节的顺序是相反的:Windows以大端顺序返回结果,而Linux以小端顺序返回结果。
如Windows下,BFEBFBFF 000806EA,Linux应为EA060800 FFFBEBBF

Reference

CPUID指令: https://en.wikipedia.org/wiki/CPUID#EAX=1:_Processor_Info_and_Feature_Bits

顺序:https://stackoverflow.com/questions/20310671/acquring-processor-id-in-linux

posted @ 2021-07-26 15:45  千心  阅读(1390)  评论(0)    收藏  举报