0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

時(shí)間子系統(tǒng)的硬件基礎(chǔ)及軟件架構(gòu)

Linux閱碼場(chǎng) ? 來(lái)源:Linux閱碼場(chǎng) ? 作者:程磊 ? 2022-09-09 09:12 ? 次閱讀

作者簡(jiǎn)介:

程磊,某手機(jī)大廠系統(tǒng)開(kāi)發(fā)工程師,閱碼場(chǎng)榮譽(yù)總編輯,最大的愛(ài)好是鉆研Linux內(nèi)核基本原理。

一、時(shí)間概念解析

1.1 時(shí)間使用的需求

1.2 時(shí)間體系的要素

1.3 時(shí)間的表示維度

1.4 時(shí)鐘與走時(shí)

1.5 時(shí)間需求之間的關(guān)系

二、時(shí)間子系統(tǒng)的硬件基礎(chǔ)

2.1 時(shí)鐘硬件類型

2.2 x86平臺(tái)上的時(shí)鐘

2.3 ARM平臺(tái)上的時(shí)鐘

三. 時(shí)間子系統(tǒng)的軟件架構(gòu)

3.1 系統(tǒng)時(shí)鐘的設(shè)計(jì)

3.2 系統(tǒng)時(shí)鐘的實(shí)現(xiàn)

3.3 動(dòng)態(tài)tick與定時(shí)器

3.4 用戶空間API的實(shí)現(xiàn)

四. 總結(jié)回顧

一、時(shí)間概念解析

我們住在空間里,活在時(shí)間中。時(shí)間對(duì)我們來(lái)說(shuō)是既熟悉又陌生。熟悉是因?yàn)槲覀兠刻於荚跁r(shí)間的驅(qū)動(dòng)下忙碌著,陌生是因?yàn)槲覀儚膩?lái)沒(méi)有停下來(lái)認(rèn)真思考過(guò)時(shí)間是什么。今天我們先從對(duì)時(shí)間的使用需求開(kāi)始說(shuō)起。

1.1 時(shí)間使用的需求

我們對(duì)使用時(shí)間有三種需求:知時(shí)、定時(shí)和計(jì)時(shí)。知時(shí)就是我們需要知道現(xiàn)在的時(shí)間是多少,表達(dá)方式是時(shí)分秒、年月日。定時(shí)是我們需要在某個(gè)時(shí)間點(diǎn)被告知,時(shí)間點(diǎn)可以是相對(duì)的或者絕對(duì)的,告知可以是一次性的或者是周期性的,比如每天早上7:30叫我起床,是絕對(duì)時(shí)間點(diǎn)周期性告知,每隔10分鐘向我匯報(bào)一次情況,是相對(duì)時(shí)間點(diǎn)周期性告知。計(jì)時(shí)是我們需要知道某件事從開(kāi)始到結(jié)束一共花了多少時(shí)間,比如大學(xué)運(yùn)動(dòng)會(huì)1000米賽跑,裁判在運(yùn)動(dòng)員起跑時(shí)按一下計(jì)時(shí)器,結(jié)束時(shí)再按一下計(jì)時(shí)器,得出某運(yùn)動(dòng)員跑一千米用了3分50秒。

1.2 時(shí)間體系的要素

為了達(dá)到知時(shí)的目的,我們首先需要建立時(shí)間體系的概念。時(shí)間體系由三個(gè)要素構(gòu)成,1時(shí)間原點(diǎn)、2時(shí)間基本單位、3時(shí)間是否會(huì)暫停。我們把每天用的這個(gè)時(shí)間叫做自然時(shí)間,自然時(shí)間在計(jì)算機(jī)里面也叫做真實(shí)時(shí)間(Real Time),注意Real Time在這里是真實(shí)時(shí)間的意思,而不是實(shí)時(shí)的意思。自然時(shí)間有時(shí)候也會(huì)被叫做墻鐘時(shí)間(wall clock time),或者簡(jiǎn)略為墻上時(shí)間(wall time),小時(shí)候家里墻上用掛鐘來(lái)看時(shí)間的同學(xué)立馬就能明白了。對(duì)自然時(shí)間建立的時(shí)間體系并不是唯一的,可以有不同的時(shí)間原點(diǎn)和時(shí)間基本單位。我們現(xiàn)在使用的公元紀(jì)年,它的時(shí)間原點(diǎn)是耶穌出生的那一年的一月一號(hào)零時(shí)零分零秒。其實(shí)我們也可以使用黃帝紀(jì)年,那現(xiàn)在就是5000多年了,也可以把建國(guó)的時(shí)間當(dāng)做時(shí)間原點(diǎn),那現(xiàn)在就是70幾年。公元紀(jì)年的時(shí)間基本單位是秒,好在全球的秒都是一樣的,沒(méi)有出現(xiàn)什么中秒、美秒、歐秒的區(qū)分,不然換算來(lái)?yè)Q算去就會(huì)很麻煩。自然時(shí)間不會(huì)暫停,計(jì)算機(jī)里面的有些時(shí)間體系可能會(huì)暫停,這個(gè)我們后面再講。我們?cè)賮?lái)總結(jié)一下,現(xiàn)在全世界使用的自然時(shí)間體系是公元紀(jì)年,其時(shí)間原點(diǎn)是耶穌誕生當(dāng)年的一月一號(hào)零時(shí)零分零秒,其時(shí)間基本單位是秒,時(shí)間流逝不會(huì)暫停。這就特別好,大家都是在同一個(gè)時(shí)間體系下生活,這樣討論時(shí)間就很方便,不用來(lái)回轉(zhuǎn)換了。如果不同國(guó)家使用的時(shí)間體系都不相同,時(shí)間體系的原點(diǎn)不同,時(shí)間基本單位也不相同,那相互之間來(lái)回轉(zhuǎn)換時(shí)間就會(huì)非常麻煩。

