CPU的自我控制之(6)-結束

——————————————————————異常第四步 一些簡單的東西——————————————————————

 

給這麼個題目就是想說,這步驟的劃分其實是我捏造的,大概是這順序,但沒求證過!

 

簡單的東西不多

棧指針的選擇算是一個,

哎呦,一不小心在前面寫完了。。。參看一下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內核啓動進程。

發佈了37 篇原創文章 · 獲贊 4 · 訪問量 3388
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章