CPU从用户模式切换到内核模式:它到底有什么作用?它是如何实现这一转变的?

StackOverflow https://stackoverflow.com/questions/2479118

中央处理器 从用户模式切换到内核模式:它到底有什么作用?它是如何实现这一转变的?

编辑:

即使它依赖于架构,也请给我一个答案。架构由您决定。告诉我你所知道的架构。

我想了解其中涉及的所有事情。

有帮助吗?

解决方案

笔记:这主要与 x86 架构相关。这是一个稍微简化的解释。

这种转变通常是由以下原因之一引起的:

  • 故障(例如执行指令引起的页面错误或其他异常)
  • 中断(例如键盘中断或 I/O 完成)
  • 陷阱(例如系统调用)

通常发生的情况是系统检查中断描述符表(IDT)。每个异常(中断、故障等)都有一个与之关联的编号,用于索引该表。

从该表中,CPU 可以确定要运行的中断处理程序。

作为过渡的一部分,以下更改(通常)会生效:

  • 切换到内核堆栈
  • EFLAGS 已保存
  • 代码段选择器和EIP被保存。
  • 保存堆栈段选择器和堆栈指针
  • 开始执行中断处理程序
  • 保存通用寄存器(处理程序的工作)
  • 段选择器更改为内核选择器(处理程序的工作)

您现在处于内核模式。

希望有帮助:)

其他提示

这是依赖于系统的,但通常的机构是一些用户态操作导致软件中断。这使得中断处理器切换模式,并跳入内核代码,然后检查什么程序正在试图做的(系统调用?),然后做请求的操作并跳转回给用户模式代码。除了软件中断可能会导致过渡以及其他机制;例如在一个抢先多任务系统中,定时器中断可能会触发调度来运行。

我理解的是任何其程序段寄存器有两个LSB为零将在内核模式下运行,而任何程序,其段寄存器有两个LSB = 1将在用户模式下运行。事实上,该段rgeisters的两个LSB定义特权级别(0最高至3最低)

因此,为了在内核模式下运行prgram您必须设置段寄存器是0010十六进制(我相信)。我不知道如何在不覆盖别的内存空间放置一个程序 - 换句话说,如何链接器确保? 另外,如果你想调用从用户模式代码的内核模式的代码,你必须弄清楚如何传递参数 - 他们没有使用相同的内存soace,所以无法通过内存引用传递数据。我想你必须把它在寄存器中传递。

如果anynody可以在上述填补空白,我将不胜感激。

在Windows中,当你做一个系统调用,库调用程序驻留在操作系统地址空间中的内核入口点。它反过来通过执行一个指令特定用于此目的的占用CPU进入管理程序模式,如 SYSENTER 。它的作用主要是在设置标志位寄存器。这使得OS使用特权指令。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top