linux時間子系統(九)

2022-08-10 08:24:15 字數 1367 閱讀 4343

3.4.3 模擬tick事件

當系統切換到高精度模式後,tick_device被高精度定時器系統接管,不再定期地產生tick事件。核心在3.0.30版本中還沒有徹底的廢除jiffies機制,系統還是依賴定期到來的tick事件,完成程序排程和時間更新等操作,大量存在的低精度定時器仍然依賴於jiffies計數。所以,儘管tick_device被接管,高精度定時器系統仍然需要繼續提供定期的tick事件。為了完成這個需求,由於高精度模式已經啟用,核心定義了乙個hrtimer,把它的到期時間設定為乙個jiffy的時間,當著個hrtimer到期時,在這個hrtimer的到期函式中,進行和原來的tick_device同樣的操作,然後把該hrtimer的到期時間順延乙個jiffy週期。如此反覆迴圈,可以完美的模擬原有tick_device的功能。

在kernel/time/tick-sched.c中,核心定義了乙個per_cpu的全域性變數:tick_cpu_sched,從而為每個cpu提供了乙個tick_sched結構。該結構主要用於管理no_hz配置下的tickless處理,因為模擬tick事件與tickless有很強的相關性,所以高精度定時器也利用了該結構的以下字段,用來完成模擬tick時間的操作:

struct tick_sched

核心使用函式tick_setup_sched_timer,該函式的作用就是設定乙個用於模擬tick事件的hrtimer。

void tick_setup_sched_timer(void)

#ifdef config_no_hz

if (tick_nohz_enabled)

#endif

}static enum hrtimer_restart tick_sched_timer(struct hrtimer *timer)

update_process_times(user_mode(regs));

profile_tick(cpu_profiling);

}hrtimer_forward(timer, now, tick_period); /* 把hrtimer的到期時間推進乙個tick週期。*/

return hrtimer_restart; /*返回hrtimer_restart表明該hrtimer需要再次啟動,以便產生下乙個tick事件。*/

}對比模擬tick時間的hrtimer的**函式tick_sched_timer和切換前tick_device的**函式tick_handle_periodic,他們幾乎完成了一樣的工作。

我們可以使用系統呼叫timer_create/timer_delete/timer_gettime/timer_settime設定精度達到ns的定時器。不過每個程序只能有乙個。

系統提供getitimer/setitimer系統呼叫,提供精度為us級別的定時器。

linux時間子系統(六)

3.1.4 定時器處理 static inline void run timers struct tvec base base wake up base wait for running timer spin unlock irq base lock static int cascade struc...

linux時間子系統(三)

2.2.3 timekeeper初始化 void init timekeeping init void set normalized timespec wall to monotonic,boot.tv sec,boot.tv nsec total sleep time.tv sec 0 total...

Linux時間子系統之時間的表示

在linux核心中,為了相容原有的 或者符合某種規範,並且還要滿足當前精度日益提高的要求,實現了多種與時間相關但用於不同目的的資料結構 核心用jiffies 64全域性變數記錄系統自啟動以來經過了多少次tick。它的宣告如下 位於kernel time timer.c中 visible u64 ji...