c - 为什么我们在 Linux 内核中有 ktime_get 的粗略变体?
问题描述
我正在通过以下链接:
https://www.kernel.org/doc/html/latest/core-api/timekeeping.html
我们有粗略 ( ktime_get_coarse()
) 和非粗略 ( ktime_get()
) 版本。
我们应该使用哪一个以及何时使用?
它说粗略版本比非粗略版本快。
非粗略版本是否读取硬件计数器?
解决方案
问:
我们应该使用哪一个以及何时使用?
似乎它在您的链接上描述得很好。
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()
.