首页 > 解决方案 > 为什么我们在 Linux 内核中有 ktime_get 的粗略变体?

问题描述

我正在通过以下链接:

https://www.kernel.org/doc/html/latest/core-api/timekeeping.html

我们有粗略 ( ktime_get_coarse()) 和非粗略 ( ktime_get()) 版本。

我们应该使用哪一个以及何时使用?

它说粗略版本比非粗略版本快。

非粗略版本是否读取硬件计数器?

标签: clinuxtimerlinux-kernel

解决方案


问:

我们应该使用哪一个以及何时使用?

似乎它在您的链接上描述得很好。
A:

这些比非粗略版本更快,但准确性较低。

因此,如果您需要快速并且不关心准确性 - 使用粗略(100HZ 的不准确度最高可达 10ms,而 1000HZ 的不准确度最高可达 1ms)。如果精度是优先级,则使用非粗略 API。


问:

非粗略版本是否读取硬件计数器?

A:(
ktime_get()不像ktime_get_coarse())最终调用timekeeping_get_delta()读取时钟源的tk_clock_read()

static inline u64 tk_clock_read(const struct tk_read_base *tkr)
{
    struct clocksource *clock = READ_ONCE(tkr->clock);

    return clock->read(clock);
}

在它内部调用适当的回调以供硬件计时器读取。
您可以通过时钟源在源中搜索此类回调:grep -rnI 'read =' drivers/clocksource
例如这里tpu_clocksource_read().


推荐阅读