在 http://blog.youkuaiyun.com/r21nn/article/details/64128764 中记录了对signal()函数和sigaction()函数的分析,这里分析用户程序进行系统调用(int 0x80)时中断处理程序对信号的处理。在进程每次调用系统调用时,若该进程已收到信号,则该函数就会把信号的处理句柄(即对应的信号处理函数)插入到用户程序堆栈中。这样,在当前系统调用结束返回后就会立刻执行信号句柄程序,然后再继续执行用户的程序,如下图所示
在用户程序调用系统调用刚进入内核时,该进程的内核态堆栈上会由CPU 自动压入如图5-8 中所示的内容,也即:用户程序的SS 和ESP 以及用户程序中下一条指令的执行点位置CS 和EIP。
在处理完此次指定的系统调用功能并准备调用do_signal()时,内核态堆栈中的内容见图5-9 中左边所示。因此do_signal()的参数即是这些在内核态堆栈上的内容。

本文详细分析了do_signal()函数如何在用户程序调用系统调用并收到信号时,将信号处理句柄插入用户堆栈,确保在系统调用结束后执行信号处理程序。涉及信号处理流程、内核态堆栈内容以及信号处理后的恢复过程,揭示了do_signal()在处理信号和系统调用交互中的关键作用。
最低0.47元/天 解锁文章
267

被折叠的 条评论
为什么被折叠?



