Linux探祕之使用者態與核心態
阿新 • • 發佈:2018-12-22
一、Unix/Linux的體系架構
Linux作業系統的體系架構分為使用者態和核心態。
核心:本質是一種軟體,控制計算機的硬體資源,並提供給上層應用程式執行的環境。
使用者態:上層應用程式的活動空間。為了是上層應用能訪問CPI資源、儲存資源、I/O資源等,核心必須為上層應用提供訪問的介面:系統呼叫。
系統呼叫:是OS的最小功能單位,庫函式通過對系統呼叫的封裝,將簡單的業務邏輯呈現給上層,方便使用者呼叫。
Shell:特殊的應用程式,是可程式設計的,可以執行Shell指令碼,指令碼的語句通常對系統呼叫做了封裝。
使用者態的應用程式可以通過三個方式來訪問核心態的資源:系統呼叫、庫函式、Shell指令碼
下圖中,在使用者態(使用者空間)的應用程式經過系統呼叫進入核心態,操作和管理硬體資源及系統資源:程序管理、記憶體管理、檔案系統管理、裝置驅動管理、網路資源管理。再通過核心態的來訪問硬體裝置
二、使用者態和核心態的切換
由於作業系統的資源有限,為了避免資源的過多消耗和使用衝突,Linux對不同的操作賦予了執行等級,特權級。Intel x86架構的CPU有0~3四個特權級,硬體在執行每條指令的時候都會對指令的特權級進行檢查。對Linux來說只用到了0和3,最高和最低特權,分別對應了核心態和使用者態。也就是說在Linux環境中,0級特權的指令具有CPU的最高執行權利,3級的指令則只有最基本的權利
執行在核心態的程序可以執行任何操作,但是使用者態的進行可執行的操作和訪問的資源都會受限,這些使用者態的程序在執行的過程中,當需要執行核心許可權(0級特權)的操作時,需要程序使用者到到核心態的切換。
例如C庫函式的malloc(),它通過sbrk()系統呼叫來分配記憶體,當malloc呼叫sbrk的時候,涉及到使用者態到核心態的切換。(系統呼叫本質是中斷,軟中斷)。
使用者態到核心態的切換:
①系統呼叫
使用者態程序通過系統呼叫,申請使用系統提供的服務來完成工作,主動切換到核心態的形式。
②異常
當CPU執行使用者態的程式,發生不可知的異常,會觸發從當前使用者態執行的程序轉向核心態執行相關的異常事件,進入核心態。例如缺頁異常。
③外圍裝置中斷
外圍裝置完成使用者的請求之後,向CPU發出中斷訊號,CPU會暫時執行下一條即將執行的指令,轉而去執行中斷訊號對應的處理程式。如果先執行的指令是使用者態的,那麼就會轉向核心態。例如硬碟讀寫完成,系統會切換到硬碟讀寫的中斷處理程式中執行後續操作。
這三種方式是系統在執行時,由使用者態切換到核心態的主要方式。其中系統呼叫是由使用者程序主動發起的,異常和外圍裝置中斷都是被動的。