CPUID与Cache信息的获取
上周一位同事问道getconf与sysconf()在Xeon E5620机器上获取的Cache相关信息为全0的问题。通过分析glibc中sysconf()的实现,现已查明。
在我们的环境中,glibc的版本为2.5。而实现sysconf()函数时,采用了CPUID指令。但是并没有考虑到该指令最新的变化。故在E5620处理器上得到的Cache相关信息全部为0。
我们首先说一下CPUID指令。在是X86平台上用于获取处理器相关信息的指令。比如处理器的字符串标识、支持的功能集合、Cache信息、TLB信息等。在较老的处理器上,我们使用此指令获取Cache信息的方法为:将EAX寄存器置为2,然后调用CPUID指令。指令的返回值保存在EAX、EBX、ECX、EDX寄存器中。看官可尝试使用以下代码。
voidget_cache_info()
{
unsigned int eax = 0;
unsignedint ebx = 0;
unsigned int ecx = 0;
unsigned int edx = 0;
asm volatile ("mov $2, %%eax; cpuid" : "=a"(eax), "=r" (ebx),
"=c" (ecx), "=d" (edx) :);
printf("eax: %x\n", eax);
printf("ebx: %x\n", ebx);
printf("ecx: %x\n", ecx);
<