ARMv8-A相關(guān)歷史文章:
有時(shí)候需要去改變處理器的執(zhí)行狀態(tài)抑党,比如當(dāng)在運(yùn)行一個(gè)AArch64的操作系統(tǒng)時(shí)劝赔,需要去運(yùn)行一個(gè)在EL0的32-bit應(yīng)用程序稠集,系統(tǒng)必須要切換到AArch32狀態(tài)削茁,只能通過(guò)改變Exception Level來(lái)修改執(zhí)行狀態(tài)。獲取一個(gè)異常可以把執(zhí)行狀態(tài)從AArch32切換到AArch64,從異常返回可以從AArch64切換回AArch32.
當(dāng)應(yīng)用程序結(jié)束或執(zhí)行返回到OS時(shí)驶忌,系統(tǒng)可以切換回AArch64。
如圖所示:
在這兩種狀態(tài)之間的切換是在Secure monitor笑跛,Hypervisor或操作系統(tǒng)中執(zhí)行的付魔。要在相同的Exception Level中去改變執(zhí)行狀態(tài),系統(tǒng)必須切換到一個(gè)更高的Exception Level飞蹂,之后再返回到初始的Exception Level几苍。
舉個(gè)例子,當(dāng)運(yùn)行一個(gè)64-bit的OS時(shí)晤柄,你可能有32-bit和64-bit的應(yīng)用程序擦剑,在這種情況下妖胀,32-bit的應(yīng)用程序可以執(zhí)行和產(chǎn)生一個(gè)Supervisor Call(SVC)指令芥颈,或者接受一個(gè)中斷,從而引起處理器切換到EL1和AArch64赚抡。OS可以切換任務(wù)并返回到EL0和AArch64狀態(tài)爬坑。實(shí)際上,這意味著不能混合使用32位和64位涂臣,因?yàn)樗鼈冎g沒(méi)有直接的調(diào)用方式盾计。
在AArch64和AArch32兩個(gè)執(zhí)行狀態(tài)之間的切換要點(diǎn),總結(jié)如下:
- 切換到AArch32赁遗,需要處理器從高的Exception Level跳轉(zhuǎn)到低的Exception Level署辉,通過(guò)執(zhí)行ERET指令退出異常處理程序時(shí)完成;
- 切換到AArch64岩四,需要處理器從低的Exception Level跳轉(zhuǎn)到高的Exception Level哭尝,可以通過(guò)指令執(zhí)行或外部信號(hào)來(lái)完成;
- 當(dāng)獲取異称驶停或從異常中返回時(shí)材鹦,Exception Level保持不變逝淹,那么執(zhí)行狀態(tài)也不能改變;
- AArch64和AArch32執(zhí)行狀態(tài)有類(lèi)似的Exception Level桶唐,但是在Secure和Non-Secure操作中有一些區(qū)別栅葡。異常產(chǎn)生時(shí)處理器所處的執(zhí)行狀態(tài),會(huì)限制其他執(zhí)行狀態(tài)下可用的Exception levels尤泽;
- 在一個(gè)特定的Exception Level中欣簇,ARMv8-A處理器在AArch32執(zhí)行狀態(tài)下,使用和ARMv7-A中相同的異常模型坯约;
- EL3中的代碼不能將異常提升管到更高的Exception Level醉蚁,因此不能更改執(zhí)行狀態(tài),Reset除外鬼店;
對(duì)于最高級(jí)別的Exception Level(在ARMv8-A處理器中為EL3)网棍,每個(gè)Exception Level使用的執(zhí)行狀態(tài)都是固定的,Exception Level只能通過(guò)Reset來(lái)更改妇智。對(duì)于EL2和EL1滥玷,可以通過(guò)使用更高級(jí)別的系統(tǒng)寄存器來(lái)控制。