1.3 時(shí)間的表示維度

接下來(lái)我們說(shuō)一下時(shí)間的表示維度,注意是時(shí)間的表示維度,不是時(shí)間的維度,時(shí)間本身的維度是一維的。如果我告訴你說(shuō)現(xiàn)在的時(shí)間是六百三十七億六千五百七十九萬(wàn)多秒,你是不是會(huì)一臉懵逼,反應(yīng)不過(guò)來(lái)。雖然時(shí)間的基本單位是秒,但是我們?nèi)绻苯佑妹雭?lái)表示時(shí)間,那將非常難以理解和記憶。為此我們建立了多層級(jí)的時(shí)間表示維度,60秒是一分鐘,60分鐘是一個(gè)小時(shí),24小時(shí)是一天,365天是一年。然后我們說(shuō)今天是某年某月某日,具體時(shí)間是幾時(shí)幾分幾秒,就非常方便了,很便于我們?nèi)祟愂褂美斫?。?duì)于人類來(lái)說(shuō)時(shí)間精確到秒就足夠使用了,但是對(duì)于科學(xué)研究來(lái)說(shuō)還需要更高的精度,于是我們把1秒的1/1000叫做毫秒,1毫秒的1/1000叫做微秒,1微秒的1/1000叫做納秒。這樣時(shí)間的表示維度就很豐富了,便于我們?cè)诓煌那闆r下使用。那么計(jì)算機(jī)中的時(shí)間表示維度是多少呢?人類善于理解多維度的時(shí)間表示,但是計(jì)算機(jī)卻善于處理單維度的時(shí)間表示。但是計(jì)算機(jī)用單維度的時(shí)間表示卻有個(gè)問(wèn)題,如果用秒作為基本單位,那么精度顯然達(dá)不到,如果用納秒作為基本單位的話,數(shù)值又太大。所以計(jì)算機(jī)中的時(shí)間采用的是兩層表示維度,超過(guò)1秒的時(shí)間用秒表示,不夠一秒的時(shí)間用納秒表示,每10億納秒向前進(jìn)位一秒。這樣計(jì)算機(jī)中時(shí)間處理就非常方便了。

1.4 時(shí)鐘與走時(shí)

想要實(shí)現(xiàn)知時(shí)的目的我們就需要有工具,這個(gè)工具就叫做時(shí)鐘(clock),有了時(shí)鐘我們就能夠快速準(zhǔn)確地知道自然時(shí)間。下面我們來(lái)給時(shí)鐘下一個(gè)定義。時(shí)鐘,包括硬件的、軟件的、機(jī)械的、電子的,都是用來(lái)追蹤和記錄自然時(shí)間流逝的工具。下面我們?cè)賮?lái)說(shuō)一個(gè)動(dòng)詞,走時(shí),大家一聽(tīng)這個(gè)詞可能會(huì)不知道是啥意思。我再來(lái)說(shuō)一句話,這個(gè)表走時(shí)非常精準(zhǔn),大家立馬就明白了是啥意思。我們?cè)俳o走時(shí)下個(gè)定義,走時(shí),是時(shí)鐘追蹤和記錄時(shí)間流逝的動(dòng)作。為什么在這里要說(shuō)個(gè)走時(shí)的概念呢,因?yàn)橛辛俗邥r(shí)的概念,后面的很多東西都能很輕松地講清楚。

1.5 時(shí)間需求之間的關(guān)系

我們?cè)賮?lái)看一下知時(shí)、計(jì)時(shí)、定時(shí)三者之間的關(guān)系。先說(shuō)知時(shí)和計(jì)時(shí),其實(shí)兩者之間是可以相互轉(zhuǎn)化的。知時(shí)可以轉(zhuǎn)化為計(jì)時(shí),我們?cè)谑虑殚_(kāi)始的時(shí)候記錄一下時(shí)間,在事情結(jié)束的時(shí)候記錄一下時(shí)間,兩者之間的時(shí)間差值就是計(jì)時(shí)。計(jì)時(shí)也可以轉(zhuǎn)化為知時(shí),把計(jì)時(shí)的起點(diǎn)設(shè)置為某一個(gè)時(shí)間體系的時(shí)間原點(diǎn),那么計(jì)時(shí)的結(jié)果就是知時(shí)的結(jié)果。計(jì)時(shí)是時(shí)間原點(diǎn)不特定的知時(shí),知時(shí)是時(shí)間原點(diǎn)特定的計(jì)時(shí)。知時(shí)的結(jié)果是一個(gè)時(shí)間點(diǎn),它是當(dāng)前時(shí)間點(diǎn)到時(shí)間原點(diǎn)的一個(gè)時(shí)間段。計(jì)時(shí)的結(jié)果是時(shí)間段,它是相對(duì)于計(jì)時(shí)原點(diǎn)的時(shí)間點(diǎn)。明白了知時(shí)和計(jì)時(shí)之間的關(guān)系對(duì)于我們理解后面計(jì)算機(jī)的具體做法有很大的幫助。

