Linux時鍾子系統分析


夢開始的地方

X86硬件時鍾

首先我們需要了解一下,目前有哪些時鍾
PIT
pit是最古老的pc時鍾設備。Intel 8253/8254 PIT是具有3個16位計數器通道的可編程計數/定時器芯片,晶振頻率為1.193182MHz。
HPET
PET(High Precision Event Timer)俗稱高精度定時器(到時了產生中斷),最低時鍾頻率為10MHZ,而且定義了比較嚴格的精確度。HPET設計時是為了替代PIT和RTC,但是現在PIT和RTC在一些系統中還是有應用的價值。
Apic timer
多處理器系統中,每個處理器都有一個Local APIC。現在Local APIC已經集成到處理器芯片中。Local APIC帶有一個timer。它的頻率與內存總線頻率有關,所以軟件不能直接獲取它的頻率值。一般在啟動時通過PIT/Hpet來計算校准Local APIC的頻率。
CMOS RTC
CMOS RTC需要電池供電的計時芯片,當操作系統關機后,RTC可以繼續計數。RTC提供了year/month/day hour:minute:second的時間格式,精度為秒。它也可以產生頻率為2Hz~8192Hz頻率的周期性時鍾中斷。另外提供了兩種中斷:Update Interrupt和alarm Interrupt,系統可以選擇是否使能。Update Interrupt每秒產生一次,Alarm Interrupt在RTC時間到了設置的時間時產生。
TSC
TSC是64bit的cycle計數器,根據CPU的時鍾振盪器產生的周期計數。TSC不能產生中斷。軟件可以通過指令(rdtsc/rdtscp)來獲取TSC計數值。跟APIC timer一樣,軟件不能直接獲取TSC的輸入頻率,只有通過使用PIT/CMOS timer 來計算校准TSC的頻率。
ACPI Timer
ACPI timer又稱Power management timer(PM timer),是ACPI提供的定時器。它有一個以3.57945MHz頻率(PIT時鍾頻率的3倍)向上計數的24位的計數寄存器,但沒有計數設置寄存器。每當計數達到最大值時,計數又從0開始遞增計數。

LINUX時鍾體系結構

image
clock source:時鍾源,硬件設備的抽象
Clock events:時鍾事件信息,包括硬件中斷發生要執行哪些操作
Timekeeper:Timekeeping子系統負責更新xtime調整誤差,及提供get/settimeofday接口
TickDevices: 對clock events設備的進一層封裝,用於代替時鍾滴答中斷,給內核提供 tick 事件

LINUX時鍾和時間

牆上時間和系統時間
牆上時間(wall-clock):從00:00:00GMT,1 january 1970開始的時間
系統時間(System time):系統啟動后經過的時間。可以用jiffies來換算
時鍾中斷:
(1)更新系統啟動后的時間流逝
Linux中用全局變量jiffies表示系統自啟動以來時鍾滴答數目(中斷個數)
(2)更新牆上時間(wall-clock)
Linux內部用xtime來表示,從某一歷史時刻開始到現在的時間。Update_wall_time()
(3)計算進程的時間片
(4)更新資源計數
(5)引發軟件定時器

LINUX時鍾初始化順序

image

APIC時鍾校驗流程

image

虛機系統中lapic時間校驗失敗分析

先使用被htep校驗過頻率的tsc計算lapic的頻率
使用lapic頻率設置period中斷,檢測lapic發送10次中斷前后的jiffies值大小
目前jiffies普遍偏大,在jiffies時鍾源不變的情況下,說明設置apic中斷和接收中斷並處理花費的時間較多
根因
在hypervisor(HAXM/KVM)中耗時較多,現實時間流逝較多導致guest認為10次中斷到來的時間超過應該增加的jiffies數量,故認為始終不可信而放棄使用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM