这个函数主要用于读取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相关推荐

  1. linux下syscall函数 间接系统调用

    NAME               syscall - 间接系统调用 SYNOPSIS               #define _GNU_SOURCE                #inclu ...

  2. Linux内核设计与实现 总结笔记(第五章)系统调用

    系统调用 内核提供了用户进程和内核交互的接口,使得应用程序可以受限制的访问硬件设备. 提供这些接口主要是为了保证系统稳定可靠,避免应用程序恣意妄行. 一.内核通信 系统调用在用户空间进程和硬件设备之间 ...

  3. Linux系统调用表:x86和x86_64

    <Linux系统调用表> <linux系统调用表(system call table)> <线上环境 Linux 系统调用追踪> <Linux系统调用权威指南 ...

  4. Linux系统调用表(system call table)

    <Linux系统调用表> <linux系统调用表(system call table)> <线上环境 Linux 系统调用追踪> <Linux系统调用权威指南 ...

  5. Linux系统调用表(x86_64)

    内核版本 Linux 4.7 Note:64位系统中,不再使用int 0x80来进行系统调用,取而代之的是syscall指令 %rax System call %rdi %rsi %rdx %r10 ...

  6. 实验四:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    贺邦+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用库函数 ...

  7. 专题8-Linux系统调用

    1.从用户空间到内核空间的时候需要进行系统调用 2.系统调用通过swi指令实现,这个时候会有一个参数,存放到r7寄存器,用来指定要调用的内核态函数. 3.一般内核态的实际函数可以再任意的.c文件实现, ...

  8. linux c 启动程序吗,Linux下C程序启动时的系统调用

    写程序跟踪发现,在Linux i386中,一个程序体完全为空的C语言程序启动时要进行近100个系统调用,如下所示. [ 1]syscall: 11 //execve [ 2]syscall: 45 / ...

  9. linux open系统调用的O_DIRECT标记

    前言 open系统调用中针对打开的文件描述符,可以增加一个O_DIRECT标记,该标记能够使得针对该文件描述符的写操作绕过操作系统page cache,直接进入通用块设备层,从而减少页缓存对IO效率的 ...

最新文章

  1. 计量经济学建模_不了解计量经济学的前世今生,怎么能学会他
  2. 中国棉纺织工业发展状况及未来竞争格局报告2022-2028年
  3. Java NIO之Selector
  4. Java并发编程实战 第13章 显式锁
  5. 论文浅尝 | 面向视觉常识推理的层次语义增强方向图网络
  6. ubuntu下ffmpeg编译安装
  7. web项目开发最佳做法
  8. 笔记本电脑如何保养_锂电池保养技术 锂电池使用注意事项 锂电池技术培训
  9. 批量转换Caltech Pedestrian Dataset中annotations中的.vbb文件为.txt文件
  10. Navicat Premium 12 安装教程 + 注册机 Navicat_Keygen_Patch_v5.0_By_DFoX_CHS [附资源]
  11. pandas入门(一):pandas的安装和创建
  12. 剪辑视频时PR播放卡顿不连贯|如何修复Premiere软件中播放太卡问题
  13. 债券价格和到期收益率的关系_债券市场价格与到期收益率
  14. 二重积分的概念与性质——重点部分笔记
  15. 机器学习第四章之逻辑回归模型
  16. socketDemo套接字
  17. JavaFX之Scene Builder的使用(开发一款GUI小工具原来这么简单)
  18. 【风控系列】3. 高效的风控业务流程
  19. linux基础教程清华大学课件,看看清华大学的Linux基础教程是怎样的
  20. 游戏开发笔记(一):一元夺宝

热门文章

  1. 注册公司的公章遗失了怎么办?今天就教你如何处理!
  2. 【iOS】—— 分类、扩展和关联对象
  3. 实验二 HDFS实验操作
  4. 由近及远计算机网络故障判断,利用网络视频软件实现远程故障诊断
  5. Pythonmock基本使用
  6. CentOS7.3服务器内网离线部署docker和容器
  7. 2023社工准考证什么时候打印 具体时间是几号
  8. 光耦隔离继电器驱动模块设计以及单片机的使用
  9. VS2103进行调试时提示报错R6034解决方法
  10. 该文件没有程序与之关联来执行该操作。请在控制面板的文件夹选项中创建关联 解决代码...