如何找到x86处理器的cpu缓存大小

时间:2010-09-29 02:48:53

标签: caching assembly x86

我想使用x86汇编语言找到L1或L2缓存的cpu缓存大小。我听说cpuid和MSR寄存器有系统特定的数据。有人可以帮助我,我怎么能得到尺寸。

3 个答案:

答案 0 :(得分:3)

以下是使用 CPUID 指令查找内容的最小示例:

#include <stdio.h>
#include <limits.h>

#define cpuid(id) __asm__( "cpuid" : "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx) : "a"(id), "b"(0), "c"(0), "d"(0))
#define b(val, base, end) ((val << (__WORDSIZE-end-1)) >> (__WORDSIZE-end+base-1))

int main(int argc, char **argv)
{
        unsigned long eax, ebx, ecx, edx;

        cpuid(0);
        printf("identification: \"%.4s%.4s%.4s\"\n", (char *)&ebx, (char *)&edx, (char *)&ecx);

        printf("cpu information:\n");

        cpuid(1);
        printf(" family %ld model %ld stepping %ld efamily %ld emodel %ld\n",
                        b(eax, 8, 11), b(eax, 4, 7), b(eax, 0, 3), b(eax, 20, 27), b(eax, 16, 19));
        printf(" brand %ld cflush sz %ld*8 nproc %ld apicid %ld\n",
                        b(ebx, 0, 7), b(ebx, 8, 15), b(ebx, 16, 23), b(ebx, 24, 31));

        cpuid(0x80000006);
        printf("L1 cache size (per core): %ld KB\n", b(ecx, 16, 31));

        return(0);
}

答案 1 :(得分:1)

您可以使用CPUID指令。如果将EAX寄存器设置为某些值,则可以在EAX,EBX,ECX和EDX寄存器中获得所需的信息。

您可以在AMD的this guide中获得更多信息。

答案 2 :(得分:0)

正如Soravux建议的那样,CPUID指示是你想要看到的。 (您可能需要查看CPUID,例如英特尔64和IA-32架构软件开发人员手册,第2A卷,here)。

您可能最感兴趣的功能是:CPUID.EAX=02h和/或CPUID.EAX=04h(取决于您的确切需求)。这些功能提供了相当多的输出,所以我不会在这里详细介绍任何细节,但是英特尔和AMD的手册应该包含你需要的所有内容。