从用户态切换到内核态

问题描述 投票:0回答:5

在我的操作系统课程中,我被问到从用户模式切换到内核模式是否有特权。这不是特定于操作系统的。一开始我以为是的,但这似乎是一个很大的第22条军规。我参考了我的课本:

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

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

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

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

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

operating-system kernel
5个回答
33
投票

在用户模式下你不能直接切换到内核模式。用户和内核之间的交互是通过系统调用完成的。每个系统调用都提供一项定义的服务。用户发送服务名称(通常是数字)和所需的参数。 这是一个如何完成此操作的真实示例。它是 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 是阅读更多相关内容的好地方。

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


7
投票

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

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

这显然更有意义。


3
投票

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

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

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


1
投票

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


0
投票

我一直发现作者对这个问题的回答令人困惑,并且不会在操作系统考试中提出这样的问题(但对于讨论问题来说这很好)。在过去的 IBM 360/370 大型机上,PSW(程序状态字)包括指向下一条指令(也称为 PC)的指针、模式位(priv = 1)和其他状态寄存器。当前的 PSW 在硬件寄存器中。有一条加载 PSW (LPSW) 指令用于将新的 PSW 加载到该寄存器中,该指令具有特权,因为它可以更改模式位等。中断是一种硬件机制,它保存当前的 PSW(通常在用户模式下 = 0)并加载在特权模式下运行中断处理程序所需的 PSW。因此,这是硬件引起的切换,而不是通过执行 LPSW 指令。处理程序本身将执行 LPSW 以加载已保存的用户 PSW 之一。因此,第 22 条军规问题得到了解答,因为硬件机制使我们进入了特权模式,此后可以运行特权 LPSW 指令以稍后返回用户模式。后来为微型计算机和微型计算机(即今天的工作站和 PC)发明的处理器操作系统使用不同的切换机制。在我所知的所有操作系统机制中,用户可以通过发出任何系统调用来间接进入特权模式,但这是将控制权交回给处于特权模式(也称为主管或内核模式)的操作系统的自愿方式)。简而言之,应该允许用户直接更改模式位,因为这是操作系统管理的另一个硬件资源,而不是用户。

© www.soinside.com 2019 - 2024. All rights reserved.