由于linux中信号的处理时机在内核态返回用户态时,所以本文首先讲一下用户态与内核态的切换。
首先,我们来看用户态到内核态的切换。用户态切换到内核态有两种途径,第一种是中断,这个是被动的。第二种是系统调用,这个是主动的。
1、中断
对于一个正在运行的task来说,其运行在用户态时,内核栈是空的。中断到来时,会将当时的寄存器(用户态寄存器)信息按照pt_regs的结构压入到内核栈中。这样,内核栈的栈底就有一个pt_regs的结构,如下图所示。
由于linux中信号的处理时机在内核态返回用户态时,所以本文首先讲一下用户态与内核态的切换。
首先,我们来看用户态到内核态的切换。用户态切换到内核态有两种途径,第一种是中断,这个是被动的。第二种是系统调用,这个是主动的。
1、中断
对于一个正在运行的task来说,其运行在用户态时,内核栈是空的。中断到来时,会将当时的寄存器(用户态寄存器)信息按照pt_regs的结构压入到内核栈中。这样,内核栈的栈底就有一个pt_regs的结构,如下图所示。