Linux 核心透過硬體定時器產生週期性中斷 (tick),以 jiffies 全域變數記錄開機以來的 tick 總數。理解 jiffies 運作、回繞處理、超時判斷宏與 RTC (Real Time Clock) 角色,是核心開發與驅動程式設計的基礎。
timer_interrupt(),更新 jiffies、執行定時器隊列、進程排程、時間統計。/* linux/jiffies.h */
extern unsigned long volatile jiffies;
unsigned long:32 位元系統為 32 bits,約 49.7 天 (HZ=1000) 會回繞歸零。volatile:防止編譯器優化,確保每次讀取都從記憶體取最新值 (中斷處理常更新)。unsigned long timeout = jiffies + HZ * 2; // 2 秒後超時
if (time_before(jiffies, timeout)) {
// 尚未超時
} else {
// 已超時
}
定義於 linux/jiffies.h,採用模算術比較:
| 宏 | 含義 |
|---|---|
time_before(unknown, known) | unknown 早於 known (未超時) |
time_after(unknown, known) | unknown 晚於 known (已超時) |
time_before_eq(unknown, known) | unknown 早於或等於 known |
time_after_eq(unknown, known) | unknown 晚於或等於 known |
原理:將差值視為有號數比較,自動處理 32 位元回繞。
schedule_timeout(jiffies):進程睡眠指定 jiffies (需先設定狀態 TASK_INTERRUPTIBLE)。msleep(ms)、msleep_interruptible(ms):毫秒延遲。udelay(us)、ndelay(ns):忙等待精確延遲 (不睡眠)。xtime (struct timespec),作為系統牆鐘時間基準。hwclock 指令可手動同步:hwclock --hctosys (RTC→系統)、hwclock --systohc (系統→RTC)。現代核心 (2.6.21+) 支援 High-Resolution Timers (hrtimers),基於硬體高精度事件計時器 (HPET) 或 Local APIC Timer,提供奈秒級解析度,不再受限於 HZ。適用於多媒體、即時控制等場景。