对于临界代码,关键不能再关键的代码,为了保护,有两个措施:
关本地中断 local_irq_disable()
关调度 preempt_disable()
这两个一关,谁也别想打扰俺们运行这段代码!
local_irq_disable()在单CPU就是cli指令,不理会一切硬件中断(包括时钟中断)
而preempt_disable的实现,就是在系统调用或者其他从内核态回到用户态时,检测一下preempt_count变量是否设置了值,如果有值,那么即使置位了schedueled标志,也不会执行preempt_schedule_irq->schedule函数了,也就不会调度了,进程也就不切换了。
同样,在do_softirq(执行软中断的函数)里,要判断是否in_interrupt(),其实,还是看preempt_count这个变量,必须为0,就是允许调度,才会继续执行软中断函数,因为软中断处理函数不想耽误其他进程的事,同样,在处理软中断的时候,还会local_irq_enable,开中断。
阅读(1158) | 评论(0) | 转发(0) |