Как увеличиваются jiffies в ядре без галочек? - PullRequest
3 голосов
/ 08 февраля 2020

Ядро поддерживает глобальную переменную под названием jiffies, в которой хранится число тактов / прерываний таймера при загрузке системы.

Каждый раз, когда происходит прерывание таймера, значение внутреннего счетчика ядра увеличивается.

В тиках ядра / динамиков c, где прерывания не происходят периодически, как увеличивается значение jiffies?

1 Ответ

1 голос
/ 11 февраля 2020

Значение jiffies всегда обновляется, вызывая функцию do_timer() из обработчика прерываний таймера, независимо от конфигурации. Что действительно меняется между «нормальным» и «тиканым» ядром, так это только , когда такие прерывания могут произойти.

Во-первых, позвольте мне пояснить, что не существует такого понятия, как настоящее «тиканье» "ядро. Ядро всегда будет нуждаться в тиках хотя бы на одном процессоре. Если все процессоры не работают, по крайней мере, один процессор должен поддерживать прерывание часов планирования, чтобы поддерживать точное хронометраж. Я настоятельно рекомендую прочитать Documentation/timers/NO_HZ.txt для получения более полезной и полезной информации о topi c.

В частности, значение jiffies обновляется только тем же процессором (т.е. глобальная переменная tick_do_timer_cpu). Возможны два следующих сценария ios:

  • В случае периодов c используется обработчик tick_handle_periodic(). Этот обработчик просто вызывает tick_periodic(), который затем вызывает do_timer(1), увеличивая jiffies на 1 тик.

  • В случае непериода c галочки, используется tick_nohz_handler(). Этот обработчик вызывает tick_sched_do_timer(), который вызывает tick_do_update_jiffies64(), который обновляет jiffies, динамически вычисляя количество тиков, которое произошло со времени последнего обновления (которое может быть больше 1), с помощью ktime_t, переданного tick_nohz_handler() и полученного через ktime_get().

...