Time 在内核空间中设置时间

Time 在内核空间中设置时间,time,linux-kernel,kernel,Time,Linux Kernel,Kernel,我很抱歉,但我完全是新手 我正在尝试为自定义硬件编写自己的驱动程序。 我需要读取内核中的系统时间: struct timeval time; struct tm broken, mytime; ... do_gettimeofday(&time); time_to_tm(time.tv_sec, 0, &broken); printk(KERN_INFO "Timer synced at %d:%d:%d:%ld\n", broken.tm_hour, broken.tm_mi

我很抱歉,但我完全是新手

我正在尝试为自定义硬件编写自己的驱动程序。 我需要读取内核中的系统时间:

struct timeval time;
struct tm broken, mytime;

...
do_gettimeofday(&time);
time_to_tm(time.tv_sec, 0, &broken);
printk(KERN_INFO "Timer synced at %d:%d:%d:%ld\n", broken.tm_hour, broken.tm_min,broken.tm_sec, time.tv_usec);
...
这是有效的

然后我手动设置: -休息时间 -破烂的,破烂的 ... -断开。tm_秒 -time.tv\u usec

现在如何使用我的值更新系统时间?
谢谢

在用户空间中有两个函数:gettimeofday和settimeofday。可能是do_settimeofday吗?

有很多方法可以将数据填充到“struct timespec”中,我只是保持简单:

$sudo insmod.ko hh=2毫米=50毫米ss=10毫米=600

/*
=========================================================
Execute   :  sudo insmod <MODULENAME>.ko hh=2 mm=50 ss=10 nn=600
Output    :  dmesg
=========================================================
*/

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/time.h>

static int hh, mm, ss, nn;

MODULE_LICENSE("GPL");
module_param(hh, int, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
MODULE_PARM_DESC(hr, "Hours");
module_param(mm, uint, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
MODULE_PARM_DESC(mm, "Minutes");
module_param(ss, uint, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
MODULE_PARM_DESC(ss, "Seconds");
module_param(nn, uint, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
MODULE_PARM_DESC(nn, "Nano seconds");

int __init ourinitmodule(void)
{

    struct timeval time;
    struct tm broken;
    struct timespec tp;
    printk(KERN_ALERT "\nWelcome to Module .... \n");
    do_gettimeofday(&time);
    time_to_tm(time.tv_sec, 0, &broken);
    printk(KERN_INFO "Timer synced at %d:%d:%d:%ld\n", broken.tm_hour, broken.tm_min,broken.tm_sec, time.tv_usec);
    // Iam trying to set time to 2:50:10:800 (HH:MM:SS:NN)
    tp.tv_sec= 3600/*constant*/ * hh /*hours*/ + 60 * mm /*minutes*/ + ss  /*seconds*/;
    tp.tv_nsec=1000* nn /*nanosec*/;
    do_settimeofday(&tp);
    do_gettimeofday(&time);
    time_to_tm(time.tv_sec, 0, &broken);
    printk(KERN_INFO "Timer set to %d:%d:%d:%ld\n", broken.tm_hour, broken.tm_min,broken.tm_sec, time.tv_usec);
    return 0;
}

void __exit ourcleanupmodule(void)
{
    printk(KERN_ALERT "Thanks....Exiting Module. \n");
}

module_init(ourinitmodule);
module_exit(ourcleanupmodule);
/*
=========================================================
执行:sudo insmod.ko hh=2毫米=50毫米ss=10毫米=600毫米
输出:dmesg
=========================================================
*/
#包括
#包括
#包括
静态整数hh,mm,ss,nn;
模块许可证(“GPL”);
模块参数(hh,int,S|u IRUSR | S|u IWUSR | S|u IRGRP | S|IROTH);
课程描述(人力资源,“小时”);
模块参数(mm,uint,S|u IRUSR | S|u IWUSR | S|u IRGRP | S|IROTH);
模块描述(毫米,“分钟”);
模块参数(ss、uint、S|u IRUSR、S|u IWUSR、S|u IRGRP、S|IROTH);
模块描述(ss,“秒”);
模块参数(nn、uint、S|u IRUSR、S|u IWUSR、S|u IRGRP、S|IROTH);
模块(nn,“纳秒”);
int _uinit-ourinitmodule(void)
{
结构时间值时间;
结构tm断裂;
struct-timespec-tp;
printk(内核警报“\n帮助访问模块…”\n”);
do_gettimeofday(和time);
time_至_tm(time.tv_秒,0,&break);
printk(KERN_INFO“计时器同步于%d:%d:%d:%ld\n”,break.tm_小时,break.tm_分钟,break.tm_秒,time.tv_usec);
//我正在尝试将时间设置为2:50:10:800(HH:MM:SS:NN)
电视秒=3600/*常数*/*hh/*小时*/+60*mm/*分钟*/+ss/*秒*/;
tp.tv_nsec=1000*nn/*nanosec*/;
do_设置每日时间(&tp);
do_gettimeofday(和time);
time_至_tm(time.tv_秒,0,&break);
printk(KERN_INFO“计时器设置为%d:%d:%d:%ld\n”、break.tm_小时、break.tm_分钟、break.tm_秒、time.tv_usec);
返回0;
}
void\u退出我们的清理模块(void)
{
printk(KERN_ALERT“谢谢……正在退出模块。\n”);
}
模块_init(模块);
模块_出口(我们的清理模块);
希望你得到你需要的。 快乐编程:)