如何读取Intel处理器的PMC(性能监控计数器)?

nic*_*eys 5 x86 intel performancecounter inline-assembly intel-pmu

我正在尝试使用 RDMSR 和 WRMSR 指令读取 PMC(性能监控计数器)。

\n\n

在我的具有 Intel i7 6700 CPU (Skylake) 的 Linux 桌面上,我编写了一个简单的驱动程序代码:

\n\n
static int my_init(void)\n{\n    unsigned int msr;\n    u64 low, high;\n\n    msr = 0x187;\n    low = 0x412e;\n    high = 0x0;\n\n    asm volatile("1: wrmsr\\n"\n            "2:\\n"\n            : : "c" (msr), "a"(low), "d" (high) : "memory");\n\n    msr = 0xC2;\n    asm volatile("1: rdmsr\\n"\n            "2:\\n"\n            : "=a" (low), "=d" (high) : "c" (msr)); \n\n    printk("val: %lu\\n", (low) | ((high) << 32));\n\n    return  0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

参考Intel手册(18.2 ARCHITECTURAL PERFORMANCE MONITORING in Intel\xc2\xae 64 and IA-32 Architectures Software Developer\xe2\x80\x99s Manual Volume 3B: System Programming Guide),在上面的代码中,我写“0x412e”(# L3 缓存未命中数)到“0x187”(IA32_PERFEVTSEL1 MSR)并读取“0xC2”(IA32_PMC1 MSR)。

\n\n

然而,根据手册,缓存未命中的次数必须在EAX:EDX中返回(EAX包含低位),实际上,返回0作为低位(EAX)和高位(ECX)值。

\n\n

我想知道如何使用 MSR 对(IA32_PERFEVTSELx 和 IA32_PMCx)监控 Intel CPU 的性能事件。更具体地说,缓存未命中的数量是我的目标。

\n\n

如果您对此有任何想法,我将不胜感激您的建议。\n谢谢。

\n

Gri*_*tov 7

您对 PERFEVTSEL1 的编程不完整。\n佩尔菲夫塞尔1

\n\n

至少,您应该启用第 22 位计数:

\n\n
    \n
  • EN(启用计数器)标志(位 22) \xe2\x80\x94 设置时,在相应的性能监控计数器中启用性能计数;清零时,相应的计数器被禁用。
  • \n
\n