Linux:理解用戶態與內核態

目錄

一、用戶態與內核態的概念

二、爲什麼要有用戶態和內核態

三、用戶態與內核態的切換


在Linux的學習中經常會遇到用戶態和內核態這兩個術語,今天我們就來好好了解一下: 

一、用戶態與內核態的概念

        先看一下Linux整體架構圖:

        

        從圖上我們可以看出來通過 系統調用 將Linux整個體系分爲用戶態和內核態(或者說內核空間和用戶空間)

  • 用戶態:提供應用程序運行的空間,爲了使應用程序訪問到內核管理的資源,例如CPU,內存,I/O等。
  • 內核態:本質是內核,一種特殊的軟件程序用於控制計算機的硬件資源,例如協調CPU資源,分配內存資源,並且提供穩定的環境供應用程序運行。

        用戶態只能受限的訪問內存, 且不允許訪問外設(硬盤、網卡等);內核態CPU可以訪問內存所有數據, 包括外設,且可以將自己從一個程序切換到另一個程序。

  • 系統調用:操作系統對外會表現爲一個整體,但是會暴露自己的部分接口來供上層開發使用,這部分由操作系統提供的接口,叫做系統調用。
  • 庫函數:庫函數實際上就是對系統調用接口的封裝,提供簡單的基本接口給用戶
  • Shell:命令行,爲了方便用戶和系統交互。

 

二、爲什麼要有用戶態和內核態

        由於需要限制不同的程序之間的訪問能力, 防止他們獲取別的程序的內存數據, 或者獲取外設的數據併發送到網絡,操作系統劃分出兩個權限等級: 用戶態 和 內核態。

        簡單來說,就是:對不同的操作給予不同的“權限”

 

三、用戶態與內核態的切換

        用戶程序跑在用戶態下,但是如果需要執行一些操作例如申請內存,網絡讀寫時,自己的權限不夠,就需要轉換到內核態去讓內核的code幫忙幹一些事情,這樣就存在用戶態和內核態切換的過程,例如:C庫接口malloc申請動態內存,malloc的實現內部可能會調用 系統調用brk()來分配內存。

注意:

        上述例子提到的malloc的實現內部爲什麼是可能會進行系統調用而不是一定會進行系統調用呢?

        malloc是用於用戶空間堆擴展的函數接口。該函數是C庫,屬於封裝了相關係統調用(brk())的glibc庫函數,而不是系統調用(系統可沒有sys_malloc()),如果談及malloc函數涉及的系統內核的那些操作,那麼總體可以分爲用戶空間層面和內核空間層面來討論:

  • 用戶層面:每當進程調用malloc,首先會在該堆緩衝區尋找足夠大小的內存塊分配給進程(選擇緩衝區中的那個塊就有首次命中和最佳命中兩種算法)。如果free_chunk_list已無法滿足需求的chunk時,那麼malloc會通過調用系統調用brk()將進程空間的堆進行擴展,在新擴展的堆空間上建立一個新的chunk並加入到空閒隊列中,這個過程相當於進程想向系統批量申請一塊內存
  • 內核層面:用戶層面中如果malloc的空閒chunk列表無法滿足用戶的需求,那麼就要通過sys_brk()進行堆的擴展,這時候才真正算得上進入內核空間。
  • 那麼如何從用戶態切換到內核態呢?有以下三種方式:
  1. 系統調用:是用戶態進程主動要求切換到內核態的一種方式,用戶態進程通過系統調用申請使用操作系統提供的服務程序完成工作。例如上面的例子。(其實系統調用本身就是中斷,是軟件中斷)
  2. 異常:如果當前進程運行在用戶態,如果這個時候發生了異常事件,就會觸發切換。例如:缺頁異常。
  3. 外設中斷:當外設完成用戶的請求時,會向CPU發送中斷信號,此時CPU會暫停執行下一條即將要執行的指令轉而去執行與中斷信號對應的處理程序,如果先前執行的指令是用戶態下的程序,那麼這個轉換的過程自然也就發生了由用戶態到內核態的切換。例:如硬盤讀寫操作完成後,系統會切換到硬盤讀寫的中斷處理程序中執行後續操作。

 

  • 用戶態切換到內核態的具體步驟:
  1. 從當前進程的描述符中提取其內核棧的ss0及esp0信息。
  2. 使用ss0和esp0指向的內核棧將當前進程的cs,eip,eflags,ss,esp信息保存起來,這個過程也完成了由用戶棧到內核棧的切換過程,同時保存了被暫停執行的程序的下一條指令。
  3. 將先前由中斷向量檢索得到的中斷處理程序的cs,eip信息裝入相應的寄存器,開始執行中斷處理程序,這時就轉到了內核態的程序執行了。

用戶態和內核態之間切換調度的成本很高,原因是什麼?

答:Linux下每個進程的棧有兩個,一個是用戶態棧,一個是內核態棧。在從用戶態棧進入內核的時候,進行執行棧的轉換,需要保存用戶態的寄存器,在內核態返回用戶態的時候會恢復這些寄存器的內容,相對而言這是一個很大的開銷且耗時。

 

  • 操作系統通過中斷來從用戶態切換到內核態內核態可以直接切換到用戶態

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章