问题是这样的:我正在尝试根据IOCTL 示例骨架计算内核模式 WDM 驱动程序中的 CPU 频率,但如果我尝试使用 QueryPerformanceFrequency 或 QueryPerformanceCounter,它不想编译。我觉得可能是因为它是一个内核模式驱动程序,它不允许我包含包含这些方法的 Windows.h -它迫使我改用 Ntddk.h。
通常我会在 Win32 控制台应用程序中使用此函数来计算此信息,但它不准确,因为它没有考虑 Intel CPU 上的 Turbo Boost:
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);
}
英特尔芯片上 CPU 频率的实际公式是最大频率乘以可以从芯片本身的两个 CPU 寄存器(APERF 和 MPERF)中获得的比率:
frequency = maximumFrequency * APERF / MPERF;
翻译成这段代码:
frequency = maximumFrequency * __readmsr(232) / __readmsr(231);
我希望能够从 QueryPerformanceFrequency 获得 maximumFrequency,但由于我无法将其包含在内,我怎样才能获得最大频率?