操作系統的運行機制
一條高級語言的代碼翻譯過來可能會對應多條機器指令 :
“ 指令 ” :處理器(CPU) 能識別、 執行的最基本命令
程序運行的過程其實就是CPU執行一條一條的機器指令的過程
注: 很多人習慣把 Linux、 Windows、 MacOS 的 “ 小黑框 ” 中使用的命令也稱爲“ 指令 ” , 其實這是“ 交互式命令接口 ” , 注意與本節的 “ 指令 ” 區別開。 此 “ 指令 ” 指二進制機器指令
內核程序 & 應用程序
我們普通程序員寫的程序就是“ 應用程序 ”
微軟、 蘋果有一幫人負責實現操作系統, 他們寫的是“ 內核程序 ”
由很多內核程序組成了“ 操作系統內核 ” , 或簡稱“ 內核(Kernel) ”
內核是操作系統最重要最核心的部分, 也是最接近硬件的部分甚至可以說, 一個操作系統只要有內核就夠了(eg: Docker—>僅需Linux內核)
操作系統的功能未必都在內核中, 如圖形化用戶界面 GUI
特權指令 & 非特權指令
應用程序只能使用“ 非特權指令 ” , 如:加法指令、 減法指令等
操作系統內核作爲 “管理者” , 有時會讓CPU執行一些“特權指令” , 如: 內存清零指令。 這些指令影響重大,只允許“ 管理者 ” —— 即操作系統內核來使用
在CPU設計和生產的時候就劃分了 特權指令和非特權指令, 因此CPU執行一條指令前就能判斷出其類型
內核態 & 用戶態
CPU 有兩種狀態, “內核態” 和“用戶態”
處於內核態時, 說明此時正在運行的是內核程序, 此時可以執行特權指令
處於用戶態時, 說明此時正在運行的是應用程序, 此時只能執行非特權指令
拓展: CPU 中有一個寄存器叫 程序狀態字寄存器(PSW) , 其中有個二進制位, 1表示“ 內核態 ” , 0表示“ 用戶態 ”
別名: 內核態 = 核心態 = 管態; 用戶態 = 目態
內核態、 用戶態 的切換
內核態 -> 用戶態: 執行一條特權指令——修改PSW的標誌位爲“ 用戶態 ” , 這個動作意味着操作系統將主動讓出CPU使用權
用戶態 -> 內核態: 由“ 中斷 ” 引發, 硬件自動完成變態過程, 觸發中斷信號意味着操作系統將強行奪回CPU的使用權
除了非法使用特權指令之外, 還有很多事件會觸發中斷信號。 一個共性是, 但凡需要操作系統介入的地方, 都會觸發中斷信號
啓動過程:
-
剛開機時, CPU 爲“ 內核態 ” , 操作系統內核程序先上CPU運行
-
開機完成後, 用戶可以啓動某個應用程序
-
操作系統內核程序在合適的時候主動讓出 CPU, 讓該應用程序上CPU運行,操作系統內核在讓出CPU之前, 會用一條特權指令把 PSW 的標誌位設置爲“ 用戶態 ”
-
應用程序運行在“ 用戶態 ”
-
此時, 一位猥瑣黑客在應用程序中植入了一條特權指令, 企圖破壞系統…
-
CPU發現接下來要執行的這條指令是特權指令, 但是自己又處於“ 用戶態 ”
-
這個非法事件會引發一箇中斷信號,CPU檢測到中斷信號後, 會立即變爲“ 核心態 ” , 並停止運行當前的應用程序, 轉而運行處理中斷信號的內核程序
-
“ 中斷 ” 使操作系統再次奪回CPU的控制權
-
操作系統會對引發中斷的事件進行處理, 處理完了再把CPU使用權交給別的應用程序
兩種指令、 兩種處理器狀態、 兩種程序
有的指令“人畜無害” 。 比如: 加、 減、 乘、 除 這些普通的運算指令。
有的指令有很高的權限。 比如: 內存清零指令。 如果用戶程序可以使用這個指令, 就意味着一個用戶可以將其他用戶的內存數據隨意清零, 這樣做顯然是很危險的。
特殊指令:不允許用戶程序使用
用程序狀態字寄存器(PSW) 中的某標誌位來標識當前處理器處於什麼狀態。 如 0 爲用戶態, 1 爲核心態
用戶態:此時CPU只能執行非特權指令
核心態:特權指令、 非特權指令都可執行
內核程序:操作系統的內核程序是系統的管理者,既可以執行特權指令, 也可以執行非特權指令, 運行在核心態。
應用程序:爲了保證系統能安全運行, 普通應用程序只能執行非特權指令, 運行在用戶態
操作系統的內核
內核是計算機上配置的底層軟件, 是操作系統最基本、 最核心的部分。
實現操作系統內核功能的那些程序就是內核程序。
有的操作系統不把這部分功能歸爲“ 內核功能 ” 。 也就是說, 不同的操作系統, 對內核功能的劃分可能並不一樣
比喻:
內核就是企業的管理層, 負責一些重要的工作。
只有管理層才能執行特權指令, 普通員工只能執行非特權指令。 用戶態、 核心態之間的切換相當於普通員工和管理層之間的工作交接
大內核: 企業初創時體量不大, 管理層的人會負責大部分的事情。 優點是效率高; 缺點是組織結構混亂, 難以維護。
微內核: 隨着企業體量越來越大, 管理層只負責最核心的一些工作。 優點是組織結構清晰, 方便維護; 缺點是效率低。
特權指令只能在核心態下執行
內核程序只能在核心態下執行