Linux 下的 CallNtPowerInformation 和 GetPwrCapativity
我的代码可以返回有关 Windows 下基于 Intel 的系统上正在运行的 CPU 的信息。它通过 CallNtPowerInformation 和 GetPwrCapability 函数来完成此操作。返回的典型信息是最大Mhz、当前Mhz、最大空闲状态、当前空闲状态。
据推测,这是通过单个指令完成的,例如 cpuid。
我想要在 Linux 下运行类似的代码。有什么想法如何去做吗?
这是我的 Windows 代码:
/** cpustat.h -- Header for cpustat.cpp.
* Copyright (c) 2004 Brad Fish ([email protected]).
*/
#if !defined(MAIN_H)
#define MAIN_H
#include <windows.h>
// missing Windows processor power information struct
typedef struct _PROCESSOR_POWER_INFORMATION {
ULONG Number;
ULONG MaxMhz;
ULONG CurrentMhz;
ULONG MhzLimit;
ULONG MaxIdleState;
ULONG CurrentIdleState;
} PROCESSOR_POWER_INFORMATION , *PPROCESSOR_POWER_INFORMATION;
int main (int argc, char *argv[]);
#endif // MAIN_H
#include "cpustat.h"
#include <cstdio>
#include <vector>
#include <iostream>
extern "C" {
#include <powrprof.h>
}
int main (int argc, char *argv[])
{
typedef std::vector<PROCESSOR_POWER_INFORMATION> PPIVector;
SYSTEM_INFO sys_info;
PPIVector ppis;
SYSTEM_POWER_CAPABILITIES spc;
// find out how many processors we have in the system
GetSystemInfo(&sys_info);
ppis.resize(sys_info.dwNumberOfProcessors);
// get CPU stats
if (CallNtPowerInformation(ProcessorInformation, NULL, 0, &ppis[0],
sizeof(PROCESSOR_POWER_INFORMATION) * ppis.size()) != ERROR_SUCCESS)
{
perror("main: ");
return -1;
}
// print out CPU stats
for (PPIVector::iterator it = ppis.begin(); it != ppis.end(); ++it)
{
std::cout << "stats for CPU " << it->Number << ':' << std::endl;
std::cout << " maximum MHz: " << it->MaxMhz << std::endl;
std::cout << " current MHz: " << it->CurrentMhz << std::endl;
std::cout << " MHz limit: " << it->MhzLimit << std::endl;
std::cout << " maximum idle state: " << it->MaxIdleState << std::endl;
std::cout << " current idle state: " << it->CurrentIdleState <<
std::endl;
}
// get system power settings
if (!GetPwrCapabilities(&spc))
{
perror("main: ");
return -2;
}
// print power settings
std::cout << "system power capabilities:" << std::endl;
std::cout << " processor throttle: " <<
(spc.ProcessorThrottle ? "enabled" : "disabled") << std::endl;
std::cout << " processor minimum throttle: " <<
static_cast<int>(spc.ProcessorMinThrottle) << '%' << std::endl;
std::cout << " processor maximum throttle: " <<
static_cast<int>(spc.ProcessorMaxThrottle) << '%' << std::endl;
}
I have code that returns information about the running CPUs on an intel-based system under Windows. It does this with the CallNtPowerInformation
and GetPwrCapabilities
functions. Typical information returned is the maximum Mhz, current Mhz, maximum idle state, current idle state.
Presumably this is being done with a single instruction, like cpuid
.
I want to have similar code that runs under Linux. Any ideas how to do it?
Here is the Windows code that I have:
/** cpustat.h -- Header for cpustat.cpp.
* Copyright (c) 2004 Brad Fish ([email protected]).
*/
#if !defined(MAIN_H)
#define MAIN_H
#include <windows.h>
// missing Windows processor power information struct
typedef struct _PROCESSOR_POWER_INFORMATION {
ULONG Number;
ULONG MaxMhz;
ULONG CurrentMhz;
ULONG MhzLimit;
ULONG MaxIdleState;
ULONG CurrentIdleState;
} PROCESSOR_POWER_INFORMATION , *PPROCESSOR_POWER_INFORMATION;
int main (int argc, char *argv[]);
#endif // MAIN_H
#include "cpustat.h"
#include <cstdio>
#include <vector>
#include <iostream>
extern "C" {
#include <powrprof.h>
}
int main (int argc, char *argv[])
{
typedef std::vector<PROCESSOR_POWER_INFORMATION> PPIVector;
SYSTEM_INFO sys_info;
PPIVector ppis;
SYSTEM_POWER_CAPABILITIES spc;
// find out how many processors we have in the system
GetSystemInfo(&sys_info);
ppis.resize(sys_info.dwNumberOfProcessors);
// get CPU stats
if (CallNtPowerInformation(ProcessorInformation, NULL, 0, &ppis[0],
sizeof(PROCESSOR_POWER_INFORMATION) * ppis.size()) != ERROR_SUCCESS)
{
perror("main: ");
return -1;
}
// print out CPU stats
for (PPIVector::iterator it = ppis.begin(); it != ppis.end(); ++it)
{
std::cout << "stats for CPU " << it->Number << ':' << std::endl;
std::cout << " maximum MHz: " << it->MaxMhz << std::endl;
std::cout << " current MHz: " << it->CurrentMhz << std::endl;
std::cout << " MHz limit: " << it->MhzLimit << std::endl;
std::cout << " maximum idle state: " << it->MaxIdleState << std::endl;
std::cout << " current idle state: " << it->CurrentIdleState <<
std::endl;
}
// get system power settings
if (!GetPwrCapabilities(&spc))
{
perror("main: ");
return -2;
}
// print power settings
std::cout << "system power capabilities:" << std::endl;
std::cout << " processor throttle: " <<
(spc.ProcessorThrottle ? "enabled" : "disabled") << std::endl;
std::cout << " processor minimum throttle: " <<
static_cast<int>(spc.ProcessorMinThrottle) << '%' << std::endl;
std::cout << " processor maximum throttle: " <<
static_cast<int>(spc.ProcessorMaxThrottle) << '%' << std::endl;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您可以通过查看
/proc
下的proc
文件系统找到一些信息,例如/proc/cpuinfo
或/proc /acpi/处理器/
。You can find some info by looking around in the
proc
file system under/proc
, for example/proc/cpuinfo
or/proc/acpi/processor/
.我们终于得到了一些执行此操作的代码。它使用
cpuid
指令:We finally got some code that does this. It uses the
cpuid
instruction: