在内核模块上获得正常运行时间?
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' 似乎已加载到您的内核中”