The*_*eer 5 linux scheduling interrupt linux-kernel
当定时器中断发生时,ISR 被调用来服务该中断。
是否可以假设每个计时器中断都以调用调度程序结束,下一个进程应该继续运行?
可以概括地说每个中断都必须以调度程序调用结束吗?
定时器 ISR 不schedule()直接调用。它最终会调用,update_process_times()以便调度程序进程的记帐信息是最新的。
返回用户空间时最终会调用调度程序。如果内核是抢占式的,那么从定时器中断返回到内核空间时也会调用它。
\n\n举个例子,假设进程 A 发出一个系统调用,该系统调用被设备生成的中断中断,然后又被定时器中断中断:
\n\n\n 进程 A 用户空间 \xe2\x86\x92 进程 A 内核空间 \xe2\x86\x92 设备 ISR \xe2\x86\x92 计时器 ISR\n 系统调用设备 IRQ 计时器 IRQ\n\n\n
当定时器ISR结束时,它返回到另一个ISR,然后该ISR返回到内核空间,然后内核空间返回到用户空间。抢占式内核会在每次返回时检查是否需要重新调度进程。非抢占式内核仅在返回用户空间时进行该检查。
\n\n在 ARM 领域,代码路径大致如下:
\n\n__irq_usr,而在 SVC 模式中接收到的 IRQ 将结束调用__irq_svc。在其他处理器模式下不应接收 IRQ。__irq_svc,处理完 IRQ 后,如果内核是抢占式的,且未禁用抢占,并且需要重新调度,则内核会跳转到svc_preempt,哪个调用preempt_schedule_irq,哪个调用schedule。否则,不会进行重新安排。__irq_usr\xe2\x86\x92 ret_to_user_from_irq) 或系统调用 ( vector_swi\xe2\x86\x92 ret_fast_syscall) 返回到用户空间。在那里,内核检查是否有工作要做,如果需要重新安排,schedule则调用。