Skip to the content.

cpuid 的 leaf 和 subleaf 是做什么的

显然, 00000000:00 就是 leaf 和 subleaf 了

调用 cpuid 指令的时候,一共两个寄存器

参考 target/i386/cpu.c 的 host_cpuid() 函数:

void host_cpuid(uint32_t function, uint32_t count,
                uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx)
{
    uint32_t vec[4];

    asm volatile("cpuid"
                 : "=a"(vec[0]), "=b"(vec[1]),
                   "=c"(vec[2]), "=d"(vec[3])
                 : "0"(function), "c"(count) : "cc");

https://github.com/tycho/cpuid 非常的方便,我们应该实现一个类似的功能出来才可以。

./cpuid -d -c 1 这个功能很好用,但是我们也只是需要这个功能

🧀  ./cpuid -d -c 1
CPU 1:
CPUID 00000000:00 = 00000020 756e6547 6c65746e 49656e69 |  ...GenuntelineI
CPUID 00000001:00 = 000b0671 01800800 7ffafbff bfebfbff | q...............
CPUID 00000002:00 = 00feff01 000000f0 00000000 00000000 | ................
CPUID 00000003:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 00000004:00 = fc004121 02c0003f 0000003f 00000000 | !A..?...?.......
CPUID 00000004:01 = fc004122 01c0003f 0000003f 00000000 | "A..?...?.......
CPUID 00000004:02 = fc01c143 03c0003f 000007ff 00000000 | C...?...........
CPUID 00000004:03 = fc1fc163 02c0003f 0000bfff 00000004 | c...?...........
CPUID 00000004:04 = 00000000 00000000 00000000 00000000 | ................
CPUID 00000005:00 = 00000040 00000040 00000003 10102020 | @...@.......  ..
CPUID 00000006:00 = 00dfcff7 00000002 00000409 00000003 | ................
CPUID 00000007:00 = 00000002 239c27eb 98c027bc fc1cc410 | .....'.#.'......
CPUID 00000007:01 = 00400810 00000000 00000000 00000000 | ..@.............
CPUID 00000007:02 = 00000000 00000000 00000000 0000001f | ................
CPUID 00000008:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 00000009:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 0000000a:00 = 07300605 00000000 00000007 00008603 | ..0.............
CPUID 0000000b:00 = 00000001 00000002 00000100 00000001 | ................
CPUID 0000000b:01 = 00000007 00000020 00000201 00000001 | .... ...........
CPUID 0000000c:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 0000000d:00 = 00000207 00000a88 00000a88 00000000 | ................
CPUID 0000000d:01 = 0000000f 00000570 00019900 00000000 | ....p...........
CPUID 0000000d:02 = 00000100 00000240 00000000 00000000 | ....@...........
CPUID 0000000e:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 0000000f:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 00000010:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 00000011:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 00000012:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 00000013:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 00000014:00 = 00000001 0000005f 00000007 00000000 | ...._...........
CPUID 00000014:01 = 02490002 003f003f 00000000 00000000 | ..I.?.?.........
CPUID 00000015:00 = 00000002 0000009c 0249f000 00000000 | ..........I.....
CPUID 00000016:00 = 00000bb8 000016a8 00000064 00000000 | ........d.......
CPUID 00000017:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 00000018:00 = 00000008 00000000 00000000 00000000 | ................
CPUID 00000018:01 = 00000000 00080001 00000020 00004022 | ........ ..."@..
CPUID 00000018:02 = 00000000 00080006 00000004 00004022 | ............"@..
CPUID 00000018:03 = 00000000 0010000f 00000001 00004125 | ............%A..
CPUID 00000018:04 = 00000000 00040001 00000010 00004024 | ............$@..
CPUID 00000018:05 = 00000000 00040006 00000008 00004024 | ............$@..
CPUID 00000018:06 = 00000000 00080008 00000001 00004124 | ............$A..
CPUID 00000018:07 = 00000000 00080007 00000080 00004043 | ............C@..
CPUID 00000018:08 = 00000000 00080009 00000080 00004043 | ............C@..
CPUID 00000019:00 = 00000007 00000014 00000003 00000000 | ................
CPUID 0000001a:00 = 40000001 00000000 00000000 00000000 | ...@............
CPUID 0000001b:00 = 00000001 00000001 00000000 00000000 | ................
CPUID 0000001b:01 = 00000000 00000000 00000000 00000000 | ................
CPUID 0000001c:00 = 4000000b 00000007 00000007 00000000 | ...@............
CPUID 0000001d:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 0000001e:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 0000001f:00 = 00000001 00000002 00000100 00000001 | ................
CPUID 0000001f:01 = 00000007 00000020 00000201 00000001 | .... ...........
CPUID 00000020:00 = 00000000 00000001 00000000 00000000 | ................
CPUID 40000000:00 = 00000000 00000001 00000000 00000000 | ................
CPUID 80000000:00 = 80000008 00000000 00000000 00000000 | ................
CPUID 80000001:00 = 00000000 00000000 00000121 2c100800 | ........!......,
CPUID 80000002:00 = 68743331 6e654720 746e4920 52286c65 | 13th Gen Intel(R
CPUID 80000003:00 = 6f432029 54286572 6920294d 33312d39 | ) Core(TM) i9-13
CPUID 80000004:00 = 4b303039 00000000 00000000 00000000 | 900K............
CPUID 80000005:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 80000006:00 = 00000000 00000000 08007040 00000000 | ........@p......
CPUID 80000007:00 = 00000000 00000000 00000000 00000100 | ................
CPUID 80000008:00 = 0000302e 00000000 00000000 00000000 | .0..............
CPUID 80860000:00 = 00000000 00000001 00000000 00000000 | ................
CPUID c0000000:00 = 00000000 00000001 00000000 00000000 | ................
➜  share ./cpuid -d -c 1
CPU 1:
CPUID 00000000:00 = 0000001f 756e6547 6c65746e 49656e69 | ....GenuntelineI
CPUID 00000001:00 = 000b0671 011f0800 fffa3223 1f8bfbff | q.......#2......
CPUID 00000002:00 = 00000001 00000000 0000004d 002c307d | ........M...}0,.
CPUID 00000003:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 00000004:00 = 78000121 01c0003f 0000003f 00000001 | !..x?...?.......
CPUID 00000004:01 = 78000122 01c0003f 0000003f 00000001 | "..x?...?.......
CPUID 00000004:02 = 78000143 03c0003f 00000fff 00000001 | C..x?...........
CPUID 00000004:03 = 7807c163 03c0003f 00003fff 00000006 | c..x?....?......
CPUID 00000004:04 = 00000000 00000000 00000000 00000000 | ................
CPUID 00000005:00 = 00000000 00000000 00000003 00000000 | ................
CPUID 00000006:00 = 00000004 00000000 00000000 00000000 | ................
CPUID 00000007:00 = 00000001 219c07ab 1840073c ac004410 | .......!<.@..D..
CPUID 00000007:01 = 00000810 00000000 00000000 00000000 | ................
CPUID 00000008:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 00000009:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 0000000a:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 0000000b:00 = 00000000 00000001 00000100 00000001 | ................
CPUID 0000000b:01 = 00000005 0000001f 00000201 00000001 | ................
CPUID 0000000c:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 0000000d:00 = 00000207 00000a88 00000a88 00000000 | ................
CPUID 0000000d:01 = 0000000f 00000348 00000000 00000000 | ....H...........
CPUID 0000000d:02 = 00000100 00000240 00000000 00000000 | ....@...........
CPUID 0000000e:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 0000000f:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 00000010:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 00000011:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 00000012:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 00000013:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 00000014:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 00000015:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 00000016:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 00000017:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 00000018:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 00000019:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 0000001a:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 0000001b:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 0000001c:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 0000001d:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 0000001e:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 0000001f:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 40000000:00 = 40000001 4b4d564b 564b4d56 0000004d | ...@KVMKVMKVM...
CPUID 40000001:00 = 01007afb 00000000 00000000 00000000 | .z..............
CPUID 80000000:00 = 80000008 756e6547 6c65746e 49656e69 | ....GenuntelineI
CPUID 80000001:00 = 000b0671 00000000 00000121 2c100800 | q.......!......,
CPUID 80000002:00 = 68743331 6e654720 746e4920 52286c65 | 13th Gen Intel(R
CPUID 80000003:00 = 6f432029 54286572 6920294d 33312d39 | ) Core(TM) i9-13
CPUID 80000004:00 = 4b303039 00000000 00000000 00000000 | 900K............
CPUID 80000005:00 = 01ff01ff 01ff01ff 40020140 40020140 | ........@..@@..@
CPUID 80000006:00 = 00000000 42004200 02008140 00808140 | .....B.B@...@...
CPUID 80000007:00 = 00000000 00000000 00000000 00000000 | ................
CPUID 80000008:00 = 0000302e 0100d000 0000501e 00000000 | .0.......P......
CPUID 80860000:00 = 00000000 00000000 00000000 00000000 | ................
CPUID c0000000:00 = 00000000 00000000 00000000 00000000 | ................

