1、正在運行的用戶進程X
2、發生異常(包括系統調用等),CPU完成的工作:把當前程序指針寄存器PC放入ELR_EL1寄存器,把PSTATE放入SPSR_EL1寄存器,把異常產生的原因放在ESR_EL1寄存器,將異常向量表的起始地址VBAR_EL1寄存器的值與該異常類型在異常向量表里的偏移量,得出異常向量表空間的入口地址,然后加載該異常向量空間的入口地址到程序指針寄存器PC
ELR_EL1:Exception Link Register (EL1)
SPSR_EL1:Saved Program Status Register (EL1)
ESR_EL1:Exception Syndrome Register (EL1)
VBAR_EL1:Vector Base Address Register (EL1)
3、保存現場,每個異常向量空間僅有128字節最多可以存儲32條指令(每條指令4字節),而且異常向量空間最后一條指令是b指令跳轉到異常處理程序保存現場,此時完成了用戶靜態進程上下文切換到中斷上下文,即從進程X的用戶態切換到進程X的內核態。
? ? ? ? .align 7就是2的7次方,128個字節
? ? ? ? 異常向量表和處理函數在arch/arm64/kernel/entry.S這個文件
? ? ? ? 異常處理函數的頭文件定義:
4.?異常處理過程中,異常返回前有機會調用schedule函數,其中switch_mm切換進程空間,switch_to切換進程cpu的上下文,將當前進程的X的內核堆棧切換到進程調度算法選出來的next進程(本例定位進程Y)的內核堆棧,并完成了進程CPU上下文寄存器的狀態切換
5.進程Y開始執行,cpu_switch_to函數調用實際上執行一段進程CPU上下文寄存器切換的匯編語言代碼,最后有一個函數調用返回指令ret,之后開始執行進程Y,注意,這里進程Y曾經通過以上步驟被切換出去,因此可以從cpu_swtitch_to函數調用返回處繼續執行進程Y.
6.恢復現場,與3中保存現場相對應。注意,這里是在進程Y的異常過程中,而3中保存現場是在進程X的異常處理過程中,因為內核堆棧從進程X的內核堆棧切換到進程Y的內核堆棧了
7.異常返回指令eret,與2中CPU完成的工作相反,此時完成了從中斷上下文切換到用戶進程上下文,即從進程Y的內核態返回進程Y的用戶態。
8.繼續執行用戶態進程Y