下面具体看看sys_sigreturn()的定义:
asmlinkage int sys_sigreturn(struct pt_regs *regs) /* Always make any pending restarted system calls return -EINTR */ /* frame = (struct sigframe __user *)regs->ARM_sp; if (!access_ok(VERIFY_READ, frame, sizeof (*frame))) sigdelsetmask(&set, ~_BLOCKABLE); if (restore_sigcontext(regs, &frame->sc, &frame->aux)) /* Send SIGTRAP if we're single-stepping */ return regs->ARM_r0; badframe: |
这个函数主要调用restore_sigcontext()根据用户态态堆栈上的sigframe备份还原pt_regs。
static int __get_user_error(regs->ARM_r0, &sc->arm_r0, err); err |= !valid_user_regs(regs); #ifdef CONFIG_IWMMXT return err; |
restore_sigcontext()很简单,当它返回后,通过sys_sigreturn()在内核态堆栈建立的pt_regs已经变为调用信号处理函数之前的pt_regs。这样,sys_sigreturn()返回用户态时,就顺利地过渡到处理之前的状态了。
相关链接: