CPU的自我控制之 6 結束

2021-10-02 03:25:33 字數 1731 閱讀 6480

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

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

簡單的東西不多

棧指標的選擇算是乙個,

哎呦,一不小心在前面寫完了。。。參看一下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 同步控制方式 所謂同步控制方式,就是系統有乙個統一的時鐘,所有訊號均來自這個統一的時鐘訊號。通...