如何避免调用系统调用后MSR重置

问题描述 投票:0回答:1

我的目的是使用模型特定寄存器(MSR)来测量特定应用程序的不同性能事件的计数。

因为这可以通过在环 0 处使用 RDMSR 和 WRMSR 来完成,所以我使用 Linux 模块来调用这些指令并使用“insmod”插入它。

然后我在 /dev 目录(mknod)中创建了字符设备文件,并使用 ioctl 调用在用户模式下调用它。

当我在两个 ioctl 调用之间使用计算 for 循环时,它给了我正确的计数。 但是,当我使用 system("./sample") 调用而不是循环时,它给了我错误的值。

struct MsrInOut {
        unsigned int op;                            // MsrOperation
        unsigned int ecx;                           // msr identifier
        union {
                struct {
                        unsigned int eax;           // low double word
                        unsigned int edx;           // high double word
                };
                unsigned long long value; // quad word
        };
};
{ MSR_WRITE, 0x186, 0x00410280, 0x00 }, // ia32_perfevtsel1,lcache misses(very important)

ioctl(fd, IOCTL_MSR_CMDS, (long long)msr_start);
system("./sample"); //binary file of same computational for loop 
ioctl(fd, IOCTL_MSR_CMDS, (long long)msr_stop);

我读到了这些调用并知道这些调用会重置 MSR。有什么办法可以克服这个问题吗?或者还有其他方法可以在 C 程序中运行应用程序吗?

我提到了这个http://www.mindfruit.co.uk/2012/11/a-linux-kernel-module-for.html
如果有人知道答案,请告诉我。提前谢谢。

c linux-kernel linux-device-driver performancecounter msr
1个回答
0
投票

MSR 值纯粹是硬件特定的,即使 CPU 的微代码更新也可能会发生变化,因此我不建议使用这些值编写任何特殊代码,因为无论您做什么,可用的功能都可能消失或不稳定。相反,请使用跨不同架构工作的内核性能计数器(显然,不同的硬件具有不同数量的可用探测器,但 API 保持不变)。详情请参阅以下内容:

https://perfwiki.github.io/main/

(甚至 ChatGPT 也了解这些内容,因此您可以使用它来帮助解决学习曲线。)

© www.soinside.com 2019 - 2024. All rights reserved.