如何解释片上系统 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 时完全相同。)