内核如何知道CPU是处于用户模式还是kenel模式?

问题描述:

由于CPU以用户/内核模式运行,我想知道这是由内核决定的。我的意思是,如果调用sys调用,内核将代表进程执行它,但内核如何知道它正在内核模式下执行?内核如何知道CPU是处于用户模式还是kenel模式?

+0

[从用户模式切换到内核模式的CPU切换:它究竟做了什么?它如何使这种转变?](http://*.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

一般而言,如果它正在运行内核代码,它将处于内核模式。从用户空间转换到内核模式(比如系统调用)会导致发生上下文切换。作为这种上下文切换的一部分,CPU模式被改变。

您可以通过代码段寄存器(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

内核代码只在内核模式下执行。没有办法,内核代码可以在用户模式下执行。当应用程序调用系统调用时,它会产生一个陷阱(软件中断),模式将切换到内核模式,并执行系统调用的内核实现。一旦完成,内核将切换回用户模式,用户应用程序将继续在用户模式下处理。

+0

这不回答问题 – 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

+0

第一个链接是不正确的链接。 – HMS 2014-03-18 08:17:49

+0

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

这是一个简单的问题,不需要任何专家的意见作为提供以上..

现在的问题是,CPU如何知道它是内核模式还是其用户模式。 答案是“模式位”....

它在cpu寄存器集的状态寄存器中有点位。 当“模式位= 0”,,,它被认为是内核模式(也称为监视模式,特权模式,保护模式......等等) 当“模式位= 1”时,它被认为是用户模式...并且用户现在可以执行其个人应用程序而没有任何特殊的内核中断。

这么简单...不是吗?

+0

提供了更少的细节。因为这个问题期望详细阐述,但是没有一篇精心制作的答案。 – HMS 2014-03-18 08:16:44