系统调用之sys_adjtimex
这个函数主要用于读取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得到tailret = __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;
}
系统调用之sys_adjtimex相关推荐
- linux下syscall函数 间接系统调用
NAME syscall - 间接系统调用 SYNOPSIS #define _GNU_SOURCE #inclu ...
- Linux内核设计与实现 总结笔记(第五章)系统调用
系统调用 内核提供了用户进程和内核交互的接口,使得应用程序可以受限制的访问硬件设备. 提供这些接口主要是为了保证系统稳定可靠,避免应用程序恣意妄行. 一.内核通信 系统调用在用户空间进程和硬件设备之间 ...
- Linux系统调用表:x86和x86_64
<Linux系统调用表> <linux系统调用表(system call table)> <线上环境 Linux 系统调用追踪> <Linux系统调用权威指南 ...
- Linux系统调用表(system call table)
<Linux系统调用表> <linux系统调用表(system call table)> <线上环境 Linux 系统调用追踪> <Linux系统调用权威指南 ...
- Linux系统调用表(x86_64)
内核版本 Linux 4.7 Note:64位系统中,不再使用int 0x80来进行系统调用,取而代之的是syscall指令 %rax System call %rdi %rsi %rdx %r10 ...
- 实验四:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
贺邦+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用库函数 ...
- 专题8-Linux系统调用
1.从用户空间到内核空间的时候需要进行系统调用 2.系统调用通过swi指令实现,这个时候会有一个参数,存放到r7寄存器,用来指定要调用的内核态函数. 3.一般内核态的实际函数可以再任意的.c文件实现, ...
- linux c 启动程序吗,Linux下C程序启动时的系统调用
写程序跟踪发现,在Linux i386中,一个程序体完全为空的C语言程序启动时要进行近100个系统调用,如下所示. [ 1]syscall: 11 //execve [ 2]syscall: 45 / ...
- linux open系统调用的O_DIRECT标记
前言 open系统调用中针对打开的文件描述符,可以增加一个O_DIRECT标记,该标记能够使得针对该文件描述符的写操作绕过操作系统page cache,直接进入通用块设备层,从而减少页缓存对IO效率的 ...
最新文章
- 计量经济学建模_不了解计量经济学的前世今生,怎么能学会他
- 中国棉纺织工业发展状况及未来竞争格局报告2022-2028年
- Java NIO之Selector
- Java并发编程实战 第13章 显式锁
- 论文浅尝 | 面向视觉常识推理的层次语义增强方向图网络
- ubuntu下ffmpeg编译安装
- web项目开发最佳做法
- 笔记本电脑如何保养_锂电池保养技术 锂电池使用注意事项 锂电池技术培训
- 批量转换Caltech Pedestrian Dataset中annotations中的.vbb文件为.txt文件
- Navicat Premium 12 安装教程 + 注册机 Navicat_Keygen_Patch_v5.0_By_DFoX_CHS [附资源]
- pandas入门(一):pandas的安装和创建
- 剪辑视频时PR播放卡顿不连贯|如何修复Premiere软件中播放太卡问题
- 债券价格和到期收益率的关系_债券市场价格与到期收益率
- 二重积分的概念与性质——重点部分笔记
- 机器学习第四章之逻辑回归模型
- socketDemo套接字
- JavaFX之Scene Builder的使用(开发一款GUI小工具原来这么简单)
- 【风控系列】3. 高效的风控业务流程
- linux基础教程清华大学课件,看看清华大学的Linux基础教程是怎样的
- 游戏开发笔记(一):一元夺宝