Как рассчитать максимальную частоту процессора из драйвера режима ядра WDM?

Проблема заключается в следующем: я пытаюсь вычислить частоту процессора в драйвере WDM режима ядра на основе IOCTL образец скелета но он не хочет компилироваться, если я пытаюсь использовать QueryPerformanceFrequency или QueryPerformanceCounter. Я чувствую, что может быть, потому что это драйвер режима ядра, он не позволит мне включить Windows.h, который содержит эти методы — это заставляет меня использовать Ntddk.h вместо.

Обычно я использовал бы эту функцию в консольном приложении Win32 для вычисления этой информации, но она неточная, потому что она не учитывает Turbo Boost на процессорах Intel:

float GetCoreFrequency()
{
// __rdtsc: Returns the processor time stamp which records the number of clock cycles since the last reset.
// QueryPerformanceCounter: Returns a high resolution time stamp that can be used for time-interval measurements.
// Get the frequency which defines the step size of the QueryPerformanceCounter method.
LARGE_INTEGER frequency;
QueryPerformanceFrequency(&frequency);
// Get the number of cycles before we start.
ULONG cyclesBefore = __rdtsc();
// Get the start time.
LARGE_INTEGER startTime;
QueryPerformanceCounter(&startTime);
ULONG cyclesAfter;
LARGE_INTEGER endTime;
// Get the number of cycles over some arbitrary but short enough period of time.
do
{
cyclesAfter = __rdtsc();
QueryPerformanceCounter(&endTime);
} while ((endTime.QuadPart - startTime.QuadPart) / frequency.QuadPart < 1);
// Return the number of MHz.
return (cyclesAfter - cyclesBefore)*pow(10, -6) / ((endTime.QuadPart - startTime.QuadPart) / frequency.QuadPart);
}

актуальная формула для частоты процессора на чипах Intel максимальная частота, умноженная на коэффициент, который можно получить из двух регистров ЦП в самом чипе (APERF и MPERF):

frequency = maximumFrequency * APERF / MPERF;

Что переводится в этот код:

frequency = maximumFrequency * __readmsr(232) / __readmsr(231);

Я надеялся получить максимальную частоту от QueryPerformanceFrequency, но так как я не могу включить это, как я могу получить максимальную частоту?

2

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]