内核态与用户态
內核態與用戶態
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)。
(2)異常事件
當CPU正在執行運行在用戶態的程序時,突然發生某些預先不可知的異常事件,這個時候就會觸發從當前用戶態執行的進程轉向內核態執行相關的異常事件,典型的如缺頁異常。
(3)外圍設備的中斷
當外圍設備完成用戶的請求操作后,會像CPU發出中斷信號,此時,CPU就會暫停執行下一條即將要執行的指令,轉而去執行中斷信號對應的處理程序,如果先前執行的指令是在用戶態下,則自然就發生從用戶態到內核態的轉換。
注意:系統調用的本質其實也是中斷,相對于外圍設備的硬中斷,這種中斷稱為軟中斷,這是操作系統為用戶特別開放的一種中斷,如Linux int 80h中斷。所以從觸發方式和效果上來看,這三種切換方式是完全一樣的,都相當于是執行了一個中斷響應的過程。但是從觸發的對象來看,系統調用是進程主動請求切換的,而異常和硬中斷則是被動的。
總結
- 上一篇: 电脑进程详情
- 下一篇: 如何让你的操作系统更安全二