Linux的設計哲學之一就是:對不一樣的操做賦予不一樣的執行等級,就是所謂特權的概念,即與系統相關的一些特別關鍵的操做必須由最高特權的程序來完成。
Intel的X86架構的CPU提供了0到3四個特權級,數字越小,特權越高,Linux操做系統中主要採用了0和3兩個特權級,分別對應的就是內核態(Kernel Mode)與用戶態(User Mode)。架構
Linux中任何一個用戶進程被建立時都包含2個棧:內核棧,用戶棧,而且是進程私有的,從用戶態開始運行。內核態和用戶態分別對應內核空間與用戶空間,內核空間中存放的是內核代碼和數據,而進程的用戶空間中存放的是用戶程序的代碼和數據。無論是內核空間仍是用戶空間,它們都處於虛擬空間中。函數
全部用戶程序都是運行在用戶態的,可是有時候程序確實須要作一些內核態的事情,例如從硬盤讀取數據等。而惟一能夠作這些事情的就是操做系統,因此此時程序就須要先操做系統請求以程序的名義來執行這些操做。這時須要一個這樣的機制:用戶態程序切換到內核態,可是不能控制在內核態中執行的指令。這種機制叫系統調用,在CPU中的實現稱之爲陷阱指令(Trap Instruction)。spa
當CPU正在執行運行在用戶態的程序時,忽然發生某些預先不可知的異常事件,這個時候就會觸發從當前用戶態執行的進程轉向內核態執行相關的異常事件,典型的如缺頁異常。操作系統
當外圍設備完成用戶的請求操做後,會像CPU發出中斷信號,此時,CPU就會暫停執行下一條即將要執行的指令,轉而去執行中斷信號對應的處理程序,若是先前執行的指令是在用戶態下,則天然就發生從用戶態到內核態的轉換。設計
注意:系統調用的本質其實也是中斷,相對於外圍設備的硬中斷,這種中斷稱爲軟中斷,這是操做系統爲用戶特別開放的一種中斷,如Linux int 80h中斷。因此從觸發方式和效果上來看,這三種切換方式是徹底同樣的,都至關因而執行了一箇中斷響應的過程。可是從觸發的對象來看,系統調用是進程主動請求切換的,而異常和硬中斷則是被動的。指針