萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux 核心全域變數 jiffies 深度解析:時間換算、64位元擴充、回繞處理與 USER_HZ

jiffies 是 Linux 核心中代表系統啟動以來時脈中斷次數的全域變數,是核心時間管理的基石。本文深入剖析 jiffies 的資料型別、與秒數互換、內部 64 位元實作、回繞處理巨集、以及 USER_HZ 機制如何解決用戶空間相容性問題。

jiffies 核心時間變數示意圖

基本定義與單位換算

  • 型別:unsigned long(32 位元系統為 32 bits,64 位元系統為 64 bits)。
  • 頻率:HZ(每秒時脈中斷次數,常見值 100、250、1000)。
  • 系統運作秒數 = jiffies / HZ
  • 秒數轉 jiffies = seconds * HZ

64 位元擴充:jiffies_64 與 get_jiffies_64()

  • 32 位元系統上,jiffies 為 jiffies_64 低 32 位,約 497 天會回繞(HZ=1000 時約 49.7 天)。
  • get_jiffies_64() 以序列鎖(seqlock)安全讀取完整 64 位值,64 位元系統上直接回傳 jiffies。
  • 核心內部建議直接使用 64 位元版本避免回繞問題。

回繞安全比較巨集

核心提供四組巨集正確處理無號長整數回繞:

time_after(a,b)      // a 在 b 之後
time_before(a,b)     // a 在 b 之前
time_after_eq(a,b)   // a >= b
time_before_eq(a,b)  // a <= b

64 位元版本對應 time_after64 等,需搭配 jiffies_64 或 get_jiffies_64() 使用。

用戶空間相容:USER_HZ 與 jiffies_to_clock_t()

  • 早期核心若變更 HZ,用戶空間程式(如 ps, top)會因假設 HZ=100 而計算錯誤。
  • 核心定義 USER_HZ(x86 上固定為 100),透過 jiffies_to_clock_t() 將核心 jiffies 轉為用戶空間期望的單位。
  • 對應反向轉換 clock_t_to_jiffies() 及 64 位元版 jiffies_64_to_clock_t()。

do_div() 實作細節

核心巨集 do_div(n, base) 以內嵌組合語言在 32 位元系統上高效執行 64 位元除法,修改被除數並回傳餘數。

理解 jiffies 機制對編寫核心模組、高精度定時器與效能分析至關重要。

copyright © 萬盛學電腦網 all rights reserved