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

时间:2011-03-07 18:52:08

标签: linux-kernel

由于CPU在用户/内核模式下运行,我想知道内核是如何确定的。我的意思是,如果调用了一个sys调用,内核代表进程执行它,但是内核如何知道它在内核模式下执行?

5 个答案:

答案 0 :(得分:32)

您可以从代码段寄存器(CS)中设置的权限级别判断您是处于用户模式还是内核模式。从RIP或EIP寄存器指向的存储器加载到CPU中的每条指令(指令指针寄存器,取决于您分别是x86_64还是x86)将从当前代码读取全局描述符表(GDT)中描述的段 - 段描述符。代码段描述符的低两位将确定代码正在执行的当前权限级别。当进行系统调用(通常通过软件中断完成)时,CPU将检查当前的权限级别,如果它处于用户模式,则将当前的代码段描述符交换为内核级别的描述符,如下所示: syscall的软件中断门描述符,以及堆栈切换并保存当前标志,用户级CS值和RIP值在这个新的内核级堆栈上。当系统调用完成后,用户模式CS值,标志和指令指针(EIP或RIP)值将从内核堆栈中恢复,并且堆栈开关将返回到当前正在执行的进程堆栈。

答案 1 :(得分:7)

从广义上讲,如果它正在运行内核代码,则它处于内核模式。从用户空间到内核模式(例如系统调用)的转换会导致上下文切换。作为此上下文切换的一部分,CPU模式已更改。

答案 2 :(得分:3)

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

答案 3 :(得分:1)

这个术语叫做“Superviser Mode”,它也适用于x86 / ARM和许多其他处理器。

读取此内容(仅适用于x86 CPU):

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

响铃0到3是x86 CPU的不同权限级别。通常只使用Ring0和3(内核和用户),但现在Ring 1找到用法(例如,VMWare使用它来模拟客户执行的ring 0)。只有Ring 0具有运行某些特权指令(如lgdt或lidt)的完全权限,因此在汇编级别进行良好的测试当然是执行这些指令,并查看您的程序是否遇到任何异常。

阅读此内容以确定您当前的特权级别(查找CPL,这是Jason答案的图示化):

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

答案 4 :(得分:0)

这是一个简单的问题,不需要上面提供的任何专家评论。

问题是cpu如何知道它是内核模式还是用户模式。 答案是"模式位" ....

cpu寄存器集的状态寄存器中有一点。 当"模式位= 0" ,,它被认为是内核模式(也称为监控模式,特权模式,保护模式......以及许多其他......) 当"模式位= 1"时,它被视为用户模式......用户现在可以在没有任何特殊内核中断的情况下执行其个人应用程序。

这么简单......不是吗?