歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux內核 >> Linux內核實現中斷和中斷處理(一)

Linux內核實現中斷和中斷處理(一)

日期:2017/3/3 12:06:40   编辑:Linux內核

Linux實現中斷處理內核是怎麼知道應用程序要調用系統調用的呢?或者說應用程序怎麼通知系統內核自己需要執行一個系統調用,這是通過軟中斷實現的,通過引發一個異常來促使系統切換到內核態去執行異常處理程序

PS:什麼時候會從用戶態切換到內核態呢?1.中斷;2.陷阱;3.系統調用

中斷分為兩種,硬中斷和軟中斷;

在許多處理器體系結構處理異常和處理中斷的方式類似,為了助於理解,可以把異常想象成軟中斷,我們通常說的中斷是硬中斷,硬中斷是由硬件引起而不是軟件引起的

每一種中斷都有一個對應的中斷處理程序,如果一種中斷設備可以產生多種中斷,那這個中斷設備就有多個中斷處理程序對應,而一個中斷處理程序就是該設備對應的設備驅動程序中的一部分

我們想讓中斷處理程序運行的快,還想讓中斷處理程序多干活,顯然是有沖突的,所以我們把中斷程序分為兩個部分,中斷處理程序是上半部分,能夠被允許稍後完成的工作會推遲到下半部去(注意!在執行中斷上半部分的時候,是不允許產生其他中斷的,所以設置標志位IRQF_DISABLED舉個栗子:拿我們可愛的網卡來說事情吧,例如網卡從網上收集了很多數據包,於是我們的朋友網卡君就通知內核,嘿,我這來了一批新貨,要看看麼,於是內核屁顛屁顛的去處理了(調用中斷處理程序)中斷開始執行,通知硬件開始拷貝數據(從網卡到內存),這件事是很緊迫的,因為網卡有一定的緩存,超過緩存這家伙就不干活了(丟棄數據包),為了壓搾網卡(讓他好好干活),內核必須盡快處理這件事情,而且這件事情是硬件相關的(就是和網卡脫不了干系),沒了網卡干不了,不能延後,拷貝完這些數據包之後的事情就可以放到下部分了,於是內核忙完了,又去處理剛才被中斷的進程了

中斷處理程序標志IRQF_DISABLED——在執行當前中斷處理程序的時候,禁止所有其他的中斷(野蠻!!盡量給想要盡快運行的輕量級中斷使用)

IRQF_SAMPLE_RANDOM——表明這個設備的中斷對內核熵池有貢獻

  PS:內核熵池負責提供從各種隨機事件導出真正的隨機數,就是說中斷啥時候來(隨機的),有個中斷產生速率(自然也隨機了),就拿去扔池 子裡產生隨機數用了。。。和中斷關系似乎不是很大IRQF_TIMER——專門為系統定時器的中斷處理而准備的

IRQF_SHARED——共享中斷線,中斷線可以理解為中斷單獨對著的一個號,同時一個號可以對應多個終端

中斷和鎖之間不得不說的那些事兒這裡簡單的把鎖分為兩類,自旋鎖和睡眠鎖(當然對應著很多具體的鎖),分為兩類是因為,自旋鎖是可以用於中斷(爭用該鎖會導致忙循環)的,但是擁有睡眠性質的鎖是不能用於中斷(爭用該鎖會導致睡眠),只能用於進程。我們之前說了,中斷處理程序的上半部分是很緊迫的,這麼緊迫的事情你怎麼可以去睡眠偷懶呢?!哪怕現在輪不到你,你也得給我等著!

[b]為什麼不能讓中斷睡眠?因為睡眠是為了進程調度存在的,但是中斷處理程序一旦睡眠不僅沒有時間可以喚醒中斷處理程序,而且無法調度,因為進程有個進程號,但是中斷沒有,一旦當前的中斷處理睡眠了,沒有其他的東西會獲得處理器,而且中斷處理永遠不會被喚醒,那麼系統就會癱瘓[/b]一定要在獲取鎖之前,禁止本地中斷!!!為啥呢?見下圖

欲知下半部分如何,且聽下回分解

Copyright © Linux教程網 All Rights Reserved