——————————————————————異常第四步 一些簡單的東西——————————————————————
給這麼個題目就是想說,這步驟的劃分其實是我捏造的,大概是這順序,但沒求證過!
簡單的東西不多
棧指標的選擇算是乙個,
哎呦,一不小心在前面寫完了。。。參看一下spsr下sp的描述。
第二個簡單的東西是清除物理serror中斷異常,
如果是虛擬serror中斷則清除hcr_el2.vse
當hcr_el2.,虛擬serror即使能,hcr_el2.vse位即為虛擬serror中斷標誌。
如果sctlr_elx.iesb在當前異常等級是1,則pe插入乙個錯誤同步事件,
——————————————————————異常第五步 異常向量——————————————————————
我天!!!終於到頭了,異常向量。
啊!!熟悉的異常向量,跳轉到異常向量,就是真正的開始處理異常了,
而在跳轉之前,還是需要介紹一下異常向量的細節的。
異常向量是當pe執行乙個異常的時候就會跳轉到異常向量的位址執行異常處理。
異常向量存在於向量表,
這個向量表占有一段連續的位元組對齊的位址,
從向量基位址開始,
至此,一次異常終於得到了執行,
但其實我省略了很多東西:
一次同步異常,很可能是被主動發起,
發起的同時如果會有一些引數需要傳入,這其中是如何操作的,
拍腦門兒的說,肯定是先把東西放到暫存器,然後觸發異常,但實際運作方式必然更加複雜。
對於非同步異常(大概也就是中斷之類),被處理的時機在哪兒?是一條指令執行完畢?還是在某些固定的點
?這些都是沒有仔細分析的(主要也是因為在搜尋引擎上可以找到更好的答案,我懶得抄)。
另外,寫到目前為止,我都沒有將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核心啟動程序。
指標陣列的三種自我結束能力
在乙個函式中傳進乙個二位陣列,列印的第一種方式是求出字串個數,然後再遍歷列印。includeint main int cnt sizeof c keyword sizeof c keyword 0 printf d n cnt for int i 0 i cnt i return0 除此之外,還可以...
C 控制CPU核的使用
setprocessaffinitymask 引數一 程序控制代碼 1為自身控制代碼 引數二 指定cpu 引數二的設定是二進位制轉十進位制。引數二需填寫十進位制數字 例如我想設定 1cpu二進位制為1 轉換為十進位制為 1 2cpu二進位制為10 轉換為十進位制為 2 3cpu二進位制為100 轉換...
53CPU的控制方式
cpu的控制方式 控制單元控制一條指令的過程,實質上是依次執行乙個確定的微操作序列的過程。由於不同指令所對應的微運算元及複雜程度不同,因此,每條指令和每個操作所需要的時間也不同,主要有以下3種控制方式 1 同步控制方式 所謂同步控制方式,就是系統有乙個統一的時鐘,所有訊號均來自這個統一的時鐘訊號。通...