18

在我的操作系统课上,有人问我从用户模式切换到内核模式是否具有特权。这不是特定于操作系统的。起初我认为是的,但它似乎是一个大的 Catch 22。我参考了我的教科书:

硬件允许特权指令仅在内核模式下执行。...

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

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

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

我认为系统不允许用户直接将自己切换到内核模式,但是当用户寻求执行另一条特权指令时,它是由内核完成的。那是对的吗?

4

4 回答 4

32

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

它将系统调用名称移入 EAX 寄存器,将指向参数的指针移入 CPU 的 EBX 寄存器,然后发出软件中断号 42。中断处理将切换到内核模式。中断号在中断描述符表 (IDT) 中查找并调用在那里注册的函数,即系统调用处理程序。该处理程序在内核模式下执行。返回用户模式时,代码会将 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;
}

OS Dev wiki是阅读更多相关信息的好地方。

所以你不只是切换到内核,而是你可以要求内核为你做一些事情。然后内核会告诉你它是否完成。

于 2013-09-29T13:50:53.057 回答
7

这是第 8 版中引入并保留在第 9 版中的错字。在第七版,第 19 页,它改为:

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

这显然更有意义。

于 2014-03-02T16:13:28.747 回答
3

通常有一组指令并不是真正以一般方式切换到内核模式,而是请求系统服务。因此这些切换到内核模式,但仅在调用由操作系统设置的某些功能的上下文中,以供用户代码调用。

在大多数现代系统中,即使这也被实现特定功能的 API 层隐藏,其中可能正在执行上述操作系统调用。

但总的来说,用户代码确实不能等同于说“从现在开始,我想在内核模式下运行”。

于 2013-09-27T18:27:36.630 回答
1

在用户空间中,您通过系统调用内核请求特权操作,内核在必要时执行切换到内核模式。用户正在使用 API,内核正在执行特权操作。

于 2013-09-27T18:26:26.430 回答