下面我們?cè)賮?lái)看一下定時(shí)和知時(shí)、計(jì)時(shí)之間的關(guān)系。由于知時(shí)、計(jì)時(shí)可以相互轉(zhuǎn)換,所以它們可以放在一起討論同定時(shí)的關(guān)系。定時(shí)是需要知時(shí)、計(jì)時(shí)的支持的,如果沒(méi)有知時(shí)、計(jì)時(shí),那么就沒(méi)法定時(shí)。絕對(duì)定時(shí)用知時(shí)作為基礎(chǔ)時(shí)間比較方便,相對(duì)定時(shí)用計(jì)時(shí)作為基礎(chǔ)時(shí)間比較方便。當(dāng)然反過(guò)來(lái)也是可以的,因?yàn)橹獣r(shí)計(jì)時(shí)是可以相互轉(zhuǎn)化的。還有一點(diǎn)就是定時(shí)可以用來(lái)作為時(shí)鐘實(shí)現(xiàn)走時(shí)的方法,這個(gè)在計(jì)算機(jī)時(shí)間管理的實(shí)現(xiàn)中就有所體現(xiàn)。

二、時(shí)間子系統(tǒng)的硬件基礎(chǔ)

在生活中我們有各種各樣的時(shí)鐘來(lái)滿足我們對(duì)時(shí)間的需求。比如以前家里常用的座鐘、掛鐘,個(gè)人也會(huì)戴個(gè)機(jī)械手表或者電子手表,這些時(shí)鐘既能知時(shí)也能定時(shí)(有鬧鐘功能),知時(shí)本身也能轉(zhuǎn)化為計(jì)時(shí)。所以一個(gè)時(shí)鐘就能滿足我們對(duì)時(shí)間的所有需求。在有些場(chǎng)合比如大學(xué)運(yùn)動(dòng)會(huì)時(shí),會(huì)有專門的計(jì)時(shí)器,在比賽開(kāi)始之前把計(jì)時(shí)器清零,比賽開(kāi)始的時(shí)候按下開(kāi)始,計(jì)時(shí)器開(kāi)始走時(shí),然后每當(dāng)有一個(gè)人達(dá)到終點(diǎn)的時(shí)候按一下計(jì)時(shí),計(jì)時(shí)器就會(huì)把當(dāng)時(shí)的時(shí)間記下來(lái),當(dāng)所有人都跑完的時(shí)候按下結(jié)束,計(jì)時(shí)器停止走時(shí)。然后回看計(jì)時(shí)器就可以看到每個(gè)人跑完一千米的用時(shí)了。這種專用的計(jì)時(shí)器用來(lái)計(jì)時(shí)就非常方便。

現(xiàn)在家里有座鐘、掛鐘的人已經(jīng)非常少了,戴手表的人也非常少了,大家基本都是用手機(jī)來(lái)看時(shí)間。手機(jī)不僅桌面上有時(shí)間顯示,里面還有個(gè)時(shí)鐘App,它和以前的時(shí)鐘功能差不多,而且更強(qiáng)大。時(shí)鐘App里面不僅能看時(shí)間(知時(shí)),還能定鬧鐘(絕對(duì)時(shí)間定時(shí)),里面還有一個(gè)計(jì)時(shí)器功能,實(shí)際上是倒計(jì)時(shí),倒計(jì)時(shí)的本質(zhì)是相對(duì)時(shí)間定時(shí)。里面還有一個(gè)秒表的功能,和我們前面說(shuō)的運(yùn)動(dòng)會(huì)計(jì)時(shí)器的功能是一樣的,所以秒表是個(gè)專業(yè)的計(jì)時(shí)器。所以手機(jī)上的時(shí)鐘App完美得實(shí)現(xiàn)了我們對(duì)時(shí)間的所有需求。

手機(jī)實(shí)際上就是個(gè)計(jì)算機(jī)系統(tǒng),而且安卓手機(jī)用的還是Linux內(nèi)核。時(shí)鐘App所實(shí)現(xiàn)的功能需要Linux內(nèi)核的支持,內(nèi)核時(shí)間子系統(tǒng)的實(shí)現(xiàn)需要有硬件的支持。

2.1 時(shí)鐘硬件類型

計(jì)算機(jī)里面一共有三類時(shí)鐘硬件,分別是真時(shí)鐘RTC(Real Time Clock)、定時(shí)器Timer、計(jì)時(shí)器Counter。RTC相當(dāng)于是手表、座鐘,定時(shí)器相當(dāng)于是鬧鐘,計(jì)時(shí)器相當(dāng)于是運(yùn)動(dòng)會(huì)中的計(jì)時(shí)器。注意是三類時(shí)鐘硬件,而不是三個(gè),某一類時(shí)鐘可能有多個(gè)不同的硬件,某一個(gè)時(shí)鐘硬件也可能實(shí)現(xiàn)多種不同的時(shí)鐘類型。

