【问题标题】:x86 how does Linux signal interrupt instruction streamx86 Linux 如何发信号中断指令流
【发布时间】:2020-05-29 05:38:55
【问题描述】:

Linux 信号如何导致 X86 处理器的指令流中断?那么使用什么 CPU 工具呢?

您有同步和异步中断。

同步中断适用于页面错误、异常等问题。由在 CPU 上执行的指令引起的问题。

异步中断来自 LAPIC 的 IPI、定时器中断或由 I/O-APIC 拾取并路由到正确的 LAPIC,然后中断处理器。所以这些都是外部事件。

但是 Signal 使用哪种 X86 机制来中断指令流并开始处理信号处理程序。

它不是异步中断 AFAIK,因为中断是在内核中处理的,而信号是在用户空间中处理的。但它的行为与异步中断非常相似。

【问题讨论】:

  • 有趣的问题。我想知道为什么它收集了一个downvote:(

标签: linux x86 operating-system signals


【解决方案1】:

内核必须向用户空间传递信号。您说得对,这不仅仅发生在硬件中。这就是为什么信号处理可以尊重用户空间红区sigaltstack,以及如果没有注册处理程序的默认操作。

一旦内核获得控制权,它就可以将信号传递到用户空间(或执行忽略它或终止进程的默认操作)。

如果信号是由运行在另一个内核上的进程发送到运行在 this 内核上的进程,那么它可能是从 IPI 处理程序传递到用户空间的,或者只是在下一个定时器中断或系统调用,让内核有机会检查挂起的信号。

当 IPI 中断处理程序准备返回用户空间时,它注意到它即将返回的进程有一个挂起的中断。 (对于一种 IPI 的特殊情况,或者通过运行调度程序,因为我们无论如何都在内核中)。 内核可以使用iret 代替iret 到用户空间信号处理程序的地址。

使用 IPI(如果 Linux 甚至这样做的话)的全部意义在于更快地将控制权转移到内核,而不是等待它在下次调用 schedule() 时注意到待处理信号。


如果信号发送到的进程当前没有在任何内核上运行,那么它要么在有空闲 CPU 时唤醒进程,要么信号就在那里等待该任务,直到某个内核上的调度程序决定在这个核心上运行它。届时,它会注意到并传递待处理的信号。

【讨论】:

  • 让进程意识到发生了事件并不是问题。我的问题是什么触发指令流被中断以便信号处理程序代码可以执行。
  • @pveentjer:您已经在问题中描述了 IPI。当内核在 CPL=3 中执行时到达的 IPI 将在其 IPI 处理程序入口点将控制转移到内核,就像任何其他中断一样。一旦内核获得控制权,显然它可以为所欲为,包括iret 到用户空间信号处理程序地址处的用户空间。
  • 但是中断总是在内核空间中处理。用户空间中的信号。有些东西无法计算(可能是我的理解)。
  • @pveentjer:我已经编辑了我的最后一条评论,请看最后一句话。
  • 好的。这就是诀窍。它从内核空间中的中断开始,然后切换到用户空间来处理信号处理程序。我认为这是用信号阻止的。这就是为什么我无法放置它。
猜你喜欢
  • 1970-01-01
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-27
  • 1970-01-01
相关资源
最近更新 更多