——————————————————————異常第四步 一些簡單的東西——————————————————————
給這麼個題目就是想說,這步驟的劃分其實是我捏造的,大概是這順序,但沒求證過!
簡單的東西不多
棧指針的選擇算是一個,
哎呦,一不小心在前面寫完了。。。參看一下SPSR下SP的描述。
第二個簡單的東西是清除物理SError中斷異常,
如果是虛擬SError中斷則清除HCR_EL2.VSE
當HCR_EL2.{TGE=0,AMO=1},虛擬SError即使能,HCR_EL2.VSE位即爲虛擬SError中斷標誌。
如果SCTLR_ELx.IESB在當前異常等級是1,則PE插入一個錯誤同步事件,
認真的講,我並不知道上一句話什麼意思,與ARM Relability Availability and Serviceablity RAS相關。
——————————————————————異常第五步 異常向量——————————————————————
我天!!!終於到頭了,異常向量。
啊!!熟悉的異常向量,跳轉到異常向量,就是真正的開始處理異常了,
而在跳轉之前,還是需要介紹一下異常向量的細節的。
異常向量是當PE執行一個異常的時候就會跳轉到異常向量的地址執行異常處理。
異常向量存在於向量表,
這個向量表佔有一段連續的字節對齊的地址,
從向量基地址開始,
每個異常等級都有一個相關聯的向量基地址寄存器(VBAR Vector Base Address Register)。
至此,一次異常終於得到了執行,
但其實我省略了很多東西:
一次同步異常,很可能是被主動發起,
發起的同時如果會有一些參數需要傳入,這其中是如何操作的,
拍腦門兒的說,肯定是先把東西放到寄存器,然後觸發異常,但實際運作方式必然更加複雜。
對於異步異常(大概也就是中斷之類),被處理的時機在哪兒?是一條指令執行完畢?還是在某些固定的點
?這些都是沒有仔細分析的(主要也是因爲在搜索引擎上可以找到更好的答案,我懶得抄)。
另外,寫到目前爲止,我都沒有將MMU的故事放進來,
因爲那是可以同樣寫一段更長的文字來描述,
但是可以記下兩個寄存器,
一階段頁錶轉換失敗保存失敗的虛擬地址的寄存器FAR_ELx(這個寄存器有三個),
二階段頁錶轉換失敗保存IPA的寄存器HPFAR_EL2(我認爲這個寄存器應該只有一個,最起碼是沒有EL1的),
——————————————————————異常 返回——————————————————————
異常從發生到處理,在上面已經有了不完整的描述,
異常的返回同樣繁複,但很明顯會比上面的東西輕鬆許多。
之前也提到了ERET指令,ERET指令是觸發從異常返回的指令
其實我一開始覺着,處理完了返回,就直接指令流指回去不就OK了,就像函數返回一樣,
很明顯我沒有考慮存在不同異常等級間返回存在的:PSTATE切換,PC切換,更不必說棧指針了。
最終異常返回的情況:
第一種要返回的情況是返回之前執行的指令流,
這已經是最簡單的了吧,
從ELR_ELx從取出地址放到PC、從SPSR_ELx取出狀態放到PSTATE,
看看吧,這就是一次系統調用結束返回所需要的開銷,
微內核改爲用戶態服務提供,需要等着30個寄存器重新換一遍,
更不必說引起cache的更新、TLB的切換
與系統調用,咋比?
雖然較真兒的說,這樣的比較不合理,
因爲進程切換完之後可以一次處理很多業務,從響應時間上講。。。
第二種要返回的情況是進入新的執行線程,比如
Secure monitor啓動hypervisor;
hypervisor啓動OS內核;
OS內核啓動進程。