Operating system 从用户模式切换到内核模式

Operating system 从用户模式切换到内核模式,operating-system,kernel,Operating System,Kernel,在我的操作系统类中,有人问我从用户模式切换到内核模式是否具有特权。这不是特定于操作系统的。起初我认为是的,但这似乎是一个大难题。我参考了我的课本: 硬件只允许在计算机中执行特权指令 内核模式 切换到内核模式的指令是特权模式的一个示例 指示 加涅,格雷格;亚伯拉罕西尔伯沙茨;彼得·高尔文(2010-01-26)。 操作系统概念(第22页)。威利高等教育版,Kindle版 所以我们从用户模式开始。切换到内核模式需要特权指令。特权指令必须在内核模式下执行,因此我们必须切换到内核模式才能切换到内核模式

在我的操作系统类中,有人问我从用户模式切换到内核模式是否具有特权。这不是特定于操作系统的。起初我认为是的,但这似乎是一个大难题。我参考了我的课本:

硬件只允许在计算机中执行特权指令 内核模式

切换到内核模式的指令是特权模式的一个示例 指示

加涅,格雷格;亚伯拉罕西尔伯沙茨;彼得·高尔文(2010-01-26)。 操作系统概念(第22页)。威利高等教育版,Kindle版

所以我们从用户模式开始。切换到内核模式需要特权指令。特权指令必须在内核模式下执行,因此我们必须切换到内核模式才能切换到内核模式


我认为系统不允许用户直接切换到内核模式,但是当用户试图执行另一条特权指令时,它是由内核完成的。这是否正确?

在user land中,您可以通过对内核的系统调用请求特权操作,内核会根据需要切换到内核模式。用户正在使用API,内核正在执行特权操作。

通常存在一组指令,这些指令实际上不是以常规方式切换到内核模式,而是请求系统服务。因此,它们会切换到内核模式,但只能在调用操作系统为用户代码调用而设置的某些功能的上下文中进行

在大多数现代系统中,甚至这一点也被实现特定功能的API层所隐藏,其中的特定功能部分可能正在执行上述操作系统调用


但一般来说,用户代码不能像说“从现在开始,我想在内核模式下运行”那样做。

在用户模式下,您不能仅仅切换到内核模式。用户和内核之间的交互是通过系统调用完成的。每个系统调用都提供一个定义的服务。用户发送服务名称(通常是一个数字)和所需参数。 下面是一个真实世界的例子。这是x86 AT&T风格的汇编程序

它将系统调用名移到EAX寄存器中,将参数指针移到CPU的EBX寄存器中,然后发出软件中断号42。中断处理将切换到内核模式。在中断描述符表(IDT)中查找中断编号,并调用在其中注册的函数syscall handler。此处理程序以内核模式执行。返回到用户模式时,代码将EAX的内容移动到变量ret中

pok_ret_t pok_do_syscall (pok_syscall_id_t syscall_id, pok_syscall_args_t* args)
{
  pok_ret_t ret;
  uint32_t  args_addr;
  uint32_t  id;

  args_addr = (uint32_t) args;
  id        = (uint32_t) syscall_id;

  asm volatile ( "movl %1,%%eax  \n\t"
                 "movl %2,%%ebx  \n\t"
                 "int $42        \n\t"
                 "movl %%eax, %0 \n\t"
                 :"=g"(ret)
                 :"g"(id), "g"(args_addr)
                 : "%eax" , "%ebx"
               );
  return ret;
}
这是一个很好的观点来阅读更多关于这一点


因此,您不仅可以切换到内核,还可以要求内核为您做一些事情。然后内核会告诉你它是否完成了

这是第8版中引入的拼写错误,保留在第9版中。在第七版第19页,它说:

“切换到用户模式的指令是特权模式的一个示例 指示。”


这显然更有意义。

这是正确的答案,对我帮助很大。非常感谢。是的,这是一个很好的答案,但是模式位呢。。。什么时候改变…@BaradwajAryasomayajula你是说?为什么这与你有关?也许这是另一个问题。我不能给您一个精确的答案,但是CPU执行的指令“int”会引发一个中断,从而启动到内核模式的切换。您可能想了解更多详细信息。@Philipp我研究过一个名为“模式位”的寄存器,它只在内核模式下访问。每当CPU切换到内核模式时,它都会将模式位更新为0,每当它切换到用户模式时,它都会更新为1。@BaradwajAryasomayajula for Control Register 0 bit 0(保护启用)请参阅《英特尔手册》第3A卷第页。2-16. 如果您还有问题,请另开一个。这里不是讨论这个的地方,我不太确定。对第七版的修订清楚地表明第八版(因此也是第九版)是正确的。。。(也就是说,在第7版中被认定为一个错误。)@ephemera维护勘误表的人可能是学生。切换到内核模式不需要特权有什么意义??(每个程序都可以简单地做到吗?)没有程序可以切换到内核模式,系统在内核模式下启动,在中断时切换到内核模式。在让程序执行之前,由引导系统(通常是操作系统)切换到用户模式,并确保“每个程序”都不能为中断提供服务。如果有一条指令要切换到内核模式,而您需要处于内核模式才能使用它。。。嗯,这就是OP的推理,它是正确的。这意味着有指令,切换到内核模式以调用其他系统服务,但问题仍然没有得到回答,依我看。如果切换到内核模式是一条特权指令,那么没有人能从用户模式做到这一点,对吗?完全糊涂了…那么这真的是打字错误吗?