时间的表示
在内核当中有几个不同的结构用于表示时间。
timespec
该数据结构来自于POSIX.1b规范,用于在用户态和内核态之间传递时间信息。POSIX还定义了许多API供用户态调用,例如clock_gettime(),clock_settime()等,其中的表示时间的结构都是timespec。在内核中该结构定义在include/uapi/linux/time.h。
struct timespec {
__kernel_time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
timeval
该结构也用于用户态和内核态间的时间信息传递。不同于timespec的是它的两个成员分别是秒和微妙,精度要比timespec差。另外一个区别是相关API也不同,timeval相关的API是gettimeofday()等。
struct timeval {
__kernel_time_t tv_sec; /* seconds */
__kernel_suseconds_t tv_usec; /* microseconds */
};
ktime
不同于timespec,ktime定义于include/linux/ktime.h,且仅用于内核当中。对于64位系统而言,该结构就是一个64位有符号数。
union ktime {
s64 tv64;
#if BITS_PER_LONG != 64 && !defined(CONFIG_KTIME_SCALAR)
struct {
# ifdef __BIG_ENDIAN
s32 sec, nsec;
# else
s32 nsec, sec;
# endif
} tv;
#endif
};
内核提供了多种helper API用于不同时间结构之间的转化。
static inline ktime_t timespec_to_ktime(struct timespec ts)
#define ktime_to_timespec(kt) ns_to_timespec((kt).tv64)
static inline ktime_t timeval_to_ktime(struct timeval tv)
#define ktime_to_timeval(kt) ns_to_timeval((kt).tv64)
内核提供了多种API用于将ktime转化为更常见的毫秒、微妙、纳秒等时间单位。
static inline s64 ktime_to_us(const ktime_t kt)
static inline s64 ktime_to_ms(const ktime_t kt)
#define ktime_to_ns(kt) ((kt