Как избежать сброса MSR после вызова системного вызова

Моя цель состоит в том, чтобы измерить количество различных событий производительности конкретного приложения, используя специфические для модели регистры (MSR).

Поскольку это можно сделать с помощью RDMSR и WRMSR в кольце 0, я использовал модуль Linux для вызова этих инструкций и вставил его с помощью "insmod".

Затем я создал файл символьного устройства в каталоге /dev (mknod) и вызвал его в пользовательском режиме с помощью вызова ioctl.

Это дает мне правильный счет, когда я использую вычислительный цикл между двумя вызовами ioctl. Однако, когда я использовал системный вызов ("./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 ответов

Другие вопросы по тегам