5

我找不到,即使在一些寫得很好內核的書下面的問題一個合適的回答:先發中斷處理程序會發生什麼?

  1. 他們說,一個ISR不能入睡,因爲它不可能重新安排ISR,因爲它是不與任何進程相連,那麼當更高優先級的中斷搶佔正在執行的進程時會發生什麼?被中斷的ISR不會再重新安排(執行)?如果是的話&誰會做那個工作?很多時候我們會禁用中斷(例如:1.在關鍵區域2.當快速中斷正在執行時,它將禁止當前處理器中的所有中斷),那麼當發生什麼中斷時會發生什麼中斷被禁用?他們只是被丟棄?或將被存儲在某個地方供以後執行?如果有的話&怎麼樣?

  2. 當ISR正在執行時,它將禁止當前IRQ行中的中斷以避免重入(防止執行同一行上的另一個ISR),但爲什麼?如果ISR是可重入的,最新的錯誤是什麼?

* ISR =中斷服務程序

*他們=該書作者

+1

約'快interrupts'的信息是過時的。很久以前,這已從Linux中刪除。所有的中斷應該很快。 *線程中斷*取代了此功能。參見:http://lwn.net/Articles/302043/ – 2013-03-02 23:08:14

回答

1

據我所知ISR可以捷足先登的另一箇中斷,繼續追趕着那個。我沒有看到爲什麼一個進程可以放在堆棧上而沒有理由。

進程是一個操作系統級別的東西,而ISR是CPU級別的東西。如果你在一個進程中調用sleep(),你告訴操作系統你沒有正確的工作,並且它可能運行另一個進程。這不適用於ISR。

此外,what is meant by disabling interrupts?

0

我會盡力回答您的問題1。 回答於1)ISR無法入睡,因爲它們在當前正在運行的進程的上下文中運行。如果他們睡覺,當前正在運行的進程將被轉移到睡眠狀態。這是不可取的。

1

通過首先保存當前CPU狀態並強制程序計數器(PC)跳轉到中斷向量表的位置,中斷將用戶空間的執行陷入內核。然後該表提供一個指向(內核函數序列)的指針,該指針保存當前進程狀態並將中斷ID映射到ISR的開始。在ISR期間發生較高優先級的中斷時,除了運行的ISR和進入的中斷都由同一個(內核)進程處理外,發生的事件序列相同,因此沒有進程進入休眠狀態。

新的中斷當然被忽略,如果它被禁用。但是,如果在處理器正在處理較高優先級的中斷時啓用中斷,則可能會掛起中斷。

ISR是內核空間內的函數調用,需要分配自己的堆棧。如果搶佔過多,可重入中斷可能導致堆棧溢出。大多數內核(包括Linux和Windows)具有固定的堆棧大小。

2
  1. 是的,在操作系統中,只有任務在RR時尚中被壓制。調度的目標是共享CPU資源,將CPU的執行能力公​​平地分配給每個正在運行的任務。中斷本身就是處理特定事件,每個中斷都有自己的優先級。較高優先級的中斷可以搶佔低優先級的ISR。

    工作原理基於中斷控制器上的中斷屏蔽寄存器,當ISR啓動時,它將屏蔽寄存器設置爲禁止具有較低優先級的中斷,並且在ISR返回之前,它恢復屏蔽寄存器以允許較低優先級的中斷。

  2. 中斷處理的請求是由硬件設備提出,它下拉中斷引腳到中斷控制器時數據到達。如果intterupt被禁止(屏蔽被設置),來自硬件的請求處於掛起狀態,並且中斷引腳保持低電平。一旦中斷使能(屏蔽清除),中斷將再次發生。

  3. 中央處理器將不斷觸發中斷並事件獲取計算器!