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(模块);
模块_出口(我们的清理模块);
希望你得到你需要的。
快乐编程:)