如果阻塞IO,比如驱动程序读取,我们在某些条件下调用wait_event_interruptible()。满足条件时,将完成读取。 我查看了wait_event_interruptible()函数,它检查条件并调用schedule()。 schedule()将查找下一个可运行的进程,并执行上下文切换和其他进程。这是否意味着,当此进程再次被唤醒时,当前进程的下一条指令将在schedule()函数内?
如果是,如果多个进程自愿调用schedule,那么所有进程在被唤醒之后将有一个下一条指令执行一次就会在schedule()内完成?
在ret_from_interrupt的情况下,调用schedule()。什么时候会回来?因为在此之后执行了iret。
答案 0 :(得分:1)
我认为第一个问题的答案是yes
,因为这是实现上下文切换的一种相当典型的方式。例如That's how OS161 works。
如果从ISR调用调度程序,则一切都应该相同。调度程序应更改上下文并返回到ISR,然后ISR应使用IRET
返回。如果调度程序选择切换到另一个进程/线程,它将返回到另一个进程/线程,从而加载其上下文并保存旧上下文。
答案 1 :(得分:0)
重点2:执行iret
指令(从中断处理程序返回)并进入ret_from_interrupt
。然后Linux将控制权交给运行旁边的任务(schedule()
)。编写中断处理程序时最重要的考虑因素之一是,当它们正在执行时,许多其他活动被禁止(其他,较低优先级,中断是主要示例),因此您希望尽快离开那里。这就是为什么大多数中断处理程序只是在返回之前隐藏工作要完成的原因,然后说工作在其他地方处理(今天在一些特殊的内核线程中)。