3

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

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

static int my_init(void)
{
    unsigned int msr;
    u64 low, high;

    msr = 0x187;
    low = 0x412e;
    high = 0x0;

    asm volatile("1: wrmsr\n"
            "2:\n"
            : : "c" (msr), "a"(low), "d" (high) : "memory");

    msr = 0xC2;
    asm volatile("1: rdmsr\n"
            "2:\n"
            : "=a" (low), "=d" (high) : "c" (msr)); 

    printk("val: %lu\n", (low) | ((high) << 32));

    return  0;
}

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

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

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

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

4

2 回答 2

5

您对 PERFEVTSEL1 的编程不完整。 PERFEVTSEL1

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

  • EN(启用计数器)标志(位 22)— 设置时,在相应的性能监控计数器中启用性能计数;当清零时,相应的计数器被禁用。
于 2018-03-09T06:26:31.523 回答
-1

您可以查看此源代码HPCTestDrv.c

于 2019-04-09T22:56:42.947 回答