信号、中断和上下文
中断和信号的区别:
①、中断有优先级,但信号没有优先级(进程切换一定发生在中断/异常/系统调用处理过程中);
②、信号处理程序是在用户态下执行的,中断处理程序是在内核态下执行的。
③、中断响应是及时的,信号响应一般有延时。
中断上下文和进程上下文:
处理器总是处于一种状态:
①、内核态:运行进程上下文,处理器代表进程运行内核空间。
②、内核态:运行中断上下午,处理器代表硬件运行内核空间。
③、用户态:运行进程上下文,处理器代表进程运行用户空间。
1.进程上下文:
①、进程上文:其是指进程由用户态切换到内核态是需要保存用户态时cpu寄存器中的值,进程状态以及堆栈上的内容,即保存当前进程的进程上下文,以便再次执行该进程时,能够恢复切换时的状态,继续执行。
②、进程下文:其是指切换到内核态后执行的程序,即进程运行在内核空间的部分。
更进一步,把进程的上下文分为三个类别:
- 用户级上下文:正文、数据、用户堆栈以及共享存储区;
- 寄存器上下文:通用寄存器、程序寄存器(IP)、处理器状态寄存器(EFLAGS)、栈指针(ESP);
- 系统级上下文:进程控制块(task_struct)、内存管理信息(mm_struct、vm_area_struct、pgd、pte)、内核栈;
其中针对切换场景来说,三个类别的切换如下:
- 进程上下文切换:以上上下文全部切换,依赖于系统调用返回、中断返回或者主动调佣sleep、schedule和yield;
- 线程上下文切换:主要是寄存器上下文和系统级上下文,依赖于系统调用返回、中断返回或者主动调佣sleep、schedule和yield;
- 系统调用过程:主要是模式切换,主要是寄存器上下文;
- 中断上下文切换:也主要是寄存器上下文;
2.中断上下文:
①、中断上文:硬件通过中断触发信号,导致内核调用中断处理程序,进入内核空间。这个过程中,硬件的一些变量和参数也要传递给内核,内核通过这些参数进行中断处理。中断上文可以看作就是硬件传递过来的这些参数和内核需要保存的一些其他环境(主要是当前被中断的进程环境)。
中断时,内核不代表任何进程,只访问内核空间而且一般不会阻塞,
②、中断下文:执行在内核空间的中断服务程序,arm的中断栈和内核栈同一个。