作業系統Kernel mode和User mode
CPU modes
又稱process modes, CPU states, CPU privilege levels,CPU modes是為了能夠讓某些計算機架構的CPU限制正在被CPU執行的程序所能執行的操作的型別和範圍。得益於它作業系統才能夠以比應用程式更高的privilege(特權)來執行。
CPU modes分為兩類:
- kernel mode,不受任何限制的做任何事情
- user modes,受限模式,注意user modes可以有多個模式
Protection ring
Protection ring又稱hierarchical protection domains,是一種保護資料和功能免於遭受錯誤和惡意行為的機制。
一個Protection ring由一個或多個分級式levels or layers of privilege組成。 通常來說protection ring是硬體強制的,是由一些CPU架構在硬體或微程式碼層面提供不同的CPU modes來達成的。Protection ring本身也是層級的,由最具特權開始(編號0)到具有最少特權的(編號更大)。在大多數作業系統中,Ring 0是最具特權的,能夠直接物理硬體(如CPU、記憶體)互動。
x86架構的protection ring:Ring 0(kernel)、Ring 1-2(Device drivers)、Ring 3(Applications)。下圖:
各個CPU的架構提供的ring數不同,有的多達8個。作業系統為了適配更多的CPU架構,不會使用所有的ring,即使硬體支援更多的CPU modes。比如Windows Server 2008系統只用了Ring 0和Ring 3。
當處理器在某個ring發生錯誤時,會影響到所有低許可權ring。所以當錯誤發生在ring 0時,整個系統都會崩潰。
System call(系統呼叫)
Linux、macOS、Windows之類的單體核心(monolithic kernel)作業系統,作業系統執行在kernel mode(supervisor mode),應用程式執行在user mode。
執行在user mode的程式碼必須使用system call才能夠使用到作業系統核心kernel所提供的服務。
因為針對不同CPU架構,system call的彙編碼是不同的,因此作業系統會提供庫(如glibc)將system call包一層,方便應用程式使用。System call發生時會將控制權交給kernel,呼叫結束時則將控制權交還給user mode的程序。
System call一般不要求context switch,因為system call發生在同一程序裡。