Почему у нас есть грубые варианты ktime_get в ядре Linux?

Я шел по следующей ссылке:

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

У нас есть как грубая ( ktime_get_coarse() ), так и не грубая ( ktime_get() ) версии.

Какой из них мы должны использовать и когда?

В нем говорится, что грубые версии быстрее, чем грубые версии.

Читают не грубые версии аппаратный счетчик или нет?

Всего 1 ответ


Q:

Какой из них мы должны использовать и когда?

Кажется, это хорошо описано по вашей ссылке.
A:

Это быстрее, чем не грубые версии, но менее точно.

Поэтому, если вам нужно быть быстрым, и вам не нужна точность - используйте грубую (погрешность будет до 10 мс при 100 Гц и до 1 мс при 1000 Гц). Если точность является приоритетом, используйте не грубый API.


Q:

Читает ли не грубая версия аппаратный счетчик или нет?

A:
ktime_get() (в отличие от ktime_get_coarse() ) в конечном итоге вызывает timekeeping_get_delta 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);
}

Внутри он вызывает соответствующий обратный вызов для аппаратного таймера для чтения.
Вы можете искать такие обратные вызовы в ваших источниках, просматривая clocksources: grep -rnI 'read =' drivers/clocksource .
Например, здесь установка tpu_clocksource_read() .


Есть идеи?

10000