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

标签 linux linux-kernel x86

我试图了解哪些事件会导致从用户空间到 Linux 内核的转换。如果相关,这个问题的范围可以限制在 x86/x86_64 架构上。

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

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

我在这里问两件事:

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

最佳答案

你错过了一个:异常(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/

相关文章:

c - 如何修改内核DTB文件

linux - 连续使用kmap_atomic()和kunmap_atomic()

linux从内核中的pid获取进程名称

assembly - 工作 FAT16 引导加载程序在实际硬件上生成读取错误?

c++ - 混合 C 和汇编文件

c - C 中未声明的标识符

java - 更新选项中抛出错误

linux - 查看 namespace 解析器函数的源代码 linux fedora

Linux (ubuntu) - sed,仅删除文件中的模式匹配

c++ - 哪些C/C++编译器可以使用推式弹出指令创建局部变量,而不仅仅是增加esp一次?