ARMv8-A相關歷史文章:
有時候需要去改變處理器的執(zhí)行狀態(tài),比如當在運行一個AArch64的操作系統(tǒng)時,需要去運行一個在EL0的32-bit應用程序,系統(tǒng)必須要切換到AArch32狀態(tài),只能通過改變Exception Level來修改執(zhí)行狀態(tài)。獲取一個異??梢园褕?zhí)行狀態(tài)從AArch32切換到AArch64,從異常返回可以從AArch64切換回AArch32.
當應用程序結束或執(zhí)行返回到OS時,系統(tǒng)可以切換回AArch64。
如圖所示:

在這兩種狀態(tài)之間的切換是在Secure monitor,Hypervisor或操作系統(tǒng)中執(zhí)行的。要在相同的Exception Level中去改變執(zhí)行狀態(tài),系統(tǒng)必須切換到一個更高的Exception Level,之后再返回到初始的Exception Level。
舉個例子,當運行一個64-bit的OS時,你可能有32-bit和64-bit的應用程序,在這種情況下,32-bit的應用程序可以執(zhí)行和產(chǎn)生一個Supervisor Call(SVC)指令,或者接受一個中斷,從而引起處理器切換到EL1和AArch64。OS可以切換任務并返回到EL0和AArch64狀態(tài)。實際上,這意味著不能混合使用32位和64位,因為它們之間沒有直接的調(diào)用方式。
在AArch64和AArch32兩個執(zhí)行狀態(tài)之間的切換要點,總結如下:
- 切換到AArch32,需要處理器從高的Exception Level跳轉到低的Exception Level,通過執(zhí)行ERET指令退出異常處理程序時完成;
- 切換到AArch64,需要處理器從低的Exception Level跳轉到高的Exception Level,可以通過指令執(zhí)行或外部信號來完成;
- 當獲取異?;驈漠惓V蟹祷貢r,Exception Level保持不變,那么執(zhí)行狀態(tài)也不能改變;
- AArch64和AArch32執(zhí)行狀態(tài)有類似的Exception Level,但是在Secure和Non-Secure操作中有一些區(qū)別。異常產(chǎn)生時處理器所處的執(zhí)行狀態(tài),會限制其他執(zhí)行狀態(tài)下可用的Exception levels;
- 在一個特定的Exception Level中,ARMv8-A處理器在AArch32執(zhí)行狀態(tài)下,使用和ARMv7-A中相同的異常模型;
- EL3中的代碼不能將異常提升管到更高的Exception Level,因此不能更改執(zhí)行狀態(tài),Reset除外;
對于最高級別的Exception Level(在ARMv8-A處理器中為EL3),每個Exception Level使用的執(zhí)行狀態(tài)都是固定的,Exception Level只能通過Reset來更改。對于EL2和EL1,可以通過使用更高級別的系統(tǒng)寄存器來控制。