Частоту процессора программно можно получить через: реестр HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0 cpuid /80000004h структуру PROCESSOR_POWER_INFORMATION rdtsc и Sleep rdtsc и SleepEx rdtsc и ACPI-таймер (QueryPerformanceFrequency и QueryPerformanceCounter) rdtsc и ACPI-таймер (ZwQueryPerformanceCounter) rdtsc и GetTickCount rdtsc и timeGetTime А как получить частоту процессора через BIOS и желательно в user mode?
> через BIOS и желательно в user mode? Эм. Биос это реалмод\протектедмод. Не понятна задача. Да и смысл если есть Cpuid
Зачем изобретать велосипед? Есть же программы для получения информации о железе. Есть руткиты и антируткиты.
TermoSINteZ, кроме cpuid частоту я получил еще 8 способами. Понятно, что основная информация о процессоре в БИОС. Но для доступа к БИОСу не хотелось бы писать драйвер, поэтому я и написал про юзер мод Pavia, просто хотелось бы узнать новые способы получения частоты процессора...
Если венда, то в юзермоде есть WMI, в которой есть просто любая информация о железе, не особо понимаю при чем тут биос и юзермод.
Работающей ОС (условной венде) биос предоставляет некоторые функции, в частности уход в слип/стендбай, управление питанием, доступ к фичам cpu. Так что вопрос ТС вполне корректен, но подрбностей я не знаю/не помню, думаю если упорно гуглить это можно найти. Либо плясать от каких-то системных утилит, считывающих состояние процессора. --- Сообщение объединено, 21 дек 2019 --- UEFI runtime services/GetFirmwareEnvironmentVariable м.б. это то что нужно в случае efi, для legacy bios возможно есть какой-то аналог.
Единственный правильный способ - через CallNtPowerInfiormation. Все остальные способы привязываются к TSC, который не зависит от энергосберегающих режимов и тикает с фиксированной частотой. Частота процессора хранится не в BIOS, а в соответствующих MSR-регистрах процессора, достучаться до которых "вручную" можно только из ядра (например, так определяет частоту CPU-Z). Для AMD и Intel эти регистры разные. Единственный способ получить эти значения из юзермода - дёргать CallNtPowerInformation. Она прочитает частоты из MSR для каждого ядра и вернёт в юзермод. Других способов нет. Для AMD: Для Intel:
HoShiMin, ~MHz" параметр в реестре, ядро его создаёт на основе частоты в nt!PCB. Судя по всему загрузка туда(w10) значения происходит не в самом ядре, может в хал хз. На младших версиях расчёт частоты был через тск. Код (Text): // Determine the MHz for the processor // KeGetCurrentPrcb()->MHz = 0; if (KeFeatureBits & KF_RDTSC) { Index = 0; pSamp = Samples; for (; ;) { // // Collect a new sample // Delay the thread a "long" amount and time it with // a time source and RDTSC. // CPUID (0, &Junk, &Junk, &Junk, &Junk); pSamp->PerfStart = KeQueryPerformanceCounter (NULL); pSamp->TSCStart = RDTSC(); pSamp->PerfFreq.QuadPart = -50000; KeDelayExecutionThread (KernelMode, FALSE, &pSamp->PerfFreq); CPUID (0, &Junk, &Junk, &Junk, &Junk); pSamp->PerfEnd = KeQueryPerformanceCounter (&pSamp->PerfFreq); pSamp->TSCEnd = RDTSC(); // // Calculate processors MHz // pSamp->PerfDelta = pSamp->PerfEnd.QuadPart - pSamp->PerfStart.QuadPart; pSamp->TSCDelta = pSamp->TSCEnd - pSamp->TSCStart; pSamp->MHz = (ULONG) ((pSamp->TSCDelta * pSamp->PerfFreq.QuadPart + 500000L) / (pSamp->PerfDelta * 1000000L)); // // If last 2 samples matched within a MHz, done // if (Index) { if (pSamp->MHz == pSamp[-1].MHz || pSamp->MHz == pSamp[-1].MHz + 1 || pSamp->MHz == pSamp[-1].MHz - 1) { break; } } // // Advance to next sample // pSamp += 1; Index += 1; // // If too many samples, then something is wrong // if (Index >= MAX_ATTEMPTS) { #if DBG // // Temp breakpoint to see where this is failing // and why // DbgBreakPoint(); #endif Average = 0; for (Index = 0; Index < MAX_ATTEMPTS; Index++) { Average += Samples[Index].MHz; } pSamp[-1].MHz = Average / MAX_ATTEMPTS; break; } } KeGetCurrentPrcb()->MHz = (USHORT) pSamp[-1].MHz;
Попалось это в сурках(wrk): Это одно упоминание, в енум сисинфо этого класса нет. В хал и нт XP-10 тегов speed" нет, нужно реверсить ядро что бы понять как это работает.