天天看點

關于linux核心中使用的時鐘

linux核心裡面用了很多的時鐘,其實這些時鐘的用處無外乎就幾種:1.作為心跳,中斷cpu;2.使得使用者可以擷取目前時間;3.實時測量;4.定時 服務。知道了使用目的後,我們來看看到底有哪些時鐘供我們選擇使用:關于這些時鐘的概念,網上已經存在不少文章了,為了不重複(浪費網際網路空間),咱就先來個引用。 

/*摘錄開始:http://blog.chinaunix.net/u1/55599/showart.php?id=1179259 

1):實時時鐘(RTC) 

該時鐘獨立于CPU和其它晶片.即使PC斷電,該時鐘還是繼續運作.該計時由一塊單獨的晶片處理,并把時鐘值存放CMOS.該時間可參在IRQ8上周期性的産生時間信号.頻率在2Hz ~ 8192Hz之間.但在linux中,隻是用RTC來擷取目前時間. 

2):時間戳計時器(TSC) 

CPU附帶了一個64位的時間戳寄存器,當時鐘信号到來的時候.該寄存器内容自動加1 

3):可程式設計中斷定時器(PIC) 

該裝置可以周期性的發送一個時間中斷信号.發送中斷信号的間隔可以對其進行程式設計控制.在linux系統中,該中斷時間間隔由HZ表示.這個時間間隔也被稱為一個節拍(tick). 

在 ./include/asm-i386/param.h 定義 

10#ifndef HZ 

11#define HZ 100 

12#endif 

4):CPU本地定時器 

在處理器的本地APIC還提供了另外的一定定時裝置.CPU本地定時器也可以單次或者周期性的産生中斷信号.與上次描述的PIC相比.它有以下幾點的差別: 

APIC本地計時器是32位.而PIC是16位.由此APIC本地計時器可以提供更低頻率的中斷信号 

本地APIC隻把中斷信号發送給本地CPU.而PIC發送的中斷信号任何CPU都可以處理 

APIC定時器是基于總線時鐘信号的.而PIC有自己的内部時鐘振蕩器 

5):高精度計時器(HPET) 

在linux2.6中增加了對HPET的支援.HPET是一種由intel開發的新型定時晶片.該裝置有一組寄時器,每個寄時器對應有自己的時鐘信号,時鐘信号到來的時候就會自動加1.一個 hpet包括了一個固定頻率的數值增加的計數器以及3到32個獨立的計時器,這每一個計時器有包涵了一個比較器和一個寄存器(儲存一個數值,表示觸發中斷時機)。每一個比較器都比較計數器中的數值和寄存器中的數值,當這兩個數值相等時,将産生一個中斷 

實際上,在intel多理器系統與單處理器系統還有所不同: 

在單處理系統中.所有計時活動過由PIC産生的時鐘中斷信号觸發的 

在多處理系統中,所有普通活動是由PIC産生的中斷觸發.所有具體的CPU活動,都由本地APIC觸發的. 

*/摘錄完畢 

好了,上面對這麼多種時鐘的概念已經闡述的很清楚了,那麼他們之間到底有何聯系呢?幸運的是,在2.6.21核心以後,一切變得不言自明了,2.6.21以上核心将時鐘架構進行了進一步的抽象整理,抽象出了兩個概念: 

struct clocksource :對硬體時鐘裝置的抽象,描述時鐘源,強調靜态事物,源頭 

struct clock_event_device :時鐘的事件的抽象,描述硬體時鐘中斷發生時要執行的動作,強調在時鐘源上面的動态方面。 

這兩個概念被抽象出來以後,我們就可以用面向對象的思路來分析了。仔細看看這兩個概念,它們的偶合性極低,但是還是有聯系的,比如如果你将 clock_event_device設定成one-shot,而clocksource确是一個精度及其低的時鐘源,那麼系統的響應将會相當慢,它們實 際上會影響到對方。 

仔細研究一下上面的衆多時鐘,有的可以産生中斷,有的僅僅是一個計數器,有的...,那麼我們怎麼讀時鐘源啊,不要急,每個clocksource都有一個回調函數用來讀取時鐘源目前值:

struct clocksource {

 本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1274051

繼續閱讀