時間是作業系統核心的「節拍器」。Linux 核心不僅要維持即時時鐘供時間戳記使用,更需固定週期的定時器驅動排程器、網路協定堆疊等子系統。本文從硬體層面切入,詳細剖析 Linux 2.4 核心如何利用 RTC、PIT、TSC 三大時鐘裝置實現精準計時與中斷驅動。
RTC(如 MC146818/DS12887)由主機板電池供電,關機仍走時。其 64 個暫存器分為:時間/日曆組(10 個,BCD 格式)、狀態/控制組(4 個)、CMOS 設定資料。關鍵暫存器包括:
透過 I/O 埠 0x70(索引)與 0x71(資料)讀寫暫存器,核心啟動時從 RTC 取得牆鐘時間初始化系統時間。
PIT 內建三個 16 位元倒數計數器,輸入頻率 1.193181 MHz。通道 0 連接 IRQ0,計數歸零產生時鐘中斷(tick),頻率約 18.2 Hz(預設 HZ=100 時經分頻調整)。通道 1 用於 DRAM 重整,通道 2 控制蜂鳴器。控制字(埠 0x43)決定計數器讀寫模式(LSB/MSB 順序)與運作模式(模式 2/3 常用於方波/速率產生器)。
Pentium 以上 CPU 提供 64 位元 TSC,每時脈遞增,精度極高,核心常用於高解析度計時(gettimeofday、nanosleep)與效能分析。
核心維護 xtime(struct timeval)為牆鐘時間,jiffies 計數自開機以來的 tick 數。時鐘中斷處理常式(timer_interrupt)執行:更新 jiffies、執行動態定時器隊列、更新進程時間片、平衡 CPU 負載等。動態定時器(timer_list)允許模組註冊未來時間點的回呼函數,廣泛用於網路超時、驅動輪詢等。
RTC 提供開機初始時間,PIT 產生固定頻率 tick 驅動核心排程,TSC 提供高精度時間戳。三者協作構建 Linux 核心穩健的時間骨幹,理解其運作對驅動開發、即時系統調校至關重要。