計(jì)算機(jī)中還有其它的時(shí)鐘類型,比如晶振時(shí)鐘,是驅(qū)動(dòng)CPU運(yùn)行的周期信號(hào),用來(lái)觸發(fā)和同步CPU內(nèi)部的操作,我們常說(shuō)某CPU是多少GHz,就是說(shuō)這個(gè)時(shí)鐘晶振每秒向CPU發(fā)送多少信號(hào)(大概如此,實(shí)際上比較復(fù)雜,還有倍頻什么的,這里就不討論了)。晶振時(shí)鐘一般在CPU內(nèi)部,有些嵌入式CPU的晶振在外部。時(shí)鐘晶振在軟件層不可見(jiàn)。還有一些設(shè)備也有自己的時(shí)鐘,還有相應(yīng)的驅(qū)動(dòng)可以控制它。由于這些時(shí)鐘都和時(shí)間子系統(tǒng)沒(méi)有關(guān)系,所以本文中就不討論它們了。

不同平臺(tái)的時(shí)鐘硬件各有不同,下面我們就來(lái)分別說(shuō)說(shuō)。

2.2 x86平臺(tái)上的時(shí)鐘

真時(shí)鐘RTC,在x86上的硬件實(shí)現(xiàn)也叫做RTC,和CMOS(計(jì)算機(jī)中有很多叫做CMOS的東西,但是是不同的概念,此處的CMOS是指BIOS設(shè)置保存數(shù)據(jù)的地方)是放在一起的。由于在關(guān)機(jī)后都需要供電,所以兩者放在了一起,由一個(gè)紐扣電池供電。所以有時(shí)候也會(huì)被人叫做CMOS時(shí)鐘。

定時(shí)器Timer,在UP時(shí)代是PIT(Programmable Interval Timer),它以固定時(shí)間間隔向CPU發(fā)送中斷信號(hào)。PIT可以在系統(tǒng)啟動(dòng)時(shí)設(shè)置每秒產(chǎn)生多少個(gè)定時(shí)器中斷,一般設(shè)置是100,250,300,1000,這個(gè)值叫做HZ。到了SMP時(shí)代,PIT就不適用了,此時(shí)有多種不同的定時(shí)器。有一個(gè)叫做Local APIC Timer的定時(shí)器,它是和中斷系統(tǒng)相關(guān)的。中斷系統(tǒng)有一個(gè)全局的IO APIC,有NR_CPU個(gè)Local APIC,一個(gè)Local APIC對(duì)應(yīng)一個(gè)CPU。所以在每個(gè)Local APIC都安裝一個(gè)定時(shí)器,專門給自己對(duì)應(yīng)的CPU發(fā)送定時(shí)器中斷,就很方便。還有一個(gè)定時(shí)器叫做HPET(High Precision Event Timer),它是Intel和微軟共同研發(fā)的。它不僅是個(gè)定時(shí)器,而且還有計(jì)時(shí)器的功能。HPET不和特定的CPU綁定,所以它可以給任意一個(gè)CPU發(fā)中斷,這點(diǎn)和Local APIC Timer不同。

計(jì)時(shí)器Counter,RTC或者定時(shí)器雖然也可以實(shí)現(xiàn)計(jì)時(shí)器的目的,但是由于精度太差,所以系統(tǒng)都有專門的計(jì)時(shí)器硬件。計(jì)時(shí)器一般都是一個(gè)整數(shù)寄存器,以特定的時(shí)間間隔增長(zhǎng),比如說(shuō)1納秒增加1,這樣兩次讀它的值就可以算出其中的時(shí)間差,而且精度很高。x86上最常用的計(jì)時(shí)器叫做TSC(Time Stamp Counter),是個(gè)64位整數(shù)寄存器。還有一個(gè)計(jì)時(shí)器叫做ACPI PMT(ACPI Power Management Timer),但是它是一個(gè)設(shè)備寄存器,需要通過(guò)IO端口來(lái)讀取。而TSC是CPU寄存器,可以直接讀取,讀取速度就非???。

2.3 ARM平臺(tái)上的時(shí)鐘

暫略

三. 時(shí)間子系統(tǒng)的軟件架構(gòu)

當(dāng)我們知道了我們明白什么、我們有什么、我們想要什么的時(shí)候,我們就會(huì)知道我們應(yīng)該怎么做。

從第一章我們明白了時(shí)間的基本概念,從第二章我們知道了我們有RTC、計(jì)時(shí)器、定時(shí)器三類底層硬件,從第三章和第四章我們知道了我們需要什么,那么我們就會(huì)很容易的分析出我們應(yīng)該怎么做。

3.1 系統(tǒng)時(shí)鐘的設(shè)計(jì)

在用戶空間和內(nèi)核空間都有知時(shí)的需求,而底層又有RTC硬件,這樣看來(lái)知時(shí)的需求很好實(shí)現(xiàn)啊,直接訪問(wèn)RTC硬件就可以了。這么做行嗎?我們來(lái)分析一下。首先RTC是個(gè)外設(shè),訪問(wèn)RTC要走IO端口,而這相對(duì)來(lái)說(shuō)是個(gè)很慢的操作。其次RTC的精度不夠,有的RTC精度是秒,有的是毫秒,這顯然是不夠用的。最后系統(tǒng)要實(shí)現(xiàn)很多時(shí)間體系,直接訪問(wèn)RTC靈活性也不夠。所以直接訪問(wèn)RTC是一個(gè)很差的設(shè)計(jì),那么該怎么實(shí)現(xiàn)知時(shí)的需求呢?

我們先來(lái)回憶一下時(shí)鐘和走時(shí)的定義。

時(shí)鐘:包括硬件的、軟件的、機(jī)械的、電子的,都是用來(lái)追蹤和記錄自然時(shí)間流逝的工具。

