內核態與用戶態

內核態與用戶態

1 概念

Linux的設計哲學之一就是:對不一樣的操做賦予不一樣的執行等級,就是所謂特權的概念,即與系統相關的一些特別關鍵的操做必須由最高特權的程序來完成。
Intel的X86架構的CPU提供了0到3四個特權級,數字越小,特權越高,Linux操做系統中主要採用了0和3兩個特權級,分別對應的就是內核態(Kernel Mode)用戶態(User Mode)架構

  • 內核態:CPU能夠訪問內存全部數據,包括外圍設備(硬盤、網卡),CPU也能夠將本身從一個程序切換到另外一個程序;
  • 用戶態:只能受限的訪問內存,且不容許訪問外圍設備,佔用CPU的能力被剝奪,CPU資源能夠被其餘程序獲取;

Linux中任何一個用戶進程被建立時都包含2個棧:內核棧,用戶棧,而且是進程私有的,從用戶態開始運行。內核態和用戶態分別對應內核空間與用戶空間,內核空間中存放的是內核代碼和數據,而進程的用戶空間中存放的是用戶程序的代碼和數據。無論是內核空間仍是用戶空間,它們都處於虛擬空間中。函數

2 內核空間相關

  • 內核空間:存放的是內核代碼和數據,處於虛擬空間;
  • 內核態:當進程執行系統調用而進入內核代碼中執行時,稱進程處於內核態,此時CPU處於特權級最高的0級內核代碼中執行,當進程處於內核態時,執行的內核代碼會使用當前進程的內核棧,每一個進程都有本身的內核棧;
  • CPU堆棧指針寄存器指向:內核棧地址;
  • 內核棧:進程處於內核態時使用的棧,存在於內核空間;
  • 處於內核態進程的權利:處於內核態的進程,當它佔有CPU的時候,能夠訪問內存全部數據和全部外設,好比硬盤,網卡等等;

3 用戶空間相關

  • 用戶空間:存放的是用戶程序的代碼和數據,處於虛擬空間;
  • 用戶態:當進程在執行用戶本身的代碼(非系統調用之類的函數)時,則稱其處於用戶態,CPU在特權級最低的3級用戶代碼中運行,當正在執行用戶程序而忽然被中斷程序中斷時,此時用戶程序也能夠象徵性地稱爲處於進程的內核態,由於中斷處理程序將使用當前進程的內核棧;
  • CPU堆棧指針寄存器指向:用戶堆棧地址;
  • 用戶堆棧:進程處於用戶態時使用的堆棧,存在於用戶空間;
  • 處於用戶態進程的權利:處於用戶態的進程,當它佔有CPU的時候,只能夠訪問有限的內存,並且不容許訪問外設,這裏說的有限的內存其實就是用戶空間,使用的是用戶堆棧;

4 內核態和用戶態的切換

(1)系統調用

全部用戶程序都是運行在用戶態的,可是有時候程序確實須要作一些內核態的事情,例如從硬盤讀取數據等。而惟一能夠作這些事情的就是操做系統,因此此時程序就須要先操做系統請求以程序的名義來執行這些操做。這時須要一個這樣的機制:用戶態程序切換到內核態,可是不能控制在內核態中執行的指令。這種機制叫系統調用,在CPU中的實現稱之爲陷阱指令(Trap Instruction)。spa

(2)異常事件

當CPU正在執行運行在用戶態的程序時,忽然發生某些預先不可知的異常事件,這個時候就會觸發從當前用戶態執行的進程轉向內核態執行相關的異常事件,典型的如缺頁異常。操作系統

(3)外圍設備的中斷

當外圍設備完成用戶的請求操做後,會像CPU發出中斷信號,此時,CPU就會暫停執行下一條即將要執行的指令,轉而去執行中斷信號對應的處理程序,若是先前執行的指令是在用戶態下,則天然就發生從用戶態到內核態的轉換。設計

注意:系統調用的本質其實也是中斷,相對於外圍設備的硬中斷,這種中斷稱爲軟中斷,這是操做系統爲用戶特別開放的一種中斷,如Linux int 80h中斷。因此從觸發方式和效果上來看,這三種切換方式是徹底同樣的,都至關因而執行了一箇中斷響應的過程。可是從觸發的對象來看,系統調用是進程主動請求切換的,而異常和硬中斷則是被動的。指針

相關文章
相關標籤/搜索