時鐘概述
2024-07-21 02:36:01
供稿:網友
作者:tommytang
大部分的PC機中都有兩個時鐘源,它們分別叫做RTC(Real Time Clock)和OS時鐘。RTC也叫CMOS時鐘,它是PC主板上一塊依靠電池供電的芯片(晶振)。即使系統斷電,RTC也可以維持日期和時間。 由于它獨立于操作系統,所以也被稱為硬件時鐘,它為整個計算機提供一個計時標準,是最底層的時鐘數據。OS時鐘并不是本質意義上的時鐘,它實際上是硬件(定時/計數器)和軟件(時鐘中斷處理程序)結合的產物。定時/計數器(Time Stamp Counter或TSC)所采用的最典型的芯片是8253/8254可編程定時/計數芯片。定時/計數器從RTC接收輸入脈沖,并對接收到的脈沖計數,每次計數到期,定時/計數器就產生一個輸出脈沖,而后再從頭開始另一次計數。在開機時,操作系統取得RTC中的時間數據來初始化OS時鐘,然后通過定時/計數芯片的向下計數形成OS時鐘。
可編程定時/計數器總體上由兩部分組成:計數硬件和通信寄存器。通信寄存器包含有控制寄存器、狀態寄存器、計數初始值寄存器(16位)、計數輸出寄存器等。通信寄存器在計數硬件和操作系統之間建立聯系,用于二者之間的通信。操作系統通過這些寄存器控制計數硬件的工作方式、讀取計數硬件的當前狀態和計數值等信息。在操作系統內核初始化時,內核向定時/計數器寫入控制字和計數初值,而后計數硬件就會按照一定的計數方式對晶振產生的輸入脈沖進行計數操作:計數器從計數初值開始,每收到一次脈沖信號,計數器就減1。當計數器減至0時,就會輸出高電平或低電平(輸出脈沖),然后從計數初值開始重復另一次計數,從而產生出一個輸出脈沖。定時/計數器產生的輸出脈沖是OS時鐘的硬件基礎,因為這個輸出脈沖將接到中斷控制器上,定期產生中斷信號。這個中斷就是時鐘中斷。操作系統利用時鐘中斷維護OS時鐘的正常工作,每次時鐘中斷,操作系統的時間計數變量就加1。
操作系統對可編程定時/計數器進行有關初始化,然后定時/計時器就對從晶振輸入的脈沖進行計數(分頻),產生三個輸出脈沖Out0、Out1、Out2,三個輸出脈沖分別輸出到中斷控制器、DRAM和揚聲器。Out0送到中斷控制器的0號管腳,觸發周期性的時鐘中斷。每個時鐘中斷稱為一個時鐘“滴答”(tick)。Out0的輸出頻率就是產生時鐘中斷的頻率,也就是tick的頻率。linux操作系統中,這個頻率定義為:
#define HZ 100
即每秒100次始終中斷。
計算機內部的時間以tick為單位,每一次時鐘滴答,系統時間就會加1。Linux利用全局變量jiffies表示自系統啟動以來的時鐘滴答數目。其定義為:
unsigned long volatile jiffies=0;
除了jiffies外,Linux還提供了更符合人們習慣的時間表示方式,即用一個數據結構表示時間,其定義為:
strUCt timeval {
int tv_sec; //秒
int tv_usec; //微秒
}
在操作系統內定義更符合大眾習慣的時間表示:年、月、日。當然,所有的時間都建立在jiffies上。
因此,RTC處于最底層,提供最原始的時鐘數據。OS時鐘建立在RTC之上,初始化完成以后將完全由操作系統控制,和RTC脫離關系。操作系統通過OS時鐘提供給應用程序所有和時間有關的服務。由于OS時鐘基本是一個軟件變量,其表達時間的方式在各個操作系統上互不相同。