linux内核的时钟机制

linux内核的时钟机制

ID:6380009

大小:36.00 KB

页数:8页

时间:2018-01-12

linux内核的时钟机制_第1页
linux内核的时钟机制_第2页
linux内核的时钟机制_第3页
linux内核的时钟机制_第4页
linux内核的时钟机制_第5页
资源描述:

《linux内核的时钟机制》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、gettimeofday的源码7.8时间系统调用的实现本节讲述与时间相关的syscall,这些系统调用主要用来供用户进程向内核检索当前时间与日期,因此他们是内核的时间服务接口。主要的时间系统调用共有5个:time、stime和gettimeofday、settimeofday,以及与网络时间协议NTP相关的adjtimex系统调用。这里我们不关心NTP,因此仅分析前4个时间系统调用。前4个时间系统调用可以分为两组:(1)time和stime是一组;(2)gettimeofday和settimeofday是一组。7.8.1系统调用time和stime系统调用time(

2、)用于获取以秒数表示的系统当前时间(即内核全局时间变量xtime中的tv_sec成员的值)。它只有一个参数——整型指针tloc,指向用户空间中的一个整数,用来接收返回的当前时间值。函数sys_time()的源码如下(kernel/time.c):asmlinkagelongsys_time(int*tloc){inti;/*SMP:Thisisfairlytrivial.WegrabCURRENT_TIMEandstuffittouserspace.Nosideeffects*/i=CURRENT_TIME;if(tloc){if(put_user(i,tloc))

3、i=-EFAULT;}returni;}注释如下:(1)首先,函数调用CURRENT_TIME宏来得到以秒数表示的内核当前时间值,并将该值保存在局部变量i中。宏CURRENT_TIME定义在include/linux/sched.h头文件中,它实际上就是内核全局时间变量xtime中的tv_sec成员。如下所示:#defineCURRENT_TIME(xtime.tv_sec)(2)然后,在参数指针tloc非空的情况下将i的值通过put_user()宏传递到有tloc所指向的用户空间中去,以作为函数的输出结果。(3)最后,将局部变量I的值——也即也秒数表示的系统当前时

4、间值作为返回值返回。系统调用stime()与系统调用time()刚好相反,它可以让用户设置系统的当前时间(以秒数为单位)。它同样也只有一个参数——整型指针tptr,指向用户空间中待设置的时间秒数值。函数sys_stime()的源码如下(kernel/time.c):asmlinkagelongsys_stime(int*tptr){intvalue;if(!capable(CAP_SYS_TIME))return-EPERM;if(get_user(value,tptr))return-EFAULT;write_lock_irq(&xtime_lock);xtime

5、.tv_sec=value;xtime.tv_usec=0;time_adjust=0;/*stopactiveadjtime()*/time_status

6、=STA_UNSYNC;time_maxerror=NTP_PHASE_LIMIT;time_esterror=NTP_PHASE_LIMIT;write_unlock_irq(&xtime_lock);return0;}注释如下:(1)首先检查调用进程的权限,显然,只有root用户才能有权限修改系统时间。(2)调用get_user()宏将tptr指针所指向的用户空间中的时间秒数值拷贝到内核空间中来,并保存到局

7、部变量value中。(3)将局部变量value的值更新到全局时间变量xtime的tv_sec成员中,并将xtime的tv_usec成员清零。(4)在相应地重置其它状态变量后,函数就可以返回了(返回值0表示成功)。7.8.2系统调用gettimeofday这个syscall用来供用户获取timeval格式的当前时间信息(精确度为微秒级),以及系统的当前时区信息(timezone)。结构类型timeval的指针参数tv指向接受时间信息的用户空间缓冲区,参数tz是一个timezone结构类型的指针,指向接收时区信息的用户空间缓冲区。这两个参数均为输出参数,返回值0表示成功

8、,返回负值表示出错。函数sys_gettimeofday()的源码如下(kernel/time.c):asmlinkagelongsys_gettimeofday(structtimeval*tv,structtimezone*tz){if(tv){structtimevalktv;do_gettimeofday(&ktv);if(copy_to_user(tv,&ktv,sizeof(ktv)))return-EFAULT;}if(tz){if(copy_to_user(tz,&sys_tz,sizeof(sys_tz)))return-EFAULT;}ret

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。