我想编写一个简单的程序,调用__get_cpuid
来获取缓存信息:
#include <cpuid.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
int leaf = atoi(argv[1]);
uint32_t eax = 0, ebx = 0, ecx = 0, edx = 0;
if (__get_cpuid(leaf, &eax, &ebx, &ecx, &edx))
{
printf("leaf=%d, eax=0x%x, ebx=0x%x, ecx=0x%x, edx=0x%x\n",
leaf, eax, ebx, ecx, edx);
}
return 0;
}
首先,我将leaf
传递为2:
$ ./a.out 2
leaf=2, eax=0x76035a01, ebx=0xf0b2ff, ecx=0x0, edx=0xca0000
由于0xff
中有ebx
,这意味着我可以从leaf=4
获取缓存信息(请参阅here):
$ ./a.out 4
leaf=4, eax=0x0, ebx=0x0, ecx=0x0, edx=0x0
但这一次,所有返回值都是0
。为什么我无法从__get_cpuid
获得有效信息?
答案 0 :(得分:2)
查看EAX = 4的链接引用,我们看到ECX需要设置为&#34;缓存级别来查询(例如0 = L1D,1 = L2,或0 = L1D,1 = L1I,2 = L2)&#34;
我无法快速找到关于__get_cpuid
的任何文档,但搜索确实出现了soure code,我注意到您需要调用__get_cpuid_count
来ecx
1}}在调用cpuid之前设置(否则你会得到随机答案 - 看起来大多为0)。