中断上下文
参考博客:(https://blog.csdn.net/AndroidBBC/article/details/81911065)
中断上半部分,中断触发;中断下半部分,中断执行。
中断执行一般有tasklet、工作队列实现
工作队列机制
工作队列所执行的中断代码会表现出进程的一些特性,最典型的就是可以重新调度甚至睡眠。内核在执行中断的剩余工作时就处在**进程上下文(process context)**中。
tasklet机制
内核在执行时处于中断上下文(interrupt context)中。而中断上下文与进程毫无瓜葛,所以在中断上下文中就不能睡眠。因此,选择tasklet还是工作队列来完成下半部分应该不难选择。当推后的那部分中断程序需要睡眠时,工作队列毫无疑问是你的最佳选择;否则,还是用tasklet吧。
进程上下文
一般的进程运行在用户态,如果这个进程进行了系统调用,那么此时用户空间中的程序就进入了内核空间,并且称内核代表该进程运行于内核空间中。由于用户空间和内核空间具有不同的地址映射,并且用户空间的进程要传递很多变量、参数给内核,内核也要保存用户进程的一些寄存器、变量等,以便系统调用结束后回到用户空间继续执行。这样就产生了进程上下文。
区别
所谓的进程上下文,就是一个进程在执行的时候,CPU的所有寄存器中的值、进程的状态以及堆栈中的内容。当内核需要切换到另一个进程时(上下文切换),它需要保存当前进程的所有状态,即保存当前进程的进程上下文,以便再次执行该进程时,能够恢复切换时的状态继续执行
对于中断而言,是硬件通过触发信号,导致内核调用中断处理程序,进入内核空间。这个过程中,硬件的一些变量和参数也要传递给内核,内核通过这些参数进行中断处理,中断上下文就可以理解为硬件传递过来的这些参数和内核需要保存的一些环境,主要是被中断的进程的环境。因此处于中断上下文的tasklet不会有睡眠这样的特性。
在Linux kenel的实现中,要保护共享数据:如果只有进程上下文的访问,那么可以考虑使用semaphore或者mutex的锁机制,如果有spinlock,那些可以导致睡眠的lock就不能使用了,这时候,可以考虑使用spin lock。
中断上下文要用锁,首选 spinlock,他是不会导致睡眠的锁
spinlock解析