版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、定時器的分析徐駿王崢嶸第1頁20198291一一概述概述何為定時器?何為定時器?定時器(timer)是unix中提供的一種定時服務(wù)的機(jī)制。它所起的作用是在某個特定的時間喚醒某個進(jìn)程來做一些工作。用到定時器的unix指令有sleepat…etc.在windows95windows98中也有類似的機(jī)制。在硬件中,有一個系統(tǒng)時鐘,可以稱為硬時鐘。同時,linux還維護(hù)一個軟件時鐘稱為軟時鐘。軟時鐘使用jiffies這個全程變量來維持服務(wù)。使用
2、兩套時鐘的原因是因為硬時鐘的讀取太麻煩。所消耗的時間太長。Os通過跟蹤軟時鐘來提供定時服務(wù)。并在每次開機(jī)時,軟時鐘讀取一次硬時鐘,此后各不相關(guān)。定時器服務(wù)過程簡介。定時器服務(wù)過程簡介。定時器的初始化過程在開機(jī)時就初始化完畢。(詳細(xì)分析見后)要求軟件定時服務(wù)的進(jìn)程(如sleepat)申請timer資源,申請成功后它將它所對應(yīng)的timer加入到timer_list鏈表中,并把這個定時器的timeout值交給timerexpirestimer
3、fn()對應(yīng)與該進(jìn)程的定時服務(wù)程序。隨著時鐘硬中斷的發(fā)生,timerexpires越來越小,當(dāng)expires=jiffies時(也就是說,到了定時服務(wù)的預(yù)定時間,當(dāng)最后一次時間中斷發(fā)生時,激活該定時器,轉(zhuǎn)入定時器中斷處理程序,并把定時服務(wù)程序放入bottom_half(一個中斷響應(yīng)的緩沖機(jī)制)刪除該定時器。然后中斷返回。在bottom_half緩沖區(qū)中的定時服務(wù)程序由sched.c中的調(diào)度算法決定何時執(zhí)行(一般馬上就執(zhí)行)。分析簡介分析
4、簡介綜觀定時器的整個流程,我決定把我的分析分成3個部分:1.定時器的初始化過程。2.定時器的數(shù)據(jù)結(jié)構(gòu)以及定時服務(wù)程序的主體。3.定時器的輔助數(shù)據(jù)結(jié)構(gòu)以及他們所起的作用。備注:本文使用redhat2.0.34的代碼,故與原文可能有出入,請諒解。本文參考:linux電子書籍linuxtalking李善平老師的講義(linux2)。。定時器的分析徐駿王崢嶸第3頁20198293在time.c中,Linux首先定義了函數(shù)“timer_inter
5、rupt()”函數(shù),本文后續(xù)部分將會再提到此函數(shù),這兒,只需知道該函數(shù)就是時鐘中斷服務(wù)程序。接著,time.c中又定義了irqaction結(jié)類型的變量irq0:staticstructirqactionirq0=timer_interrupt00“timer“NULLNULL其中structirqaction結(jié)構(gòu)在interrupt.h中被定義,它包含與中斷服務(wù)程序有關(guān)的一些信息,如處理中斷的函數(shù)入口地址(即第一項:void(hler)
6、(intvoidstructpt_regs))。除timer_inmterrupt()外,time.c中還定義了pentium_timer_interrupt(),這個函數(shù)與timer_inmterrupt相類似,但另外保存了中斷服務(wù)程序發(fā)生時的一些信息。最后,time.c定義了time_init()函數(shù),該函數(shù)用一個宏(#ifndefCONFIG_APM與#endif對)包括如計算機(jī)中有CPUhardwaretimecounter時須
7、編譯的指令,它包括將中斷處理改為pentium_timer_interrupt(),最后,調(diào)用setup_x86_irq(0設(shè)置中斷向量。二:轉(zhuǎn)入二:轉(zhuǎn)入init進(jìn)程進(jìn)程start_kernel()在設(shè)置完irq0時間3中斷向量后,繼續(xù)各方面的初始化工作,且在此函數(shù)末尾調(diào)用:kernel_thread(initNULL0)在初始化進(jìn)行順利的前提下,函數(shù)必將執(zhí)行到這一步。kernel_thread(程序名,參數(shù),環(huán)境變量)是一個匯編語言函
8、數(shù)。只有在核心態(tài)運行,且沒有調(diào)用過execve()的進(jìn)程,才可使用該函數(shù)。kernel_thread()利用linuxi386的系統(tǒng)調(diào)用(第0X80號)創(chuàng)建一個新進(jìn)程。該系統(tǒng)調(diào)用返回后,可比較esp寄存器和esi寄存器的值來判斷父、子進(jìn)程。父進(jìn)程通過kernel_thread()函數(shù)返回,執(zhí)行task[0]進(jìn)程。子進(jìn)程則調(diào)用由參數(shù)“程序名”指定的程序。系統(tǒng)轉(zhuǎn)入init進(jìn)程。首先,init()調(diào)用kernel_thread(bdflush
9、NULL0)創(chuàng)建后臺進(jìn)程bdflush。bdflush(fsbuffer)不斷循環(huán)寫出文件系統(tǒng)緩沖區(qū)中“臟”的內(nèi)容。接著,用調(diào)用函數(shù)init_swap_timer(),這個函數(shù)設(shè)置定時時鐘表(timer_table)的SWAP_TIMER表項,并設(shè)定時鐘中斷響應(yīng)函數(shù)為“swap_tick”,在源代碼中為:timer_table[SWAP_TIMER].expires=0timer_table[SWAP_TIMER].fn=swap_ti
10、cktimer_active|=(1SWAP_TIMER)關(guān)于timer_table的數(shù)據(jù)結(jié)構(gòu),在下節(jié)有較詳細(xì)的討論。swap_tick函數(shù)在每個時間片滿時被調(diào)用,它首先判斷是否freepage不夠或swap間隔時間到,若是的話,喚醒睡眠在kswapd_awake隊列的進(jìn)程并告訴CPU需要重新調(diào)度。在該程序末尾,程序執(zhí)行:timer_active|=(1SWAP_TIMER)它再次激活timer_table[SWAP_TIMER]表項,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論