返回

Linux 内核中如何安全获取 CPU 频率?

Linux

在 Linux 内核中获取 CPU 频率

问题

在 Linux 内核开发过程中,获取当前 CPU 频率对于监控系统性能至关重要。如何从内核代码中安全可靠地提取此信息?

解决方法

获取 CPUinfo 文件符

首先,使用 open() 系统调用获取 /proc/cpuinfo 文件的文件符。此文件包含有关 CPU 的各种信息,包括其频率。

int fd = open("/proc/cpuinfo", O_RDONLY);

读取 CPUinfo 内容

接下来,使用 read() 系统调用读取 /proc/cpuinfo 文件的内容。

char buffer[1024];
int bytes_read = read(fd, buffer, sizeof(buffer));

解析 CPUinfo 内容

CPUinfo 文件中包含以键值对形式组织的信息。通过解析文件,可以提取有关 CPU 频率的信息。

可以使用 sscanf() 函数从文件中提取 CPU 频率值。

double cpu_freq;
sscanf(line, "cpu MHz : %lf", &cpu_freq);

关闭 CPUinfo 文件描述符

最后,使用 close() 系统调用关闭文件描述符。

close(fd);

示例代码

以下是获取 CPU 频率的完整示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>

int main() {
    int fd = open("/proc/cpuinfo", O_RDONLY);
    if (fd == -1) {
        perror("open() failed");
        return 1;
    }

    char buffer[1024];
    int bytes_read = read(fd, buffer, sizeof(buffer));
    if (bytes_read == -1) {
        perror("read() failed");
        return 1;
    }

    char *line = buffer;
    while (line != NULL) {
        double cpu_freq;
        if (sscanf(line, "cpu MHz : %lf", &cpu_freq) == 1) {
            printf("CPU frequency: %.2f MHz\n", cpu_freq);
        }
        line = strchr(line, '\n');
        if (line != NULL) {
            line++;
        }
    }

    close(fd);
    return 0;
}

常见问题解答

1. 如何从代码中获取 CPU 核心数?

解析 /proc/cpuinfo 文件中的 cpu corescore id 条目。

2. 我可以使用该方法在用户空间程序中获取 CPU 频率吗?

是的,此方法也可以在用户空间程序中使用。

3. 我正在使用一个自定义内核。此方法是否仍有效?

这取决于内核是如何定制的。它应该适用于大多数基于 Linux 的内核。

4. 除了 CPU 频率之外,我还可以从 /proc/cpuinfo 中获取哪些其他信息?

cpuinfo 文件包含有关 CPU 架构、缓存大小、标志和功耗的详细信息。

5. 我想查看各个 CPU 核心上的频率。如何做到这一点?

此方法返回所有 CPU 核心的平均频率。要获取每个核心的频率,需要使用 Linux Perf 工具(perf_event_open())。