【问题标题】:How to get current hour (time of day) in linux kernel space如何在linux内核空间中获取当前时间(一天中的时间)
【发布时间】:2014-05-13 15:29:10
【问题描述】:

我正在编写一个内核模块,用于检查时间是否在两个指定小时之间,如果是则禁用输入。这与我想确保我早点睡觉有关。 (我知道我也可以使用任意数量的不同技术,包括 cron 等,但我想学习内核编程......)

因此,作为第一个版本,我检查当前时间是否在开始和结束之间,这是通过模块的参数设置的。

因此,我的问题是:如何获得当前时间?我无法访问标准库中的常用时间函数,因为我在内核空间中。我猜我应该为此使用 do_gettimeofday() ,但这只会给我秒和纳秒,而且我需要当天的几个小时。

谢谢。

【问题讨论】:

  • 我什至不知道答案,但是 +1 用于破解内核,以便您可以早点睡觉!
  • :-D 我承认,我是个十足的极客……
  • 我只能说,这样的内核模块调试起来并不愉快!
  • ssh 应该可以解决问题。

标签: c linux linux-kernel kernel-module


【解决方案1】:

time_to_tm 函数可以为您提供帮助,它返回结构 tm。时区在变量sys_tz 中可用,它可以帮助您正确设置偏移量以获取本地时间。

【讨论】:

  • (链接已失效)
【解决方案2】:

要在内核中获取本地时间,请添加以下代码 sn -p 您的内核驱动程序:

struct timeval time;
unsigned long local_time;

do_gettimeofday(&time);
local_time = (u32)(time.tv_sec - (sys_tz.tz_minuteswest * 60));
rtc_time_to_tm(local_time, &tm);

printk(" @ (%04d-%02d-%02d %02d:%02d:%02d)\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);

【讨论】:

【解决方案3】:

这对我很有效:

#include <linux/time.h>
...
/* getnstimeofday - Returns the time of day in a timespec */
void getnstimeofday(struct timespec *ts)

为了获得通常的时间格式,您可以使用:

printk("TIME: %.2lu:%.2lu:%.2lu:%.6lu \r\n",
                   (curr_tm.tv_sec / 3600) % (24),
                   (curr_tm.tv_sec / 60) % (60),
                   curr_tm.tv_sec % 60,
                   curr_tm.tv_nsec / 1000);

【讨论】:

    【解决方案4】:

    将 do_gettimeofday 结果转换为一个小时非常简单,因为它从格林威治标准时间午夜开始。

    time_t t = time(0);
    time_t SecondsOfDay = t % (24*60*60);
    time_t HourGMT = SecondsOfDay / (60*60);
    

    然后根据您当地的时区进行调整

    【讨论】:

    • time() 在内核模式下不可用:-$
    • 不,但是你从 do_gettimeofday 得到相同的值,答案只是说明方法而不是确切的代码:)
    • 小心闰秒;自 Unix Epoch 开始以来已插入 +25。 AFAIK,用户态 API localtimegmtime 对此负责。
    【解决方案5】:

    我们可以使用clock_gettime函数和CLOCK_REALTIME作为时钟类型。

    参考http://linux.die.net/man/3/clock_gettime

    只需对日期执行 strace 即可让我们了解在内核模式下获取当前日期。

    【讨论】:

    • clock_gettime 是一个用户空间函数,不能在内核中使用。
    猜你喜欢
    • 2014-05-24
    • 2010-12-14
    • 2014-05-11
    • 1970-01-01
    • 2019-08-29
    • 2016-01-21
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    相关资源
    最近更新 更多