收到信号后如何跳转到内核?

问题描述 投票:0回答:1

如果我使用Linux系统调用“signal”覆盖用户代码段中的信号处理程序,那么当进程接收到信号时,信号处理程序在用户模式下运行。信号处理程序执行完成后,如何返回内核模式?当信号处理程序的return语句执行完毕,当前cs:rip指向用户栈顶时,我们如何跳回内核呢? enter image description here

我目前正在学习有关 Linux 异常控制流的课程,并且在与信号处理程序相关的部分中面临挑战。

linux linux-kernel signals
1个回答
0
投票

一般来说,信号处理程序是通过库代码安装的(例如

signal()
sigaction()
),因此从信号处理程序返回的操作是由库透明处理的。

要从信号返回,需要使用

sigreturn
rt_signreturn
系统调用,因此当信号处理函数返回时,它会返回到由名为“signal Tampoline”的库设置的特殊存根,用于执行这两个系统调用之一.

手册页对此进行了很好的描述:

如果 Linux 内核确定未阻塞的信号正在等待 进程,然后在该进程中下一次转换回用户模式时 (例如,从系统调用返回或重新安排进程时 到 CPU),它在用户空间堆栈上创建一个新帧 保存进程上下文的各个部分(处理器状态字, 寄存器、信号掩码和信号堆栈设置)。

内核还安排,在转换回用户模式期间, 调用信号处理程序,并且从处理程序返回后, 控制权传递给一段通常称为“信号”的用户空间代码 蹦床”。信号蹦床代码依次调用

sigreturn()

这个

sigreturn()
调用会撤消所做的一切 - 更改 进程的信号掩码,切换信号堆栈(参见
sigaltstack(2)
)—in 命令调用信号处理程序。使用当时的信息 之前保存在用户空间堆栈上
sigreturn()
恢复进程的 信号掩码、切换堆栈并恢复进程的上下文 (处理器标志和寄存器,包括堆栈指针和 指令指针),以便进程在该点恢复执行 被信号中断的地方。

© www.soinside.com 2019 - 2024. All rights reserved.