走時(shí):是時(shí)鐘追蹤和記錄時(shí)間流逝的動(dòng)作。

我們用機(jī)械手表來(lái)解釋一個(gè)這個(gè)概念。手表里面有發(fā)條,發(fā)條的變化是在追蹤時(shí)間的流逝,然后發(fā)條通過(guò)齒輪把時(shí)間的變化記錄在表盤的時(shí)針、分針、秒針上,這樣我們就可以看到現(xiàn)在的時(shí)間是多少了。

我們?cè)賮?lái)回憶一下知時(shí)和計(jì)時(shí)之間的關(guān)系。知時(shí)是原點(diǎn)特定的計(jì)時(shí),計(jì)時(shí)是原點(diǎn)不特定的知時(shí),知時(shí)和計(jì)時(shí)可以相互轉(zhuǎn)化。知時(shí)相減就是計(jì)時(shí),給計(jì)時(shí)一個(gè)特定的原點(diǎn)就是知時(shí)。計(jì)算機(jī)上既有RTC也有計(jì)時(shí)器,RTC雖然又慢精度又低,但是計(jì)時(shí)器又快精度又高啊。計(jì)時(shí)器的精度可以達(dá)到1納秒或者幾納秒,而且計(jì)時(shí)器大部分都是通過(guò)寄存器訪問(wèn)的,速度非??斓摹=o計(jì)時(shí)器的起點(diǎn)一個(gè)確定的時(shí)間點(diǎn),它就是RTC了啊。于是乎方案就出來(lái)了:Linux提出了系統(tǒng)時(shí)鐘的概念,它是一個(gè)軟件時(shí)鐘,相應(yīng)的把RTC叫做硬件時(shí)鐘。系統(tǒng)時(shí)鐘是用一個(gè)變量xtime記錄現(xiàn)在的時(shí)間點(diǎn),xtime的初始值用RTC來(lái)初始化,這樣就只用訪問(wèn)RTC一次就可以了,然后xtime的值隨著計(jì)時(shí)器的增長(zhǎng)而增長(zhǎng)。xtime的值的更新有兩種情況,一種是調(diào)度器tick的時(shí)候從計(jì)時(shí)器更新一下,一種是讀xtime的時(shí)候從計(jì)時(shí)器更新一下。對(duì)于這個(gè)時(shí)鐘,計(jì)時(shí)器就相當(dāng)于是發(fā)條,調(diào)度器tick就相當(dāng)于是齒輪,xtime就相當(dāng)于是時(shí)針、分針、秒針,一個(gè)軟件時(shí)鐘就這么設(shè)計(jì)好了。

Linux中用來(lái)實(shí)現(xiàn)系統(tǒng)時(shí)鐘的軟件體系叫做The Linux Timekeeping Architecture。如果我們把Timekeeping翻譯成“時(shí)間維護(hù)”,感覺(jué)意思好像不到位。好在我們前面講了“走時(shí)”的概念,把Timekeeping翻譯成“走時(shí)”的話,一下子就覺(jué)得意思到了。后面我們就用“Linux走時(shí)框架”這個(gè)詞了。在Linux走時(shí)框架中有三個(gè)基本概念:1.走時(shí)器(struct timekeeper),用來(lái)記錄一些基本數(shù)據(jù),包括系統(tǒng)時(shí)鐘的當(dāng)前時(shí)間值和其它全局時(shí)間體系的一些數(shù)據(jù);2.時(shí)鐘源(struct clocksouce),是對(duì)計(jì)時(shí)器硬件的一種抽象;3.時(shí)鐘事件設(shè)備(struct clock_event_device),是對(duì)定時(shí)器硬件的一種抽象。這三個(gè)對(duì)象相互配合共同構(gòu)成了系統(tǒng)時(shí)鐘。

系統(tǒng)可能會(huì)有很多計(jì)時(shí)器硬件和定時(shí)器硬件。在系統(tǒng)啟動(dòng)時(shí)每個(gè)硬件都會(huì)初始化并注冊(cè)自己。注冊(cè)完之后系統(tǒng)會(huì)選擇一個(gè)最佳的時(shí)鐘源作為走時(shí)器的時(shí)鐘源,選擇一個(gè)最佳的時(shí)鐘事件設(shè)備作為更新系統(tǒng)時(shí)鐘的設(shè)備。系統(tǒng)啟動(dòng)時(shí)會(huì)去讀取RTC的值來(lái)初始化系統(tǒng)時(shí)鐘的值,然后時(shí)鐘事件設(shè)備不斷產(chǎn)生周期性的定時(shí)器事件,在定時(shí)器事件處理函數(shù)中會(huì)讀取時(shí)鐘源的值,再減去上一次讀到的值,得到時(shí)間差,這個(gè)時(shí)間差就是系統(tǒng)時(shí)鐘應(yīng)該前進(jìn)的時(shí)間值,把這個(gè)值更新到走時(shí)器中,并相應(yīng)更新其它時(shí)間體系的值。系統(tǒng)時(shí)鐘就是按照這種方式不斷地在走時(shí)。系統(tǒng)時(shí)鐘除了在啟動(dòng)時(shí)和休眠喚醒時(shí)會(huì)去讀取RTC的值,其它時(shí)間都不會(huì)和RTC交換,兩者各自獨(dú)立地走時(shí),互不影響。

