一、 kernel中获取系统时间API:
函数实现:
kernel/time/timekeeping.c 中实现了几个常用API:
void ktime_get_ts64(struct timespec64 *ts); //CLOCK_MONOTONIC
void ktime_get_real_ts64(struct timespec64 *); //CLOCK_REALTIME
void ktime_get_boottime_ts64(struct timespec64 *);//CLOCK_BOOTTIME
void ktime_get_raw_ts64(struct timespec64 *); //CLOCK_MONOTONIC_RAW
以上 4 个 API 实际上表明 Linux 提供了 4 种时间:
- CLOCK_REALTIME:以 1970年1月1日… 为起点,随 time-of-day 被修改的时候而改变(例如,NTP网络时间协议)
- CLOCK_MONOTONIC:从某个时间点开始的绝对逝去时间,不受任何系统time-of-day时钟修改的影响,在没有机器重启的情况下,若你想计算出两个事件发生的间隔时间的话,那么它将是最好的选择。但是 CLOCK_MONOTONIC 在系统 suspend 时并不会增长。
- CLOCK_BOOTTIME:以系统启动时间为起点,在系统suspend的时候时钟依然增长。
- CLOCK_MONOTONIC_RAW:与 CLOCK_MONOTONIC 相似,虽然 CLOCK_MONOTONIC 不受 NTP 的影响,但是随着 NTP 了解本地振荡器和上游服务器之间存在错误时,它的频率确实会发生变化,而 CLOCK_MONOTONIC_RAW 完全取决于本地振荡器。
结构体 struct timespec64 定义在 include/linux/time64.h 文件:
struct timespec64 {
time64_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
该文件还包含一些对struct timespec64类型结构体变量的处理API:如下
timespec64_sub
计算时间差,返回同样类型的结构体变量
timespec64_to_ns
用于将转换成ns值,返回值为u64类型
二、 测量某段代码执行时间
#include <linux/timex.h>
struct timespec64 ts_start, ts_end;
struct timespec64 ts_delta;
ktime_get_boottime_ts64(&ts_start);
// ...要计算执行时间的函数逻辑
ktime_get_boottime_ts64(&ts_end);
// 计算时间差
ts_delta = timespec64_sub(ts_end, ts_start);
pr_notice("[DB] time consumed: %lld (ns)\n",timespec64_to_ns(&ts_delta));