計時器的中斷處理處理程式會呼叫,更新系統時間還有計算平均負載,也根據時間的推移,更新目前
執行程序的剩餘時間,以及對系統內部設定的軟體計時器更新,還有統計關於系統的數據工作。
然而計時器中斷本身屬於高優先權以及高頻率的中斷,不可能放任中斷做完這所有的工作才會重新啟用中斷,所以計時器的中斷分成兩部分,top half和bottom half。
執行程序的剩餘時間,以及對系統內部設定的軟體計時器更新,還有統計關於系統的數據工作。
然而計時器中斷本身屬於高優先權以及高頻率的中斷,不可能放任中斷做完這所有的工作才會重新啟用中斷,所以計時器的中斷分成兩部分,top half和bottom half。
top half會完成計時數據的更新,而剩下相關工作就交給bottom half,使用softirq的機制來處理。
為了驗證top half和bottom half的分段,我做了一個小實驗.在下載的linux source code裡有一個init/main.c裡面有一個start_kernel函式中,先寫一個printk的指令如下


為了驗證top half和bottom half的分段,我做了一個小實驗.在下載的linux source code裡有一個init/main.c裡面有一個start_kernel函式中,先寫一個printk的指令如下

現在,為了驗證top half和bottom half的分段,在/linux/kernel/timer.c宣告兩個新變數。

th_vs_bh,是用來計算bottom half發生的時間相對於top half經歷了多少次。 hehe是用來當作flag,避免系統不停地印出訊息,因為就算是bottom half,也因為是計時器的關係會頻率很高。為了在top half都會被計數到,在do_timer的函式加入

接下來為了在bottom half可以做比較,在run_timer_softirq加入

這樣每次執行top half,th_vs_bh會被遞增,然後執行到bottom half會重新計算,剛好可以計算經歷過多少top half,這個bottom half才會被執行。
編譯完核心執行結果如下

這樣就可以真正的看到top-half與bottom-half的處理頻率。

沒有留言:
張貼留言