虚拟机中观测到的内容。

nixos 中的 cpuid 中似乎总是用的这个: http://www.etallen.com/cpuid.html

使用这个命令也是类似的效果: cpuid -1 -r

通过这两个命令可以很容易知道,cpuid 中的 leaf 和 sub leaf 的含义是什么:

cpuid -r 1
cpuid -r -1 -l 7 -s 1

cpuid 如何知道一共有多少个 Leaf 的 ?

也就是,有的 leaf 会输出,有的不会输出,所以是如何知道 那些 leaf 不该输出的。

似乎 clearcpuid=156 带来的变化是什么?

diff --git a/docs/kernel/cpuinfo/cpuid.md b/docs/kernel/cpuinfo/cpuid.md
index 5dcf882..4970bc9 100644
--- a/docs/kernel/cpuinfo/cpuid.md
+++ b/docs/kernel/cpuinfo/cpuid.md
@@ -26,7 +26,7 @@ CPUID 0000000b:00 = 00000001 00000002 00000100 00000001 | ................
 CPUID 0000000b:01 = 00000007 00000020 00000201 00000001 | .... ...........
 CPUID 0000000c:00 = 00000000 00000000 00000000 00000000 | ................
 CPUID 0000000d:00 = 00000207 00000a88 00000a88 00000000 | ................
