2

问题是这样的:我正在尝试根据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,但由于我无法将其包含在内,我怎样才能获得最大频率?

4

0 回答 0