在内核模块上正常运行?

时间:2018-08-17 00:19:01

标签: c linux linux-kernel kernel kernel-module

我有这段代码试图在内核模块上准确地在 simple_init 上打印系统的uptime

#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);

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

谢谢

1 个答案:

答案 0 :(得分:5)

由于您要查找的信息是由内核伪文件/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);

(“粗略”表示仅读取整秒部分。)