上交os lec3 中斷,異常與系統呼叫
阿新 • • 發佈:2022-04-11
- OS如何外設互動,鍵盤等外設具有控制器和緩衝區,將輸入存入緩衝區,而OS去獲取輸入資料有兩種方式,一種是輪詢(OS會去讀狀態暫存器,如果標記位ready,OS等待1s或者10s,確保資料ready,那麼OS就會去讀資料暫存器,這樣太慢了),一種是中斷對於linux中處理萬兆的網路,會聚集一些包,發一箇中斷,在去輪詢處理這些網路包,輪詢與中斷會結合使用
- 使用者態也可以直接去控制硬體,但是需要OS實現配置。
- 中斷是指外部裝置的訊號,是非同步的,而異常是同步的,也就說是在程式執行的時候產生的事件,包括系統呼叫
- 在不同的體系結構裡面對於異常與中斷的稱呼不同
- AArch64的中斷分為兩種重置與中斷
- AArch64中(同步)異常有中止(比如page falut或者除零異常)或者異常產生指令(SVC表示系統呼叫)
- x86-64中的異常與中斷
中斷的產生
- GIC(general interrupt)路由中斷?
- 中斷控制器需要考慮的問題
- IRQ與FIQ中斷處理起來不同
- 非向量中斷相同處理入口,之後由軟體根據暫存器狀態去呼叫具體的處理函式
- 演進到現在成立GIC
- 中斷不能夠佔用太多時間?第一種解決方式是batch,累計處理幾個中斷,比如linux中的網絡卡資料,第二種方式是delay,但是要選擇delay中斷的合適的部分,如果delay了不合適的部分,就可能會造成,看視訊卡頓之類的不好的結果,也就是可以把中斷中非關鍵的部分
- 其中Top Half是:儲存暫存器,遮蔽其他中斷,恢復暫存器,返回原來場景
- Bottom Half可以是軟中斷(softirqs),Bottom Half的執行可以被打斷
- 中斷處理沒有上下文中斷處理時不能夠去和使用者地址空間交換資料,如果和使用者態交換資料,可能會引起缺頁異常,也可能會破壞當前使用者執行過程的狀態
異常的處理
- 異常處理要做一些事,在xv6講了
- AArch64處理異常EL0是指特權級
- 發生異常是在異常向量表中尋找handler,向量表的基址在VBAR_EL1中,選擇基於:異常的型別,特權級,處理器狀態(棧指標/執行狀態)對於這裡的異常發生時處理器的狀態EL1,使用SP_EL0作為SP
- 類似與xv6中,同步異常,也就是系統呼叫的處理
- gbd使用ptrace()系統呼叫
strace
的 -o表示把追蹤結果放到 hello.out中 - 在AArch64是使用暫存器傳參,多個引數可以使用結構體,然後傳結構體指標,但是這樣會存在安全問題所以在系統呼叫中,使用者態的指標一定要去檢查linux中檢測使用者態指標使用的是非全面檢查,就是檢測最大邊界與棧空間
- 更進一步的檢測使用者指標問題的方法是
- 系統呼叫導致效能不行,可以採取batch等方式