由于CPU在用户/内核模式下运行,我想知道内核如何确定这一点。我的意思是,如果调用了系统调用,内核会代表进程执行它,但内核如何知道它正在内核模式下执行?
由于CPU在用户/内核模式下运行,我想知道内核如何确定这一点。我的意思是,如果调用了系统调用,内核会代表进程执行它,但内核如何知道它正在内核模式下执行?
如果它正在运行内核代码,那么它就处于内核模式。从用户空间转换到内核模式(例如进行系统调用)会导致上下文切换发生。在这个上下文切换的过程中,CPU模式会被改变。
内核代码只能在内核模式下执行。不存在内核代码可以在用户模式下执行的情况。当应用程序调用系统调用时,它将生成一个陷阱(软件中断),并且模式将切换到内核模式并执行系统调用的内核实现。一旦完成,内核将切换回用户模式,并且用户应用程序将继续在用户模式下处理。
http://en.wikipedia.org/wiki/Ring_(computer_security)
“Ring 0到3是x86 CPU的不同特权级别。通常只使用Ring0和3(内核和用户),但现在Ring1也有用途(例如,VMWare用它来模拟客户机对Ring0的执行)。只有Ring0具有完全权限运行某些特权指令(如lgdt或lidt),因此在汇编级别进行良好的测试当然就是执行这些指令,并查看您的程序是否遇到任何异常。”http://duartes.org/gustavo/blog/post/cpu-rings-privilege-and-protection
这是一个简单的问题,不需要像上面提供的专家评论。
问题是CPU如何知道它是内核模式还是用户模式。 答案是“模式位”...
它是CPU寄存器集中状态寄存器中的一位。 当“模式位=0”时,被认为是内核模式(也称为监视器模式、特权模式、保护模式等等...) 当“模式位=1”时,被认为是用户模式...用户现在可以执行其个人应用程序而不受任何特殊内核干扰。
如此简单...是吧?