如何解释片上系统 cpu 供应商字符串?
How to interpret System-On-Chip cpu vendor string?
英特尔手册定义 cpuid
叶子 0x17
负责 cpu 供应商字符串。输出取决于 ecx
中的值。所以根据注释:
Leaf 17H output depends on the initial value in ECX
. SOC Vendor
Brand String is a UTF-8 encoded string padded with trailing bytes of
00H.The complete SOC Vendor Brand String is constructed by
concatenating in ascending order of EAX:EBX:ECX:EDX
and from the
sub-leaf 1 fragment towards sub-leaf 3.
我编写了以下程序集并希望得到一些合理的字符串:
;Set the System-On-Chip value to eax
mov eax, 0x17
;Set the first subleaf in ecx
mov ecx, 0x01
cpuid
cpuid
指令的结果如下:
(gdb) p/x $eax
= 0x7d0
(gdb) p/x $ebx
= 0xfa0
(gdb) p/x $ecx
= 0x64
(gdb) p/x $edx
= 0x0
简单地连接寄存器内容(丢弃尾随 0x00
字节)不会产生可读的内容:
= 0x7fffffffdea0 "d070\a"
问题:如何解释 SOC 供应商字符串?
您的处理器不支持 cpuid leaf 0x17。使用 cpuid leaf 0 找出最大支持的 cpuid 叶(returned in eax)。例如,在我的系统上,最大的 cpuid 叶是 0x0f。当 cpuid 与大于最大支持值的叶值一起使用时,处理器 returns 来自最大支持值,这就是为什么您会得到看似垃圾值的原因。 (如果您尝试使用 cpuid leaf 0x16,您会发现您获得的 return 值与使用 0x17 时完全相同。)
英特尔手册定义 cpuid
叶子 0x17
负责 cpu 供应商字符串。输出取决于 ecx
中的值。所以根据注释:
Leaf 17H output depends on the initial value in
ECX
. SOC Vendor Brand String is a UTF-8 encoded string padded with trailing bytes of 00H.The complete SOC Vendor Brand String is constructed by concatenating in ascending order ofEAX:EBX:ECX:EDX
and from the sub-leaf 1 fragment towards sub-leaf 3.
我编写了以下程序集并希望得到一些合理的字符串:
;Set the System-On-Chip value to eax
mov eax, 0x17
;Set the first subleaf in ecx
mov ecx, 0x01
cpuid
cpuid
指令的结果如下:
(gdb) p/x $eax
= 0x7d0
(gdb) p/x $ebx
= 0xfa0
(gdb) p/x $ecx
= 0x64
(gdb) p/x $edx
= 0x0
简单地连接寄存器内容(丢弃尾随 0x00
字节)不会产生可读的内容:
= 0x7fffffffdea0 "d070\a"
问题:如何解释 SOC 供应商字符串?
您的处理器不支持 cpuid leaf 0x17。使用 cpuid leaf 0 找出最大支持的 cpuid 叶(returned in eax)。例如,在我的系统上,最大的 cpuid 叶是 0x0f。当 cpuid 与大于最大支持值的叶值一起使用时,处理器 returns 来自最大支持值,这就是为什么您会得到看似垃圾值的原因。 (如果您尝试使用 cpuid leaf 0x16,您会发现您获得的 return 值与使用 0x17 时完全相同。)