我正在尝试了解哪些事件可能导致从用户空间到Linux内核的转换。如果它是相关的,则此问题的范围可以限于x86 / x86_64体系结构。
以下是我所知道的一些转换来源:
我在这里问两件事:
答案 0 :(得分:4)
您遗失的一个:例外
(可以在故障,陷阱和中止中进一步细分)
例如页面错误,断点,除零或浮点异常。从技术上讲,可以将异常视为中断,但不是您在问题中定义中断的方式。
您可以在this osdev webpage找到x86例外列表。
关于你的第二个问题:
这些上下文中涉及的各种代码路径是什么 交换机?
这实际上取决于架构和操作系统,您需要更具体。对于x86,当发生中断时,您转到IDT条目,对于SYSENTER
,您将转到MSR中指定的地址。之后发生的事情完全取决于操作系统。
答案 1 :(得分:1)
没有人写完整的答案,所以我会尝试将评论和部分答案纳入答案。随意评论或编辑答案以改进它。
出于这个问题和答案的目的,用户空间到内核转换意味着处理器状态的变化,允许访问内核代码和内存。简而言之,我将这些转换称为上下文切换。
在讨论可以触发用户空间到内核转换的事件时,使用上下文切换将我们习惯的OS构造(信号,系统调用,调度)与实现这些构造的方式分开是很重要的。
在x86中,上下文切换有两种主要方式:中断和SYSENTER
。中断是处理器功能,在某些事件发生时会导致上下文切换:
INT 0x80
。调试断点也使用中断实现,调试器用INT 0x3
替换指令。这种类型的中断称为软件中断。 SYSENTER
是一条指令,它提供了一个现代路径,可以针对执行系统调用的特定情况进行上下文切换。
在SYSENTER
中可以找到由于Linux中的中断或arch/x86/kernel/entry_{32|64}.S
而处理上下文切换的代码。
在许多情况下,更高级别的Linux构造可能会导致上下文切换。以下是一些例子:
int 0x80
或sysenter
指令,则会发生上下文切换。某些系统调用例程可以使用用户空间信息来获取系统调用要获取的信息。在这种情况下,不会发生上下文切换。