控制在什么情况下从用户空间传递到Linux内核空间?

时间:2015-07-23 14:46:17

标签: linux linux-kernel x86

我正在尝试了解哪些事件可能导致从用户空间到Linux内核的转换。如果它是相关的,则此问题的范围可以限于x86 / x86_64体系结构。

以下是我所知道的一些转换来源:

  • 系统调用(包括访问设备)导致从用户空间到内核空间的上下文切换。
  • 中断将导致上下文切换。据我所知,这还包括调度程序抢占,因为调度程序通常依赖于计时器中断来完成其工作。
  • 信号。似乎至少有些信号是使用中断实现的,但我不知道是否有一些信号以不同的方式实现,所以我将它们单独列出。

我在这里问两件事:

  1. 我是否遗漏了任何用户空间>内核路径?
  2. 这些上下文切换涉及哪些代码路径?

2 个答案:

答案 0 :(得分:4)

您遗失的一个:例外

(可以在故障,陷阱和中止中进一步细分)

例如页面错误,断点,除零或浮点异常。从技术上讲,可以将异常视为中断,但不是您在问题中定义中断的方式。

您可以在this osdev webpage找到x86例外列表。

关于你的第二个问题:

  

这些上下文中涉及的各种代码路径是什么   交换机?

这实际上取决于架构和操作系统,您需要更具体。对于x86,当发生中断时,您转到IDT条目,对于SYSENTER,您将转到MSR中指定的地址。之后发生的事情完全取决于操作系统。

答案 1 :(得分:1)

没有人写完整的答案,所以我会尝试将评论和部分答案纳入答案。随意评论或编辑答案以改进它。

出于这个问题和答案的目的,用户空间到内核转换意味着处理器状态的变化,允许访问内核代码和内存。简而言之,我将这些转换称为上下文切换。

在讨论可以触发用户空间到内核转换的事件时,使用上下文切换将我们习惯的OS构造(信号,系统调用,调度)与实现这些构造的方式分开是很重要的。

在x86中,上下文切换有两种主要方式:中断和SYSENTER。中断是处理器功能,在某些事件发生时会导致上下文切换:

  • 硬件设备可能会请求中断,例如,定时器/时钟可能会在经过一定时间后导致中断。按下键时键盘可能会中断。它也被称为硬件中断。
  • 用户空间可以启动中断。例如,在x86上的Linux中执行系统调用的旧方法是使用通过寄存器传递的参数来执行INT 0x80。调试断点也使用中断实现,调试器用INT 0x3替换指令。这种类型的中断称为软件中断。
  • CPU本身在某些情况下会产生中断,例如在没有权限的情况下访问内存时,当用户除以零时,或者当一个内核必须通知另一个内核需要执行某些操作时。这种类型的中断称为异常,您可以在@esm的答案中阅读更多相关内容。
  • 有关中断的更广泛讨论,请参阅此处:http://wiki.osdev.org/Interrupt

SYSENTER是一条指令,它提供了一个现代路径,可以针对执行系统调用的特定情况进行上下文切换。

SYSENTER中可以找到由于Linux中的中断或arch/x86/kernel/entry_{32|64}.S而处理上下文切换的代码。

在许多情况下,更高级别的Linux构造可能会导致上下文切换。以下是一些例子:

  • 如果系统调用得到int 0x80sysenter指令,则会发生上下文切换。某些系统调用例程可以使用用户空间信息来获取系统调用要获取的信息。在这种情况下,不会发生上下文切换。
  • 很多时候,调度不需要中断:线程将执行系统调用,并且系统调用的返回将被延迟,直到再次调度为止。对于未执行系统调用的部分中的进程,Linux依赖于计时器中断来获得控制权。
  • 对已分页的内存位置的虚拟内存访问将导致分段错误,从而导致上下文切换。
  • 信号通常在流程已经“切换”时发送。 (请参阅@caf关于该问题的评论),但有时会使用处理器间中断在两个正在运行的进程之间传递信号。