欢迎来到天天文库
浏览记录
ID:6380009
大小:36.00 KB
页数:8页
时间:2018-01-12
《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
此文档下载收益归作者所有