2

在阻塞 IO 的情况下,例如驱动程序读取,我们在某些条件下调用 wait_event_interruptible()。当条件满足时,将完成读取。我查看了 wait_event_interruptible() 函数,它检查条件并调用 schedule()。schedule() 将寻找下一个可运行的进程并进行上下文切换,其他进程将运行。这是否意味着当该进程再次被唤醒时,当前进程要执行的下一条指令将在 schedule() 函数中?

  1. 如果是,如果多个进程自愿调用schedule,那么所有进程在唤醒后都会有下一条指令执行一次,会在schedule()中吗?

  2. 在 ret_from_interrupt 的情况下,调用 schedule()。什么时候回来?因为 iret 在那之后被执行。

4

2 回答 2

1

我认为第一个问题的答案是yes因为这是实现上下文切换的一种相当典型的方式。例如,这就是 OS161 的工作原理

如果调度程序是从 ISR 调用的,那么一切都应该相同。调度程序应更改上下文并返回到 ISR,然后 ISR 应使用IRET. 如果调度程序选择切换到不同的进程/线程并因此加载其上下文并保存旧的,它将返回到不同的进程/线程。

于 2013-02-26T12:58:40.157 回答
0

关于第 2 点:执行iret指令(从中断处理程序返回)并让您进入ret_from_interrupt. 然后 Linux 将控制权交给下一个要运行的任务 ( schedule())。编写中断处理程序时最重要的考虑因素之一是,当它们执行时,许多其他活动被禁止(其他较低优先级的中断是主要示例),因此您希望尽快离开那里。这就是为什么大多数中断处理程序只是在返回之前隐藏要完成的工作,然后说工作在其他地方处理(今天在一些特殊的内核线程中)。

于 2013-02-26T20:14:59.823 回答