由於CPU以用戶/內核模式運行,我想知道這是由內核決定的。我的意思是,如果調用sys調用,內核將代表進程執行它,但內核如何知道它正在內核模式下執行?內核如何知道CPU是處於用戶模式還是kenel模式?
回答
一般而言,如果它正在運行內核代碼,它將處於內核模式。從用戶空間轉換到內核模式(比如系統調用)會導致發生上下文切換。作爲這種上下文切換的一部分,CPU模式被改變。
您可以通過代碼段寄存器(CS)中設置的特權級別來判斷您處於用戶模式還是內核模式。從RIP或EIP寄存器(指令指針寄存器,取決於您是x86還是x86_64)指向的內存中加載到CPU中的每條指令都將從當前代碼段中全局描述符表(GDT)中描述的段中讀取,段描述符。代碼段描述符的低兩位將確定代碼正在執行的當前特權級別。當系統調用通常通過軟件中斷完成時,CPU將檢查當前特權級別,並且如果它處於用戶模式,則將交換當前代碼段描述符以用於由內核級別確定的內核級別描述符系統調用的軟件中斷門描述符,以及在這個新的內核級堆棧上創建棧切換並保存當前標誌,用戶級CS值和RIP值。當系統調用完成後,用戶模式的CS值,標誌和指令指針(EIP或RIP)值將從內核堆棧中恢復,堆棧切換返回到當前執行進程的堆棧。
內核代碼只在內核模式下執行。沒有辦法,內核代碼可以在用戶模式下執行。當應用程序調用系統調用時,它會產生一個陷阱(軟件中斷),模式將切換到內核模式,並執行系統調用的內核實現。一旦完成,內核將切換回用戶模式,用戶應用程序將繼續在用戶模式下處理。
這不回答問題 – Varun 2017-02-05 18:52:56
該術語被稱爲「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
第一個鏈接是不正確的鏈接。 – HMS 2014-03-18 08:17:49
謝謝,更新。 – 2014-03-18 15:56:08
這是一個簡單的問題,不需要任何專家的意見作爲提供以上..
現在的問題是,CPU如何知道它是內核模式還是其用戶模式。 答案是「模式位」....
它在cpu寄存器集的狀態寄存器中有點位。 當「模式位= 0」,,,它被認爲是內核模式(也稱爲監視模式,特權模式,保護模式......等等) 當「模式位= 1」時,它被認爲是用戶模式...並且用戶現在可以執行其個人應用程序而沒有任何特殊的內核中斷。
這麼簡單...不是嗎?
提供了更少的細節。因爲這個問題期望詳細闡述,但是沒有一篇精心製作的答案。 – HMS 2014-03-18 08:16:44
- 1. 我如何知道用戶是否處於Exposé模式?
- 2. 如何知道當前模式是真實模式還是大實模?
- 3. 內核/用戶模式下的CPU
- 4. MySQL進程在用戶模式還是內核模式下運行?
- 5. 定時器中斷與系統處於內核模式還是用戶模式無關?
- 6. 如何知道是否處於靜音模式?
- 7. 如何判斷我是處於ARM模式還是gdb中的Thumb模式?
- 8. 指令如何知道它是以特權模式還是用戶模式運行?
- 9. 內核模式 - 是否可以訪問用戶模式?
- 10. printf是否以內核模式或用戶模式運行?
- 11. 如何知道自舉模式是被按鈕隱藏還是編程式
- 12. 如何以編程方式知道模塊是否是核心模塊?
- 13. 如何從用戶模式調用/掛鉤內核模式API?
- 14. 如何知道用戶是否設置了鎖定模式?
- 15. 如何知道是使用樣式還是覆蓋控件模板?
- 16. 如何做混合用戶模式/內核模式調試?
- 17. 如何從Windows內核模式啓動用戶模式程序
- 18. 如何從用戶模式切換到內核模式?
- 19. Windows如何實現用戶模式/內核模式?
- 20. 從用戶模式進入內核模式的不同方式是NETLINK Socket嗎?
- 21. 用戶模式和內核模式爲用戶提供保護?
- 22. 用戶模式和內核模式之間的共享內存
- 23. 如何知道我的數據庫是否處於可序列化模式?
- 24. 進程ID在用戶模式和內核模式下是相同的
- 25. 如何知道中斷是硬件中斷還是CPU異常
- 26. 在X86上從內核模式切換到用戶模式的CPU:何時和如何?
- 27. 如何知道C++模板是容器還是類型?
- 28. 什麼是內核模式軟件?
- 29. LdrLoadDll是否有內核模式回調?
- 30. 用戶線程(OS Windows)的內核模式堆棧是什麼?
[從用戶模式切換到內核模式的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
也許你的意思是用戶上下文/進程上下文與內核上下文/中斷上下文? – ninjalj 2011-03-08 20:06:29