linux内核中的信号机制--信号处理
linux内核中的信号机制--信号处理
Kernel version:2.6.14
CPU architecture:ARM920T
Author:ce123(http://blog.csdn.net/ce123)
当进程被调度时,会调用do_notify_resume()来处理信号队列中的信号。信号处理主要就是调用sighand_struct结构中对应的信号处理函数。do_notify_resume()(arch/arm/kernel/signal.c)函数的定义如下:
static intrestore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, struct aux_sigframe __user *aux){int err = 0;__get_user_error(regs->ARM_r0, &sc->arm_r0, err);__get_user_error(regs->ARM_r1, &sc->arm_r1, err);__get_user_error(regs->ARM_r2, &sc->arm_r2, err);__get_user_error(regs->ARM_r3, &sc->arm_r3, err);__get_user_error(regs->ARM_r4, &sc->arm_r4, err);__get_user_error(regs->ARM_r5, &sc->arm_r5, err);__get_user_error(regs->ARM_r6, &sc->arm_r6, err);__get_user_error(regs->ARM_r7, &sc->arm_r7, err);__get_user_error(regs->ARM_r8, &sc->arm_r8, err);__get_user_error(regs->ARM_r9, &sc->arm_r9, err);__get_user_error(regs->ARM_r10, &sc->arm_r10, err);__get_user_error(regs->ARM_fp, &sc->arm_fp, err);__get_user_error(regs->ARM_ip, &sc->arm_ip, err);__get_user_error(regs->ARM_sp, &sc->arm_sp, err);__get_user_error(regs->ARM_lr, &sc->arm_lr, err);__get_user_error(regs->ARM_pc, &sc->arm_pc, err);__get_user_error(regs->ARM_cpsr, &sc->arm_cpsr, err);err |= !valid_user_regs(regs);#ifdef CONFIG_IWMMXTif (err == 0 && test_thread_flag(TIF_USING_IWMMXT))err |= restore_iwmmxt_context(&aux->iwmmxt);#endif#ifdef CONFIG_VFP//if (err == 0)//err |= vfp_restore_state(&aux->vfp);#endifreturn err;}restore_sigcontext()很简单,当它返回后,通过sys_sigreturn()在内核态堆栈建立的pt_regs已经变为调用信号处理函数之前的pt_regs。这样,sys_sigreturn()返回用户态时,就顺利地过渡到处理之前的状态了。