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

时间:2015-02-23 14:50:27

标签: c linux-kernel linux-device-driver performancecounter msr

我的目的是使用模型特定寄存器(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 如果有人知道答案,请告诉我。谢谢。

0 个答案:

没有答案