linux時間子系統(三)

2022-08-10 08:27:10 字數 1397 閱讀 6029

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_sleep_time.tv_nsec = 0;

write_seqcount_end(&xtime_seq);

raw_spin_unlock_irqrestore(&xtime_lock, flags);

}從初始化函式中可以看到,核心首先通過read_persistent_clock函式,從rtc硬體中獲取rtc time。如果不存在rtc硬體,則rtc time被初始化為0。之後,初始化xtime,raw_time,wall_to_monotonic和total_sleep_time。

2.2.4 時間更新

2.2.4.1 xtime和raw_time更新

static void timekeeping_forward_now(void)

在本函式中,首先計算當前時刻與上一次呼叫read**函式時刻clocksoure計數值的差值,記為cycle_delta。之後,在計算xtime的調整時長時,使用的是timekeeper結構中的mult和shift欄位,而在計算raw_time的調整時長時,使用的是clocksource的mult和shift欄位。因timekeeper的mult欄位會被ntp調整,所以說xtime受ntp調整的影響而raw_time不受ntp調整的影響。

2.2.4.2 total_sleep_time/monotonic time

static void __timekeeping_inject_sleeptime(struct timespec *delta)

在休眠結束時會呼叫__timekeeping_inject_sleeptime來調整時間。由於xtime是牆上時間,所以必須加上休眠時間。monotonic time不受休眠時間的影響,所以需要在wall_to_monotonic中減去相應的休眠時間,這樣xtime與wall_to_monotonic的和所表示的monotonic time的值就沒有發生跳變。在最後,更新total_sleep_time的值。

由於monotonic time的值是xtime與wall_to_monotonic之和,所以除了休眠時間和使用do_settimeofday調整時間時需要調整wall_to_monotonic外,其他時候,monotonic time隨xtime增長而增長。所以大部分時間我們不需要調整wall_to_monotonic變數的值。

linux時間子系統(九)

3.4.3 模擬tick事件 當系統切換到高精度模式後,tick device被高精度定時器系統接管,不再定期地產生tick事件。核心在3.0.30版本中還沒有徹底的廢除jiffies機制,系統還是依賴定期到來的tick事件,完成程序排程和時間更新等操作,大量存在的低精度定時器仍然依賴於jiffie...

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時間子系統之時間的表示

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