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

2021-08-15 10:50:07 字數 1762 閱讀 5690

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

ps:什麼時候會從使用者態切換到核心態呢?1.中斷;2.陷阱;3.系統呼叫

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

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

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

我們想讓中斷處理程式執行的快,還想讓中斷處理程式多幹活,顯然是有衝突的,所以我們把中斷程式分為兩個部分,中斷處理程式是上半部分,能夠被允許稍後完成的工作會推遲到下半部去(注意!在執行中斷上半部分的時候,是不允許產生其他中斷的,所以設定標誌位irqf_disabled

舉個栗子:拿我們可愛的網絡卡來說事情吧,例如網絡卡從網上收集了很多資料報,於是我們的朋友網絡卡君就通知核心,嘿,我這來了一批新貨,要看看麼,於是核心屁顛屁顛的去處理了(呼叫中斷處理程式)中斷開始執行,通知硬體開始拷貝資料(從網絡卡到記憶體),這件事是很緊迫的,因為網絡卡有一定的快取,超過快取這傢伙就不幹活了(丟棄資料報),為了壓榨網絡卡(讓他好好幹活),核心必須盡快處理這件事情,而且這件事情是硬體相關的(就是和網絡卡脫不了干係),沒了網絡卡幹不了,不能延後,拷貝完這些資料報之後的事情就可以放到下部分了,於是核心忙完了,又去處理剛才被中斷的程序了

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

irqf_sample_random——表明這個裝置的中斷對核心熵池有貢獻

ps:核心熵池負責提供從各種隨機事件匯出真正的隨機數,就是說中斷啥時候來(隨機的),有個中斷產生速率(自然也隨機了),就拿去扔池      子裡產生隨機數用了。。。和中斷關係似乎不是很大

irqf_timer——專門為系統定時器的中斷處理而準備的

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

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

為什麼不能讓中斷睡眠?因為睡眠是為了程序排程存在的,但是中斷處理程式一旦睡眠不僅沒有事件可以喚醒中斷處理程式,而且無法排程,因為程序有個程序號,但是中斷沒有,一旦當前的中斷處理睡眠了,沒有其他的東西會獲得處理器,而且中斷處理永遠不會被喚醒,那麼系統就會癱瘓

一定要在獲取鎖之前,禁止本地中斷!!!為啥呢?見下圖

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

Linux核心 之 中斷

中斷處理函式所作的第一件事情是什麼?答案是遮蔽中斷,所以要遮蔽中斷,是因為新的中斷會再次呼叫中斷處理函式,導致原來中斷處理現場的破壞。因為中斷,它是把原來的上下文都存起來,如果是多級中斷的話,它需要存多級的上下文,除非linux能存多級上下文,感覺是能多存的。如果只能存一級,那必然是要遮蔽中斷,不然...

Linux中斷和中斷處理

眾所周知,處理器的速度跟外圍的硬體裝置的速度往往不在乙個數量級上,因此,如果核心採取讓處理器傳送乙個請求,然後專門等待回應的辦法,顯然差強人意。既然硬體處理的這麼慢,那麼核心就應該在這期間去處理其他事務,等待硬體真正完成了請求的操作後,再回過頭來對它進行處理。輪詢 polling 可能會是一種解決辦...

Linux學習 中斷和中斷處理

2 中斷處理程式 3 上半部和下半部的對比 處理器的速度和外圍裝置的速度相差太遠,為了解決讓核心不做過多的無用功 使用輪詢 這是就需要一種機制在硬體需要時再向核心發出訊號 中斷機制 中斷機制可以更好的協同處理器和外部裝置,並且提高機器的效能 中斷 指的是可以使得硬體得以發出通知給處理器,中斷可以隨時...