nic*_*eys 5 x86 intel performancecounter inline-assembly intel-pmu
我正在尝试使用 RDMSR 和 WRMSR 指令读取 PMC(性能监控计数器)。
\n\n在我的具有 Intel i7 6700 CPU (Skylake) 的 Linux 桌面上,我编写了一个简单的驱动程序代码:
\n\nstatic 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}\nRun 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至少,您应该启用第 22 位计数:
\n\n