Linux
context_switch() 究竟何時將控制權切換到新程序?
如果我正確理解上下文切換,則該過程涉及兩個主要步驟:
- MMU 切換到將新程序的虛擬記憶體空間映射到物理記憶體空間的一種。
- 為目前程序保存處理器狀態,然後為新程序切換到保存的處理器狀態。據推測,這包括將程序計數器設置為從切換到的程序上次停止的位置開始執行。
在核心中,處理所有這些的函式被呼叫
context_switch()
(這裡是原始碼)。此函式處理兩個必需的步驟,但在設置處理器狀態後,它會返回。這很令人困惑,因為在我看來,一旦程序計數器被手動移動到一個新的地方,
context_switch()
就根本沒有機會返回。我能想到的唯一解釋是context_switch()
切換到新程序的程式碼和切換程序返回的程式碼。換句話說,每個程序最終都會從自己的程序切換context_switch()
到另一個程序context_switch()
。但是我似乎不清楚這如何在新的分叉程序中起作用。所以也許context_switch()
實際上執行完成並返回,然後其他東西跳轉到目標程序的正確部分?這種想法正確嗎?究竟在什麼時候
context_switch()
從一個過程轉移到另一個過程?什麼時候context_switch()
回來?當它切換到一個新程序時,新程序的執行狀態在哪裡結束?這如何適應新的分叉程序?過去幾天我一直在閱讀核心原始碼的相關部分,試圖弄清楚這一點,但恐怕我還沒有更接近理解。希望這裡有人可以提供幫助。
請注意第3366行中的註釋(截至 5.7.7):
/* Here we just switch the register state and the stack. */
context_switch()
不直接載入新指令指針(程序計數器),而是切換堆棧——堆棧包含適當的返回地址。當函式返回時,它返回到新任務。分叉時,虛擬返回地址與兩個程序(父程序和子程序)中的相同;不同的是返回值。