最近对以前看过的linux kernel 之signal做了温习,觉得有必要记录下来。
如何理解signal 是对当前进程执行过程的中断?
signal对当前进程的中断是指对其user space执行过程的中断,这与signal被处理的时机密切相关。signal的处理是从do_signal()进入,其调用流程:ret_to_user()/ret_fast_syscall–>work_pending()–>do_notify_resume()–>do_signal()。
可以看到,当kernel返回user mode时会去check是否有signal需要处理: 如果TIF_NEED_RESCHED有被置位thread_info->flag,则表示需要进行进程调度,进入work_resched。之后会进入 do_notify_reume接口,判定是否需要进行signal处理,如果TIF_SIGPENDING有置位,后面会进入do_signal()流程。下面是work_pending的实现代码:
work_pending:
*tbnz x1, #TIF_NEED_RESCHED, work_resched
/* TIF_SIGPENDING, TIF_NOTIFY_RESUME or TIF_FOREIGN_FPSTATE case */
mov x0, sp // ‘regs’
enable_irq // enable interrupts for do_no