中断轮询是如何进行上下文切换的?

How does interrupt polling perform context switching?

考虑一个不支持硬件中断的非常古老的单核CPU,假设我想编写一个多任务操作系统。使用硬件定时器,可以轮询 IRQ 线以确定定时器是否已超时,如果已超时则切换 threads/processes.

但是,为了能够进行轮询,内核必须得到 CPU 的执行关注。对于支持硬件中断的 CPU,中断时会调用 ISR,并且(如果我错了请纠正我)如果中断是由上下文切换定时器引起的,则相应的 ISR 会调用处理上下文的内核代码切换。

如果 CPU 不支持硬件中断(再次强调,如果我错了请纠正我),那么内核必须反复检查中断并在内核中调用适当的 ISR space.

但是,如果用户线程当前正在这个假设的处理器上执行,线程必须手动将执行让给内核以便它能够检查上下文是否-切换是根据定时器通过适当的 IRQ 线进行的。这可以通过调用适当的内核函数来完成。

有没有办法在只支持软件中断的单核处理器上实现非协作多线程?我的想法是否正确,还是我遗漏了什么?

嗯,您通常是正确的,内核在获得 CPU 的控制权之前不能进行多任务处理。这是通过中断或用户代码进行系统调用时发生的。

定时器中断尤其用于抢占式时间分片。我认为很难找到不支持定时器中断的整个 CPU,您不必使用穿孔卡或开关进行编程。中断比多核或虚拟内存或 DMA 或任何奇特的事物都要古老得多。

一些 SoC 的实时 sub-components 有这种限制(比如 Beaglebone),如果你在 FPGA 或其他东西中编写一个小的 CPU,它可能会出现。

没有中断,就得等待系统调用,基本上就变成了协同多任务。