博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
系统调用之sys_adjtimex
阅读量:4215 次
发布时间:2019-05-26

本文共 1796 字,大约阅读时间需要 5 分钟。

这个函数主要用于读取kernel时间,如果是superuser的话,则可以写kernel时间。其源码分析如下:SYSCALL_DEFINE1(adjtimex, struct timex __user *, txc_p){	struct timex txc;		/* Local copy of parameter */	int ret;	/* Copy the user data space into the kernel copy	 * structure. But bear in mind that the structures	 * may change	 */	#从user space copy txc_p中的内容到txc中	if (copy_from_user(&txc, txc_p, sizeof(struct timex)))		return -EFAULT;	#根据txc中的内容读写kernel时间	ret = do_adjtimex(&txc);	#从kernel space 中的txc中的内容copy到txc_p中	return copy_to_user(txc_p, &txc, sizeof(struct timex)) ? -EFAULT : ret;}int do_adjtimex(struct timex *txc){#得到timer keeper的时间	struct timekeeper *tk = &tk_core.timekeeper;	unsigned long flags;	struct timespec64 ts;	s32 orig_tai, tai;	int ret;	/* Validate the data before disabling interrupts */	#检查txc 中的时间是否合法	ret = timekeeping_validate_timex(txc);	if (ret)		return ret;	#ADJ_SETOFFSET 表示增加当前time keeper的时间	if (txc->modes & ADJ_SETOFFSET) {		struct timespec64 delta;		delta.tv_sec  = txc->time.tv_sec;		delta.tv_nsec = txc->time.tv_usec;		if (!(txc->modes & ADJ_NANO))			delta.tv_nsec *= 1000;		ret = timekeeping_inject_offset(&delta);		#正常情况下ret等于零。		if (ret)			return ret;	}	#以timespec64格式获取当前时间	getnstimeofday64(&ts);	#开始修改time keeper时间	raw_spin_lock_irqsave(&timekeeper_lock, flags);	write_seqcount_begin(&tk_core.seq);	orig_tai = tai = tk->tai_offset;	#根据txc和ts的时间来或者写 kernel 时间,主要给txc赋值,并通过process_adjtime_modes得到tail	ret = __do_adjtimex(txc, &ts, &tai);	#说明时间已经被更新了,开始update time keeper中的时间	if (tai != orig_tai) {		__timekeeping_set_tai_offset(tk, tai);		timekeeping_update(tk, TK_MIRROR | TK_CLOCK_WAS_SET);	}	tk_update_leap_state(tk);	write_seqcount_end(&tk_core.seq);	raw_spin_unlock_irqrestore(&timekeeper_lock, flags);	if (tai != orig_tai)		clock_was_set();	#通知ntp时间已经被修改	ntp_notify_cmos_timer();	return ret;}

转载地址:http://bjnmi.baihongyu.com/

你可能感兴趣的文章
Oracle 11.2.0.1 RAC GRID 无法启动 : Oracle High Availability Services startup failed
查看>>
Oracle 18c 单实例安装手册 详细截图版
查看>>
Oracle Linux 6.1 + Oracle 11.2.0.1 RAC + RAW 安装文档
查看>>
Oracle 11g 新特性 -- Online Patching (Hot Patching 热补丁)说明
查看>>
Oracle 11g 新特性 -- ASM 增强 说明
查看>>
Oracle 11g 新特性 -- Database Replay (重演) 说明
查看>>
Oracle 11g 新特性 -- 自动诊断资料档案库(ADR) 说明
查看>>
Oracle 11g 新特性 -- RMAN Data Recovery Advisor(DRA) 说明
查看>>
CSDN博客之星 投票说明
查看>>
Oracle wallet 配置 说明
查看>>
Oracle smon_scn_time 表 说明
查看>>
VBox fdisk 不显示 添加的硬盘 解决方法
查看>>
Secure CRT 自动记录日志 配置 小记
查看>>
RMAN RAC 到 单实例 duplicate 自动分配通道 触发 ORA-19505 错误
查看>>
mysql 随机分页的优化
查看>>
DB2快速创建测试库
查看>>
利用db2look查看ddl
查看>>
java中的mmap实现
查看>>
Redis的Aof被阻塞原因调查
查看>>
Redis Cluster的FailOver失败案例分析
查看>>