Kernel

在核心上處理中斷

  • March 8, 2020

我知道中斷處理是如何工作的(切換模式、保存寄存器、更改堆棧……)。但是,我很好奇,如果在我們仍處於核心模式而不是使用者模式時發生中斷怎麼辦?

完全相同的。但是,如果我們正在處理一個中斷,那麼可能什麼都沒有,或者在我們完成之前什麼都沒有。

我們在所有情況下所做的:

  • 無條件保存模式,並將模式設置為主管模式(由硬體完成。由中斷觸發)
  • 無條件保存狀態並切換堆棧
  • 執行中斷程式碼
  • 無條件切換堆棧,恢復狀態和恢復模式

片語“將模式設置為主管模式”可以理解為以下任何一種:

  • 確保該模式是主管模式。
  • 將 1 寫入狀態寄存器的 S 位

中斷中斷

可能有多個(但有限的)中斷優先級。每個級別都會有一個堆棧。一個中斷只能被更高優先級的中斷所中斷。低優先級的中斷,可以被高優先級阻塞。這解決了大部分問題,而不是堆棧不能被破壞。

但是,可以阻止較低優先級的中斷(包括使用者程序。這些是最低的中斷優先級)。因此,確保中斷快速(程式碼不多)很重要,尤其是對於較高優先級的中斷:完成工作並退出,讓較低優先級的中斷(例如使用者程序)執行需要時間的位。

堆棧

當程序呼叫核心時,核心可以使用與程序相同的堆棧(同步呼叫:在程式碼中使用系統呼叫)。

核心還將為每個中斷優先級設置一個堆棧。請參閱中斷中斷部分。

引用自:https://unix.stackexchange.com/questions/571790