Как избежать сброса 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.
Пожалуйста, дайте мне знать, если кто-нибудь знает ответ. Спасибо заранее.