linux中的wall clock time

在一些系統調用中需要指定時間是用CLOCK_MONOTONIC還是CLOCK_REALTIME,以前總是搞不太清楚它們之間的差別,現在終於有所理解了。

CLOCK_MONOTONIC是monotonic time,而CLOCK_REALTIME是wall time。

monotonic time字面意思是單調時間,實際上它指的是系統啓動以後流逝的時間,這是由變量jiffies來記錄的。系統每次啓動時jiffies初始化爲0,每來一個timer interrupt,jiffies加1,也就是說它代表系統啓動後流逝的tick數。jiffies一定是單調遞增的,因爲時間不夠逆嘛!

wall time字面意思是掛鐘時間,實際上就是指的是現實的時間,這是由變量xtime來記錄的。系統每次啓動時將CMOS上的RTC時間讀入xtime,這個值是"自1970-01-01起經歷的秒數、本秒中經歷的納秒數",每來一個timer interrupt,也需要去更新xtime。以前我一直想不明白,既然每個timer interrupt,jiffies和xtime都要更新,那麼不都是單調遞增的嗎?那它們之間使用時有什麼區別呢?昨天看到一篇文章,終於明白了,wall time不一定是單調遞增的。因爲wall time是指現實中的實際時間,如果系統要與網絡中某個節點時間同步、或者由系統管理員覺得這個wall time與現實時間不一致,有可能任意的改變這個wall time。最簡單的例子是,我們用戶可以去任意修改系統時間,這個被修改的時間應該就是wall time,即xtime,它甚至可以被寫入RTC而永久保存。一些應用軟件可能就是用到了這個wall time,比如以前用vmware workstation,一啓動提示試用期已過,但是隻要把系統時間調整一下提前一年,再啓動就不會有提示了,這很可能就是因爲它啓動時用gettimeofday去讀wall time,然後判斷是否過期,只要將wall time改一下,就可以欺騙過去了。

發佈了23 篇原創文章 · 獲贊 13 · 訪問量 44萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章