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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (278)

在我的操作系统类中,我被问到从用户切换到内核模式是否有特权。这不是特定于操作系统的。起初,我认为是的,但它似乎是一个巨大的捕获22.我提到我的教科书:

硬件允许特权指令仅在内核模式下执行。... 切换到内核模式的指令是特权指令的一个例子。 加涅,格雷格; Abraham Silberschatz; Peter B. Galvin(2010-01-26)。操作系统概念(第22页)。威利高等教育。Kindle版。

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

我在想这个系统不允许用户直接切换到内核模式,但是当用户试图执行另一个特权指令时,它由内核完成。那是对的吗?

提问于
用户回答回答于

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

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

用户回答回答于

在用户模式下,您不能切换到内核模式。用户和内核之间的交互是通过系统调用完成的。每个系统调用都提供一个定义的服务。用户发送服务名称(通常是一个数字)和所需的参数。这是一个真实世界的例子,它是如何完成的。它是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;
}

所以你不只是切换到内核,但你可以让内核为你做点事情。然后内核告诉你它是否完成。

所属标签

可能回答问题的人

  • 天使的炫翼

    17 粉丝531 提问7 回答
  • 最爱开车啦

    8 粉丝503 提问6 回答
  • 优惠活动秘书

    0 粉丝2 提问6 回答
  • Richel

    6 粉丝0 提问5 回答

扫码关注云+社区

领取腾讯云代金券