为什么 __get_cpuid 返回 leaf=4 的所有零?



我想编写一个简单的程序来调用__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%xn",
leaf, eax, ebx, ecx, edx);
}
return 0;
}

首先,我将leaf传递为 2:

$ ./a.out 2
leaf=2, eax=0x76035a01, ebx=0xf0b2ff, ecx=0x0, edx=0xca0000

由于ebx中有0xff,这意味着我可以从leaf=4获取缓存信息(参考这里):

$ ./a.out 4
leaf=4, eax=0x0, ebx=0x0, ecx=0x0, edx=0x0

但这一次,所有返回值都0。为什么我无法从__get_cpuid获得有效信息?

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

我无法快速找到有关__get_cpuid的任何文档,但是搜索确实发现了soure代码,我注意到您需要调用__get_cpuid_count才能在调用cpuid之前设置ecx(否则你会得到随机答案 - 看起来主要是0)。

相关内容

  • 没有找到相关文章

最新更新