我正在尝试使用 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 的性能事件。更具体地说,缓存未命中的数量是我的目标。
如果您对此有任何想法,我将不胜感激您的建议。谢谢。