用戶空間API讀取和設(shè)置的時(shí)間是系統(tǒng)時(shí)鐘,和硬件時(shí)鐘RTC沒(méi)有關(guān)系。如果要讀寫RTC的話,需要用ioctl RTC_SET_TIME對(duì)/dev/rtc進(jìn)行操作。stime、settimeofday設(shè)置的系統(tǒng)時(shí)鐘,不會(huì)更改到RTC上,系統(tǒng)重啟后更改就消失了。通過(guò)/dev/rtc修改的硬件時(shí)間也不會(huì)更改到系統(tǒng)時(shí)間上,只有系統(tǒng)重啟后才會(huì)反映到系統(tǒng)時(shí)鐘上。對(duì)此有一個(gè)系統(tǒng)命令hwclock,它不僅可以修改RTC,也可以在兩者之間進(jìn)行同步。hwclock --hctosys 把硬件時(shí)鐘同步到系統(tǒng)時(shí)鐘,hwclock --systohc把系統(tǒng)時(shí)鐘同步到硬件時(shí)鐘。事實(shí)上我們發(fā)現(xiàn)用settimeofday修改的系統(tǒng)時(shí)鐘在系統(tǒng)重啟后生效了,并沒(méi)有丟失,這是為什么呢?是因?yàn)橄到y(tǒng)默認(rèn)的關(guān)機(jī)腳本里面會(huì)執(zhí)行hwclock --systohc,把系統(tǒng)時(shí)鐘同步到硬件時(shí)鐘,所以我們修改的系統(tǒng)時(shí)鐘才不會(huì)丟失。

3.2 系統(tǒng)時(shí)鐘的實(shí)現(xiàn)

暫略

3.3 動(dòng)態(tài)tick與定時(shí)器

低精度定時(shí)器是內(nèi)核在早期就有的定時(shí)器接口,它的實(shí)現(xiàn)是靠調(diào)度器tick來(lái)驅(qū)動(dòng)的。高精度定時(shí)器是隨著硬件和軟件的發(fā)展而產(chǎn)生的。調(diào)度器tick的HZ(每秒tick多少次)是可以配置,它的配置選項(xiàng)有4個(gè),100,、250、300、1000,也即是說(shuō)每次tick的間隔是10ms、4ms、3.3ms、1ms。所以用調(diào)度器tick來(lái)驅(qū)動(dòng)低精度定時(shí)器是很合適的,tick的精度能滿足低精度定時(shí)器的精度。但是用調(diào)度器tick來(lái)驅(qū)動(dòng)高精度定時(shí)器就不合適了,因?yàn)檫@樣高精度定時(shí)器的精度最多是1ms,達(dá)不到納秒的級(jí)別,這樣就算不上是高精度定時(shí)器了。所以對(duì)于高精度定時(shí)器來(lái)說(shuō),情況就正好反了過(guò)來(lái),高精度定時(shí)器直接用硬件實(shí)現(xiàn),然后創(chuàng)建一個(gè)軟件高精度定時(shí)器來(lái)模擬調(diào)度器tick。也就是說(shuō),對(duì)于只有低精度定時(shí)器的系統(tǒng)來(lái)說(shuō),是調(diào)度器tick驅(qū)動(dòng)低精度定時(shí)器;對(duì)于有高精度定時(shí)器的系統(tǒng)來(lái)說(shuō),是高精度定時(shí)器驅(qū)動(dòng)調(diào)度器tick,這個(gè)調(diào)度器tick再去驅(qū)動(dòng)低精度定時(shí)器。

內(nèi)核的低精度定時(shí)器接口和高精度定時(shí)器接口都是一次性的,不是周期性的。通過(guò)一次性的定時(shí)器可以實(shí)現(xiàn)周期性的定時(shí)器,方法是在每次定時(shí)器到期時(shí)再設(shè)置下一次的定時(shí)器,一直這樣就形成了周期性的。這里說(shuō)的是定時(shí)器接口的一次性和周期性,而不是定時(shí)器硬件。下面我們?cè)賮?lái)看看定時(shí)器硬件是一次性的還是周期性的。定時(shí)器硬件本身可以是一次性的也可以是周期性的,也可以兩種模式都存在,由內(nèi)核選擇使用哪一種。對(duì)于低精度定時(shí)器來(lái)說(shuō),它的定時(shí)器硬件可以是一次性的也可以是周期性的,由于調(diào)度器tick是周期性的,所以它的底層硬件就是周期性的。低精度定時(shí)器的精度最多是1ms,也就是定時(shí)器中斷做多一秒有1000次,這對(duì)于系統(tǒng)來(lái)說(shuō)是可以承受的。但是對(duì)于高精度定時(shí)器來(lái)說(shuō),理論上它的定時(shí)器硬件也可以是周期性的。但是如果它的定時(shí)器硬件是周期性的,由于它的精度最多可以達(dá)到1納秒,也就是說(shuō)1納秒要發(fā)生一次定時(shí)器中斷,每秒發(fā)生10億次。這對(duì)于系統(tǒng)來(lái)說(shuō)是不可承受的,而且并不是每納秒都有定時(shí)器事件要處理,所以大部分定時(shí)器中斷是沒(méi)有用的。如果我們把1納秒1次中斷改為1微妙,1微妙1次中斷不就可以大大減少中斷的數(shù)量嘛,但是這樣定時(shí)器的精度就是1微妙,達(dá)不到1納秒的要求了。所以對(duì)于高精度定時(shí)器,底層的定時(shí)器硬件就只能是一次性的了。每次定時(shí)器事件到來(lái)的時(shí)候再去查看一下下一個(gè)最近的定時(shí)器事件什么時(shí)候到期,然后再去設(shè)置一下定時(shí)器硬件。這樣高精度定時(shí)器就可以一直運(yùn)行下去了。但是我們的調(diào)度器tick也需要定時(shí)器中斷,而且是周期性的,怎么辦?好辦,創(chuàng)建一個(gè)到期時(shí)間為1ms的高精度定時(shí)器,每次到期的時(shí)候再設(shè)置一下繼續(xù)觸發(fā),這樣就形成了一個(gè)1000HZ周期性的定時(shí)器事件,就可以驅(qū)動(dòng)調(diào)度器tick。

