为什么__get_cpuid为leaf = 4返回全零?

时间:2017-09-18 06:08:12

标签: gcc x86 cpu intel cpuid

我想编写一个简单的程序,调用__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获得有效信息?

1 个答案:

答案 0 :(得分:2)

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

我无法快速找到关于__get_cpuid的任何文档,但搜索确实出现了soure code,我注意到您需要调用__get_cpuid_countecx 1}}在调用cpuid之前设置(否则你会得到随机答案 - 看起来大多为0)。