void do_gettimeofday(struct timeval *tv) 用于按照timeval的格式返回当前系统时间.其最终是从timekeeper中拿到时间.
其timeval的定义如下:
struct timeval {
__kernel_time_t tv_sec; /* seconds */
__kernel_suseconds_t tv_usec; /* microseconds */
};
其源码分析如下:
void do_gettimeofday(struct timeval *tv)
{
struct timespec64 now;
getnstimeofday64(&now);
tv->tv_sec = now.tv_sec;
tv->tv_usec = now.tv_nsec/1000;
}
可见这里首先得到timespec64 格式的时间后,在分别把timespec64的时间赋值给timeval
void getnstimeofday64(struct timespec64 *ts)
{
WARN_ON(__getnstimeofday64(ts));
}
如果__getnstimeofday64 返回1的话,就打印当前的callstack
int __getnstimeofday64(struct timespec64 *ts)
{
#得到当前timekeeper的指针
struct timekeeper *tk = &tk_core.timekeeper;
unsigned long seq;
u64 nsecs;
#下面这段是通过timekeeper 得到时间
do {
seq = read_seqcount_begin(&tk_core.seq);
ts->tv_sec = tk->xtime_sec;
nsecs = timekeeping_get_ns(&tk->tkr_mono);
} while (read_seqcount_retry(&tk_core.seq, seq));
ts->tv_nsec = 0;
timespec64_add_ns(ts, nsecs);
/*
* Do not bail out early, in case there were callers still using
* the value, even in the face of the WARN_ON.
*/
#如果当前timekeeper 处于suspend在状态,则从timekeeper中拿到的时间肯定是错的,这里就之间
#返回error了
if (unlikely(timekeeping_suspended))
return -EAGAIN;
return 0;
}
内核定时机制API之do_gettimeofday
最新推荐文章于 2024-06-12 10:50:51 发布