下面我們講一下定時(shí)器和調(diào)度器tick的初始化過(guò)程,以x86為例。系統(tǒng)啟動(dòng)時(shí)會(huì)先初始化timekeeping。然后hpet注冊(cè)自己,hpet既有定時(shí)器也有計(jì)時(shí)器,hpet定時(shí)器會(huì)成為系統(tǒng)定時(shí)器,hpet計(jì)時(shí)器會(huì)成為timekeeper的時(shí)鐘源。后面tsc計(jì)時(shí)器也會(huì)注冊(cè)自己,并成為最終的時(shí)鐘源。Local APIC Timer定時(shí)器也會(huì)注冊(cè)自己,并成為最終的per CPU tick device。hpet最終只能做broadcast 定時(shí)器了。系統(tǒng)在每次run local timer的時(shí)候都會(huì)檢測(cè)一下,如果不支持高精度定時(shí)器,就嘗試切換到動(dòng)態(tài)tick模式,如果支持高精度定時(shí)器就切換到高精度定時(shí)器模式,此模式下會(huì)嘗試切換到動(dòng)態(tài)tick模式。當(dāng)高精度定時(shí)器和動(dòng)態(tài)tick設(shè)置成功之后,Local APIC Timer會(huì)運(yùn)行在一次性模式,調(diào)度器tick是由一個(gè)叫做sched_timer的高精度定時(shí)器驅(qū)動(dòng)的。每次定時(shí)器到期時(shí)都會(huì)reprogram next event。

3.4 用戶空間API的實(shí)現(xiàn)

用戶空間API的實(shí)現(xiàn)文件如下表所示,具體實(shí)現(xiàn)細(xì)節(jié)就不再展開(kāi)解釋了,大家搜索SYSCALL_DEFINE可以快速找到函數(shù)實(shí)現(xiàn)的地方。

c1eb23aa-2fd4-11ed-ba43-dac502259ad0.png

四. 總結(jié)回顧

通過(guò)前面的介紹,我們了解了時(shí)間的基本概念,知道了計(jì)算機(jī)中實(shí)現(xiàn)時(shí)間子系統(tǒng)的基礎(chǔ)硬件,學(xué)會(huì)了時(shí)間的用戶空間API和內(nèi)核接口,明白了時(shí)間子系統(tǒng)的設(shè)計(jì)原理。下面我們畫個(gè)圖總結(jié)一下:

c221b2da-2fd4-11ed-ba43-dac502259ad0.png

c23f0380-2fd4-11ed-ba43-dac502259ad0.png

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    9009

    瀏覽量

    366151
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11182

    瀏覽量

    208533
  • 時(shí)鐘
    +關(guān)注

    關(guān)注

    10

    文章

    1704

    瀏覽量

    131207

原文標(biāo)題:深入理解Linux時(shí)間子系統(tǒng)

