Linux 内核信号处理栈帧设置与上下文复制详解
1. 信号处理栈帧设置基础操作
在信号处理流程中,内核需要对栈帧进行一系列设置,以确保信号处理程序能够正确执行。首先,会将0x 80 cd复制到retcode[]的最后两个字节。由于 i386 是小端字节序,实际存储为0x cd 80,即INT 80,用于执行sigreturn()操作。若在这些写入操作中任何一个失败,会强制对进程发送SIGSEGV信号。
接下来,内核会修改保存的用户模式寄存器副本,使得程序在返回用户模式时运行信号处理程序,而非从原位置继续执行。具体操作包括:
- 将内核栈上的ESP寄存器副本指向用户空间新设置的栈帧起始位置(即pretcode字段),这将作为信号处理程序结束时弹出的返回地址,进而指向retcode[]中的存根。
-IP寄存器副本指向用户定义的信号处理程序,因此用户模式下执行的第一条指令将是处理程序的起始位置。
同时,内存管理代码会为段寄存器设置默认值,以防进入内核后这些寄存器的值被改变。具体设置如下:
| 寄存器 | 设置操作 |
| ---- | ---- |
|xds、xes、xss| 加载用户数据段的选择器