我试图了解哪些事件会导致从用户空间到 Linux 内核的转换。如果相关,这个问题的范围可以限制在 x86/x86_64 架构上。
以下是我所知道的一些转换来源:
- 系统调用(包括访问设备)导致从用户空间到内核空间的上下文切换。
- 中断会导致上下文切换。据我所知,这还包括调度程序抢占,因为调度程序通常依赖定时器中断来完成其工作。
- 信号。似乎至少有一些信号是使用中断实现的,但我不知道是否有些信号的实现方式不同,所以我将它们分开列出。
我在这里问两件事:
- 我是否遗漏了任何用户空间->内核路径?
- 这些上下文切换涉及哪些不同的代码路径?
最佳答案
你错过了一个:异常(exception)
(可以进一步分解为故障、陷阱和中止)
例如页面错误、断点、被零除或浮点异常。从技术上讲,可以将异常视为中断,但实际上并不是您在问题中定义中断的方式。
您可以在 this osdev webpage 找到 x86 异常列表.
关于你的第二个问题:
What are the various code paths that are involved in these context switches?
这实际上取决于体系结构和操作系统,您需要更具体一些。对于 x86,当发生中断时,您将转到 IDT 条目,对于 SYSENTER
,您将转到 MSR 中指定的地址。之后会发生什么完全取决于操作系统。
关于linux - 在什么情况下控制权从用户空间传递到 Linux 内核空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31590769/