文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    嵌入式系統(tǒng) 硬件軟件架構(gòu)(英文)

    嵌入式系統(tǒng) 硬件軟件架構(gòu)(英文)
    發(fā)表于 01-23 14:30

    嵌入式系統(tǒng) 硬件軟件架構(gòu)(英文)

    嵌入式系統(tǒng) 硬件軟件架構(gòu)(英文)
    發(fā)表于 02-27 09:27

    機(jī)甲大師機(jī)器人控制(三):軟件架構(gòu)設(shè)計(jì) 精選資料推薦

    本文是機(jī)甲大師機(jī)器人控制的系列博客之一。在功能分析的基礎(chǔ)上,本文設(shè)計(jì)軟件架構(gòu)。文章目錄1 開(kāi)發(fā)階段2 軟件架構(gòu)設(shè)計(jì)2.1 頂層子系統(tǒng)2.1
    發(fā)表于 08-18 07:01

    決定嵌入式系統(tǒng)軟件架構(gòu)的因素和架構(gòu)的影響

    嵌入式系統(tǒng)軟件架構(gòu)設(shè)計(jì)目錄1.前言42.決定架構(gòu)的因素和架構(gòu)的影響42.1.常見(jiàn)的誤解52.1.1.小型的系統(tǒng)不需要
    發(fā)表于 11-08 06:54

    軟件架構(gòu)的作用與設(shè)計(jì)思路

    痛苦;能最大限度地復(fù)用原有的代碼;使代碼高內(nèi)聚低耦合,維護(hù)和修改簡(jiǎn)單方便。2.設(shè)計(jì)思路2.1架構(gòu)風(fēng)格嵌入式系統(tǒng)軟件硬件聯(lián)系緊密。首先想到要將硬件的驅(qū)動(dòng)程序和功能應(yīng)用的程序...
    發(fā)表于 12-20 06:04

    【OpenHarmony資料合集】Sensor子系統(tǒng)/圖形子系統(tǒng)/Ability子系統(tǒng)介紹

    ,移動(dòng)互聯(lián)網(wǎng)的快速發(fā)展,在數(shù)字時(shí)代,傳感器在智能交通,智能工業(yè),智能穿戴等領(lǐng)域有著廣闊的應(yīng)用空間?! ?.1 OpenHarmony架構(gòu)圖  2、OpenHarmony資料合集之圖形子系統(tǒng) 標(biāo)準(zhǔn)系統(tǒng)的圖形
    發(fā)表于 03-14 16:35

    ARM CoreLink SSE-200子系統(tǒng)技術(shù)概述

    SSE-200子系統(tǒng)為物聯(lián)網(wǎng)(IoT)和嵌入式細(xì)分市場(chǎng)的產(chǎn)品提供了起點(diǎn)。 SSE-200子系統(tǒng)推動(dòng)系統(tǒng)架構(gòu)軟件標(biāo)準(zhǔn)化,旨在提供包含前沿Co
    發(fā)表于 08-24 06:35

    Arm CoreLink? SSE-200嵌入式子系統(tǒng)技術(shù)概述

    SSE-200子系統(tǒng)用于嵌入式驅(qū)動(dòng)器系統(tǒng)架構(gòu)軟件標(biāo)準(zhǔn)化,旨在提供包含前沿Cortex M和TrustZone技術(shù)的高性能計(jì)算子系統(tǒng)。 該解
    發(fā)表于 08-28 06:30

    高速圖像采集子系統(tǒng)和GPS精密授時(shí)子系統(tǒng)構(gòu)成的時(shí)間基準(zhǔn)系統(tǒng)設(shè)

    由高速圖像采集子系統(tǒng)和GPS精密授時(shí)子系統(tǒng)構(gòu)成,為圖像采集提供精確的時(shí)間基準(zhǔn)。設(shè)計(jì)并實(shí)現(xiàn)了基于PCI總線的GPS時(shí)間獲取板卡,并完成了一系列軟件
    發(fā)表于 07-23 10:52 ?16次下載

    USB接口的硬件軟件架構(gòu)及應(yīng)用設(shè)計(jì)

    介紹USB接口的硬件軟件架構(gòu);USB接口的硬件設(shè)計(jì)及認(rèn)證規(guī)范;如何利用USB接口提高物聯(lián)網(wǎng)設(shè)備接口擴(kuò)展以及提高數(shù)據(jù)吞吐量;SDK USB 應(yīng)用入門。
    的頭像 發(fā)表于 01-17 07:06 ?4495次閱讀
    USB接口的<b class='flag-5'>硬件</b>和<b class='flag-5'>軟件</b><b class='flag-5'>架構(gòu)</b>及應(yīng)用設(shè)計(jì)

    Linux時(shí)間子系統(tǒng)時(shí)間的維護(hù)者:timekeeper

    RTC時(shí)間 在PC中,RTC時(shí)間又叫CMOS時(shí)間,它通常由一個(gè)專門的計(jì)時(shí)硬件來(lái)實(shí)現(xiàn),軟件可以讀取該硬件
    發(fā)表于 05-10 14:02 ?670次閱讀

    面向運(yùn)載火箭能源子系統(tǒng)架構(gòu)設(shè)計(jì)方法

    面向運(yùn)載火箭能源子系統(tǒng)架構(gòu)設(shè)計(jì)方法
    發(fā)表于 06-30 16:57 ?5次下載

    OpenHarmony Dev-Board-SIG專場(chǎng):OpenHarmony音頻子系統(tǒng)以及相機(jī)子系統(tǒng)架構(gòu)

    OpenHarmony Dev-Board-SIG專場(chǎng):OpenHarmony音頻子系統(tǒng)以及相機(jī)子系統(tǒng)架構(gòu)
    的頭像 發(fā)表于 12-28 15:01 ?1470次閱讀
    OpenHarmony Dev-Board-SIG專場(chǎng):OpenHarmony音頻<b class='flag-5'>子系統(tǒng)</b>以及相機(jī)<b class='flag-5'>子系統(tǒng)</b><b class='flag-5'>架構(gòu)</b>

    Linux中斷子系統(tǒng)硬件架構(gòu)

    中斷子系統(tǒng)硬件架構(gòu) 一個(gè)完整的設(shè)備中,與中斷相關(guān)的硬件可以劃分為3類,它們分別是:設(shè)備、中斷控制器和CPU本身。 設(shè)備:設(shè)備是發(fā)起中斷的源,當(dāng)設(shè)備需要請(qǐng)求某種服務(wù)的時(shí)候,它會(huì)發(fā)起一個(gè)
    的頭像 發(fā)表于 09-28 14:09 ?462次閱讀
    Linux中斷<b class='flag-5'>子系統(tǒng)</b><b class='flag-5'>硬件</b><b class='flag-5'>架構(gòu)</b>

    仿真系統(tǒng)軟件架構(gòu)是什么

    仿真軟件架構(gòu)可以包括以下幾個(gè)部分: 硬件驅(qū)動(dòng)部分:負(fù)責(zé)驅(qū)動(dòng)硬件,向上一層提供底層硬件的操作接口。仿真
    的頭像 發(fā)表于 10-16 16:56 ?948次閱讀