Gcc 为什么uuu get_cpuid为leaf=4返回所有零?

Gcc 为什么uuu get_cpuid为leaf=4返回所有零?,gcc,x86,cpu,intel,cpuid,Gcc,X86,Cpu,Intel,Cpuid,我想编写一个简单的程序,调用\uu get\u 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

我想编写一个简单的程序,调用
\uu get\u 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;
}
由于
ebx
中存在
0xff
,这意味着我可以从
leaf=4
获取缓存信息(请参阅):


但这一次,所有返回值都是
0
。为什么我不能从
\uu get\u cpuid
中获取有效信息?

查看EAX=4的链接引用,我们看到ECX需要设置为“要查询的缓存级别(例如,0=L1D、1=L2或0=L1D、1=L1I、2=L2)”


我无法很快找到任何关于
\uuuuu get\u cpuid
的文档,但搜索确实出现了,我注意到您需要调用
\uuuu get\u cpuid\u count
在调用cpuid之前设置
ecx
(否则您将得到随机答案-看起来大部分是0).

尝试使用允许指定子叶的
\uu get\u cpuid\u count
。也就是说,
\u获取\u cpuid\u计数(leaf,0,&eax,&ebx,&ecx,&edx)
@user786653它可以工作!你能详细说明一下
\u get\u cpuid
\u get\u cpuid\u count
之间的区别吗?为什么
\u获取cpuid
不工作?谢谢!我假设您得到的都是零,因为
ecx
包含的垃圾高于您的CPU拥有的缓存级别数(在使用eDRAM的CPU上可能高达4级)。IIRC,这就是CPUID告诉您已枚举最后一级缓存的方式。
$ ./a.out 2
leaf=2, eax=0x76035a01, ebx=0xf0b2ff, ecx=0x0, edx=0xca0000
$ ./a.out 4
leaf=4, eax=0x0, ebx=0x0, ecx=0x0, edx=0x0