-CPUID 0000000d:01 = 0000000f 00000670 00019900 00000000 | ....p...........
+CPUID 0000000d:01 = 0000000f 00000570 00019900 00000000 | ....p...........
 CPUID 0000000d:02 = 00000100 00000240 00000000 00000000 | ....@...........
 CPUID 0000000e:00 = 00000000 00000000 00000000 00000000 | ................
 CPUID 0000000f:00 = 00000000 00000000 00000000 00000000 | ................
@@ -132,3 +132,6 @@ CPUID c0000000:00 = 00000000 00000000 00000000 00000000 | ................

实际上,不是体现在 cpuid 上的差别,而是 xsave 大小的差别

🧀  diff after-clearcpuid before-clearcpuid
14c14
<       process local APIC physical ID = 0x0 (0)
---
>       process local APIC physical ID = 0x8 (8)
196c196
<       index of CPU's row in feedback struct   = 0x0 (0)
---
>       index of CPU's row in feedback struct   = 0x1 (1)
353c353
<       extended APIC ID                      = 0
---
>       extended APIC ID                      = 8
397c397
<       SAVE area size in bytes                     = 0x00000570 (1392)
---
>       SAVE area size in bytes                     = 0x00000670 (1648)
673c673
<       x2APIC ID of logical processor = 0x0 (0)
---
>       x2APIC ID of logical processor = 0x8 (8)
807c807
<    (APIC synth): PKG_ID=0 CORE_ID=0 SMT_ID=0
---
>    (APIC synth): PKG_ID=0 CORE_ID=4 SMT_ID=0

所以,是不是可以通过操作系统来修改的。

有趣的工具

https://github.com/Dr-Noob/cpufetch

这个工具可以看看

	mkdir /dev/cpu
	for i in 0 1 2 3 4 5 6 7
	do
		mkdir /dev/cpu/$i ; cd /dev/cpu/$i
		mknod cpuid c 203 $i
		mknod msr c 202 $i
	done

https://github.com/kernelslacker/x86info

原来 msr 的确是可以获取的

python3 -c ‘import struct;f=open(“/dev/cpu/0/msr”, “rb”);f.seek(0x3a);print(hex(struct.unpack(“Q”,f.read(8))[0]))’

有趣的问题

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。