使用者空間就是使用者程序所在的記憶體區域,相對的,系統空間就是作業系統佔據的記憶體區域。使用者程序和系統程序的所有資料都在記憶體中。
是誰來劃分記憶體空間的呢?在電腦開機之前,記憶體就是一塊原始的物理記憶體。什麼也沒有。開機加電,系統啟動後,就對物理記憶體進行了劃分。當然,這是系統的規定,物理記憶體條上並沒有劃分好的位址和空間範圍。這些劃分都是作業系統在邏輯上的劃分。不同版本的作業系統劃分的結果都是不一樣的。
為什麼要劃分使用者空間和系統空間呢?當然是有必要的。作業系統的資料都是存放於系統空間的,使用者程序的資料是存放於使用者空間的。這是第一點,不同的身份,資料放置的位置必然不一樣,否則大混戰就會導致系統的資料和使用者的資料混在一起,系統就不能很好的執行了。分開來存放,就讓系統的資料和使用者的資料互不干擾,保證系統的穩定性。分開存放,管理上很方便,而更重要的是,將使用者的資料和系統的資料隔離開,就可以對兩部分的資料的訪問進行控制。這樣就可以確保使用者程式不能隨便作業系統的資料,這樣防止使用者程式誤操作或者是惡意破壞系統。
處於使用者態的程式只能訪問使用者空間,而處於核心態的程式可以訪問使用者空間和核心空間。那麼使用者態和核心態有什麼區別呢?
當乙個任務(程序)執行系統呼叫而陷入核心**中執行時,我們就稱程序處於核心執行態(或簡稱為核心態)。此時處理器處於特權級最高的(0級)核心**中執行。當程序處於核心態時,執行的核心**會使用當前程序的核心棧。每個程序都有自己的核心棧。當程序在執行使用者自己的**時,則稱其處於使用者執行態(使用者態)。即此時處理器在特權級最低的(3級)使用者**中執行。
核心態與使用者態是作業系統的兩種執行級別,intel x86架構提供ring0-ring3四種級別的執行模式,ring0級別最高,ring3最低。linux使用了ring3級別執行使用者態,ring0作為 核心態,沒有使用ring1和ring2。ring3狀態不能訪問ring0的位址空間,包括**和資料。程式特權級別的不同,其所擁有的權力也不同。如下圖所示。
使用者態切換到核心態的3種方式
a. 系統呼叫
這是使用者態程序主動要求切換到核心態的一種方式,使用者態程序通過系統呼叫申請使用作業系統提供的服務程式完成工作,比如fork()實際上就是執行了乙個建立新程序的系統呼叫。而系統呼叫的機制其核心還是使用了作業系統為使用者特別開放的乙個中斷來實現,例如linux的int 80h中斷。
b. 異常
當cpu在執行執行在使用者態下的程式時,發生了某些事先不可知的異常,這時會觸發由當前執行程序切換到處理此異常的核心相關程式中,也就轉到了核心態,比如缺頁異常。
c. 外圍裝置的中斷
當外圍裝置完成使用者請求的操作後,會向cpu發出相應的中斷訊號,這時cpu會暫停執行下一條即將要執行的指令轉而去執行與中斷訊號對應的處理程式,如果先前執行的指令是使用者態下的程式,那麼這個轉換的過程自然也就發生了由使用者態到核心態的切換。比如硬碟讀寫操作完成,系統會切換到硬碟讀寫的中斷處理程式中執行後續操作等。
這3種方式是系統在執行時由使用者態轉到核心態的最主要方式,其中系統呼叫可以認為是使用者程序主動發起的,異常和外圍裝置中斷則是被動的。
使用者態與核心態(使用者空間與核心)
unix和linux的體系架構.png 三者之間的關係如下 核心態 cpu可以訪問記憶體的所有資料,包括外圍裝置,例如硬碟,網絡卡,cpu也可以將自己從乙個程式切換到另乙個程式。使用者態 只能受限的訪問記憶體,且不允許訪問外圍裝置,占用cpu的能力被剝奪,cpu資源可以被其他程式獲取。為什麼要有使用...
核心態和使用者態
在核心態下,cpu可執行任何指令,在使用者態下cpu只能執行非特權指令。當cpu處於核心態,可以隨意進入使用者態 而當cpu處於使用者態,只能通過中斷的方式進入核心態。一般程式一開始都是執行於使用者態,當程式需要使用系統資源時,就必須通過呼叫軟中斷進入核心態。當乙個任務 程序 執行系統呼叫而陷入核心...
核心態和使用者態
複習的時候發現 作業系統 書上竟然沒有找到使用者態和核心態的概念,還納悶了半天以為是自己上課的時候沒有認真聽講.核心態 cpu可以訪問記憶體所有資料,包括外圍裝置,例如硬碟,網絡卡.cpu也可以將自己從乙個程式切換到另乙個程式 使用者態 只能受限的訪問記憶體,且不允許訪問外圍裝置.占用cpu的能力被...