首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从用户模式切换到内核模式

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

Stack Overflow用户
提问于 2013-09-28 02:17:19
回答 4查看 22.4K关注 0票数 18

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

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

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

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

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-03-03 00:13:29

这是在第8版中引入的一个打字错误,并保留在第9版中。在第七版的第19页上,它写道:

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

这显然更有意义。

票数 7
EN

Stack Overflow用户

发布于 2013-09-29 21:50:53

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

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

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

票数 32
EN

Stack Overflow用户

发布于 2013-09-28 02:27:37

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

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

但一般来说,用户代码不能做等同于说“从现在开始,我想在内核模式下运行”的事情。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19057503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档