linux 信号处理 内核态,Linux内核中的信号机制——信号处理

static int

setup_return(struct pt_regs *regs, struct k_sigaction *ka,

unsigned long __user *rc, void __user *frame, int usig)

{

unsigned long handler = (unsigned long)ka->sa.sa_handler;

unsigned long retcode;

int thumb = 0;

unsigned long cpsr = regs->ARM_cpsr & ~PSR_f;

/*

* Maybe we need to deliver a 32-bit signal to a 26-bit task.

*/

if (ka->sa.sa_flags & SA_THIRTYTWO)

cpsr = (cpsr & ~MODE_MASK) | USR_MODE;

#ifdef CONFIG_ARM_THUMB

if (elf_hwcap & HWCAP_THUMB) {

/*

* The LSB of the handler determines if we're going to

* be using THUMB or ARM mode for this signal handler.

*/

thumb = handler & 1;

if (thumb)

cpsr |= PSR_T_BIT;

else

cpsr &= ~PSR_T_BIT;

}

#endif

 //这里的retcode就是保存手工构造的sigreturn()代码

if (ka->sa.sa_flags & SA_RESTORER) {

retcode = (unsigned long)ka->sa.sa_restorer;

} else {

unsigned int idx = thumb;

if (ka->sa.sa_flags & SA_SIGINFO)

idx += 2;

if (__put_user(sigreturn_codes[idx], rc))

return 1;

if (cpsr & MODE32_BIT) {

/*

* 32-bit code can use the new high-page

* signal return code support.

*/

retcode = KERN_SIGRETURN_CODE + (idx << 2) + thumb;

} else {

/*

* Ensure that the instruction cache sees

* the return code written onto the stack.

*/

flush_icache_range((unsigned long)rc,

(unsigned long)(rc + 1));

retcode = ((unsigned long)rc) + thumb;

}

}

regs->ARM_r0 = usig;

regs->ARM_sp = (unsigned long)frame;//堆栈

regs->ARM_lr = retcode;//返回地址,当用户态信号处理函数结束时,就会把这个地址作为返回地址

regs->ARM_pc = handler;//信号处理函数

regs->ARM_cpsr = cpsr;

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值