批處理系統?(Batch System) 出現于計算資源匱乏的年代,其核心思想是: 將多個程序打包到一起輸入計算機;當一個程序運行結束后,計算機會?自動?執行下一個程序
?
應用程序難免會出錯,如果一個程序的錯誤導致整個操作系統都無法運行,那就太糟糕了。?保護?操作系統不受出錯程序破壞的機制被稱為?特權級?(Privilege) 機制, 它實現了用戶態和內核態的隔離
?
本章在上一章的基礎上,讓我們的 OS 內核能以批處理的形式一次運行多個應用程序,同時利用特權級機制, 令 OS 不因出錯的用戶態程序而崩潰
?
?
特權級的軟硬件協同設計
實現特權級機制的根本原因是應用程序運行的安全性不可充分信任。如上一章的LibOS,應用和OS緊密連接,應用出bug,可能會連累OS,導致整個系統不可用
?
所以,限制應用程序運行在另外一個無法破壞操作系統的受限執行環境中:
- 應用程序不能訪問任意的地址空間
- 應用程序不能執行某些可能破壞計算機系統的指令
RISC-V 特權級架構
級別 | 編碼 | 名稱 |
0 | 00 | 用戶/應用模式 (U, User/Application) |
1 | 01 | 監督模式 (S, Supervisor) |
2 | 10 | 虛擬監督模式 (H, Hypervisor) |
3 | 11 | 機器模式 (M, Machine) |
級別的數值越大,特權級越高,掌控硬件的能力越強
到目前為止,(Hypervisor, H)模式的特權規范還沒完全制定好,所以本書不會涉及
M 模式軟件 SEE 和 S 模式的內核之間的接口被稱為?監督模式二進制接口?(Supervisor Binary Interface, SBI),而內核和 U 模式的應用程序之間的接口被稱為?應用程序二進制接口?(Application Binary Interface, ABI),當然它有一個更加通俗的名字——?系統調用?(syscall, System Call) 。而之所以叫做二進制接口,是因為它與高級編程語言的內部調用接口不同,是機器/匯編指令級的一種接口。事實上 M/S/U 三個特權級的軟件可分別由不同的編程語言實現。因此只有將接口下降到機器/匯編指令級才能夠滿足其跨高級語言的通用性和靈活性
執行環境的另一種功能是對上層軟件的執行進行監控管理。監控管理可以理解為,當上層軟件執行的時候出現了一些異常或特殊情況,導致需要用到執行環境中提供的功能,因此需要暫停上層軟件的執行,轉而運行執行環境的代碼。由于上層軟件和執行環境被設計為運行在不同的特權級,這個過程也往往(而?不一定?)伴隨著 CPU 的?特權級切換?。當執行環境的代碼運行結束后,我們需要回到上層軟件暫停的位置繼續執行
用戶態應用直接觸發從用戶態到內核態的異常的原因總體上可以分為兩種:其一是用戶態軟件為獲得內核態操作系統的服務功能而執行特殊指令;其二是在執行某條指令期間產生了錯誤(如執行了用戶態不允許執行的指令或者其他錯誤)并被 CPU 檢測到
復習之前知識