簡體   English   中英

Linux:中斷處理:誰保存中斷進程的上下文(一些軟件(中斷處理程序)或硬件(CPU本身))?

[英]Linux: Interrupt handling: Who saves the context of interrupted process (some software (interrupt handler) or hardware (CPU itself))?

當 CPU 中斷時,誰來保存中斷進程的上下文(某些軟件(中斷處理程序)或硬件(CPU 本身))?

據我所知,軟件(中斷處理程序)無法保存中斷進程的上下文,因為如果該軟件(中斷處理程序)正在運行,那么指令指針寄存器將具有該軟件(中斷處理程序)指令的地址,而不是中斷的過程。 因此,該軟件(中斷處理程序)將不知道中斷進程的指令指針寄存器中的值是什么。

所以,我認為有一些硬件(在 CPU 中或 CPU 本身)保存了中斷進程的上下文,因為硬件(在 CPU 中或 CPU 本身)可以直接訪問指令指針寄存器,其中將包含指令地址中斷的過程。

我是對還是錯? 如果有人知道,請告訴我詳細信息。

CPU 本身和 kernel 都負責保存部分當前用戶空間上下文。 這主要是 x86_64/amd64 特定的答案,中斷調用的來源主要可以在這里和這里找到。 中斷調用的硬件方面在此處的第 6 節中進行了精確描述。

實際上,當在全 64 位模式下發生中斷時,CPU 會自動將堆棧指針切換到預定義的(通過特殊硬件寄存器)“中斷堆棧”。 然后,壓入舊用戶堆棧的堆棧指針,以及SSCSRFLAGSRIP的內容和生成的中斷的錯誤代碼。 此外,特權級別會自動發生變化,並且 CPU 會跳轉到Interrupt Descriptor Table (IDT)中的預定位置,該表是 kernel 在啟動時設置的。 聲明這些入口點的代碼在上面鏈接的第一個源文件中。 在中斷調用的另一端(在內核中繼續執行),通過將各種寄存器壓入中斷堆棧,將用戶進程剩余的 state 保存到必要的程度(取決於中斷本身)。 然后通過調用 C 中的處理程序來處理中斷,一旦處理程序返回(或者如果特定中斷有一些副作用,則不恢復)用戶進程將恢復。 您可以在上面的第二個鏈接中看到調用的函數。 這是一個總體概述。 您通常對 CPU 處理指令指針或原始堆棧指針之類的事情是正確的,然后從 kernel 端處理通用寄存器或其他 state。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM