2011-03-07 46 views
13

由於CPU以用戶/內核模式運行,我想知道這是由內核決定的。我的意思是,如果調用sys調用,內核將代表進程執行它,但內核如何知道它正在內核模式下執行?內核如何知道CPU是處於用戶模式還是kenel模式?

+0

[從用戶模式切換到內核模式的CPU切換:它究竟做了什麼?它如何使這種轉變?](http://stackoverflow.com/questions/2479118/cpu-switches-from-user-mode-to-kernel-mode-what-exactly-does-it-do-how-does - 它) – 2011-03-07 18:55:03

+0

也許你的意思是用戶上下文/進程上下文與內核上下文/中斷上下文? – ninjalj 2011-03-08 20:06:29

回答

6

一般而言,如果它正在運行內核代碼,它將處於內核模式。從用戶空間轉換到內核模式(比如系統調用)會導致發生上下文切換。作爲這種上下文切換的一部分,CPU模式被改變。

27

您可以通過代碼段寄存器(CS)中設置的特權級別來判斷您處於用戶模式還是內核模式。從RIP或EIP寄存器(指令指針寄存器,取決於您是x86還是x86_64)指向的內存中加載到CPU中的每條指令都將從當前代碼段中全局描述符表(GDT)中描述的段中讀取,段描述符。代碼段描述符的低兩位將確定代碼正在執行的當前特權級別。當系統調用通常通過軟件中斷完成時,CPU將檢查當前特權級別,並且如果它處於用戶模式,則將交換當前代碼段描述符以用於由內核級別確定的內核級別描述符系統調用的軟件中斷門描述符,以及在這個新的內核級堆棧上創建棧切換並保存當前標誌,用戶級CS值和RIP值。當系統調用完成後,用戶模式的CS值,標誌和指令指針(EIP或RIP)值將從內核堆棧中恢復,堆棧切換返回到當前執行進程的堆棧。

+0

這是一個非常豐富的評論,謝謝。 +1。如果您碰巧有一些文檔需要進一步閱讀,我想更多地瞭解它。 – qdii 2012-01-05 17:34:20

+4

保護級別以及如何檢測它們記錄在[Intel Developer's Guide](http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html) ,卷3A,第5章。 – Jason 2012-01-05 18:43:52

3

內核代碼只在內核模式下執行。沒有辦法,內核代碼可以在用戶模式下執行。當應用程序調用系統調用時,它會產生一個陷阱(軟件中斷),模式將切換到內核模式,並執行系統調用的內核實現。一旦完成,內核將切換回用戶模式,用戶應用程序將繼續在用戶模式下處理。

+0

這不回答問題 – Varun 2017-02-05 18:52:56

1

該術語被稱爲「Superviser模式」,它也適用於x86/ARM和許多其他處理器。

閱讀本(其僅適用於x86的CPU):

http://en.wikipedia.org/wiki/Ring_(computer_security)

環0至3是x86處理器的不同的權限級別。通常情況下,只有Ring0和3被使用(內核和用戶),但是現在的Ring 1可以找到用法(例如,VMWare用它模擬來賓的環0的執行)。只有Ring 0具有運行某些特權指令(如lgdt或lidt)的完整權限,因此在彙編級別進行良好測試當然是執行這些指令,並查看您的程序是否遇到任何異常。

閱讀本真的確定你當前特權級別(尋找CPL,這是傑森的回答的pictorialization):

http://duartes.org/gustavo/blog/post/cpu-rings-privilege-and-protection

+0

第一個鏈接是不正確的鏈接。 – HMS 2014-03-18 08:17:49

+0

謝謝,更新。 – 2014-03-18 15:56:08

0

這是一個簡單的問題,不需要任何專家的意見作爲提供以上..

現在的問題是,CPU如何知道它是內核模式還是其用戶模式。 答案是「模式位」....

它在cpu寄存器集的狀態寄存器中有點位。 當「模式位= 0」,,,它被認爲是內核模式(也稱爲監視模式,特權模式,保護模式......等等) 當「模式位= 1」時,它被認爲是用戶模式...並且用戶現在可以執行其個人應用程序而沒有任何特殊的內核中斷。

這麼簡單...不是嗎?

+0

提供了更少的細節。因爲這個問題期望詳細闡述,但是沒有一篇精心製作的答案。 – HMS 2014-03-18 08:16:44

相關問題