在内核模块上获得正常运行时间?

Posted

技术标签:

【中文标题】在内核模块上获得正常运行时间?【英文标题】:Getting uptime on a kernel module? 【发布时间】:2018-08-17 00:19:00 【问题描述】:

我有这段代码,我试图让内核模块打印系统的uptime,正好在 simple_init 上。

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <sys/sysinfo.h>

/* This function is called when the module is loaded. */

int simple_init(void)

    struct sysinfo info;
    sysinfo(&info);
    printk("This pc has been on for %ld seconds\n", info.uptime);;
    printk(KERN_INFO "Loading Module\n");
    return 0;
 

如果这不是内核模块,我会这样做,我发现 sysinfo 有一个类似的 linux 库,即 linux/sysinfo,但即使我使用那个,它只有一个 Struct sysinfo 而不是我可以调用 sysinfo() 的函数,当我尝试这样做时,我得到了

error: implicit declaration of function ‘sysinfo’ [-Werror=implicit-function-declaration]
     sysinfo(&info);

有谁知道其他有效的方法吗?

谢谢

【问题讨论】:

@jxh,我对 C 比较陌生,我检查了链接,但没有看到任何与我的目的相关的内容,我可以得到提示吗? 【参考方案1】:

由于您寻找的信息是由内核伪文件/proc/uptime 提供的,我们可以查看内核源代码中的fs/proc/uptime.c:uptime_proc_show() 以了解信息是如何收集的。

目前,相关代码为

#include <linux/ktime.h>

    struct timespec  uptime;
    get_monotonic_boottime(&uptime);

其中uptime.tv_sec 是秒数,uptime.tv_nsec 纳秒(包括 0 到 999,999,999)。

但是,由于内核正在转向 64 位时间,您最好使用

#include <linux/ktime.h>

    s64  uptime_ms;
    uptime_ms = ktime_to_ms(ktime_get_boottime());

以毫秒为单位获取正常运行时间。如果您只需要完整的秒数,请使用

#include <linux/ktime.h>

    s64  uptime;
    uptime = ktime_divns(ktime_get_coarse_boottime(), NSEC_PER_SEC);

(“粗略”表示只读取完整的秒部分。)

【讨论】:

我问的是正常运行时间,我的意思是计算机处于活动状态的时间,我的问题与内存无关。 @DiegoContreras:对;现在固定以实际回答您的问题。 (我只是在那里呆了一会儿;很抱歉造成混乱!)

以上是关于在内核模块上获得正常运行时间?的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 AWS EMR 中获得 GPU 支持时出现错误“一个 NVIDIA 内核模块 'nvidia' 似乎已加载到您的内核中”

linux安装内核模块问题

Linux 内核模块开发怎么进行单元测试

如何使用 rust 写内核模块

内核栈溢出

一个linux内核模块移植到低版本时发生的异常