操作系统如何处理上下文切换?

6
我理解每个操作系统都需要一些机制来定期检查是否应该运行某些任务并挂起其他任务。其中一种方法是设置某种计时器,当计时器到期时,操作系统将检查是否应该运行/挂起某些任务。
通常,在ARM系统上,这可能是某种中断服务例程(ISR)。
我的真正问题是,我只能想象这一点,但没有在任何地方看到过。有人可以指向一些免费/开源RTOS代码,我可以实际看到处理抢占/调度的代码吗?
3个回答

4

freertos.org整个操作系统都是开源的,您可以随时查看。此外,还有几十种不同的端口可供比较和对比。如果要查看上下文切换代码,则需要查看端口目录中的任何一个名为port.c、port.asm等的文件。而且,在freertos中,所有的上下文切换都是在中断中执行的(tick timer ISR或任何其他SysCall中断)。

上下文切换非常依赖于处理器,因为要保存的寄存器列表和用于保存它们的汇编代码在处理器家族之间以及有时在同一处理器家族内部有所不同。因此,每个端口都有一个单独的文件来处理这段代码。

另一方面,调度(选择下一个要运行的任务)在一个名为tasks.c的文件中完成,该文件是所有端口共用的,并引用了特定于端口的代码。


3
在实时操作系统中,调度程序会在任何调度事件上运行,而不仅仅是像大多数通用操作系统那样定期进行上下文切换。这些事件包括系统滴答、消息发布、事件触发、信号量释放或互斥锁解锁等。在ARM Cortex-M上,CMSIS 3.x包含一个RTOS API(主要供RTOS开发人员使用,而不是完整的RTOS本身),其源代码将包含上下文切换机制。如果您想了解简单RTOS的详细说明,可以考虑阅读µC/OS-II: The Real-Time Kernel或稍微复杂一些的µC/OS-III: The Real-Time Kernel

FreeRTOS 越来越受欢迎,尽管其架构可能有些不传统。更完整(因为它不仅是一个调度内核,而是一个更完整的操作系统)且非常强大的选择是eCos


1
你可以看一下xv6
它不是一个RTOS,只是一个基于V6 Unix的骨架操作系统,用于学术目的。
在XV6 book中,看一下第4章,其中有关于如何在像xv6这样的小型操作系统上进行调度的代码和解释。当进程等待磁盘或某些I/O操作时,XV6会将其置于睡眠状态,并且每100毫秒会有定时器中断来切换进程。
还有关于上下文切换的代码和解释,包括保存进程的上下文帧所需的信息,以及当调度程序必须运行时如何从用户模式切换到内核模式。
最好的部分是,为了理解这些概念,你需要阅读的内容非常少,不像一些操作系统参考书籍 :) 代码相对较小,实际上你可以在qemu上运行XV6,在sched、swtch和其他函数中设置断点,实际上查看上下文切换期间保存的信息。(如何在link中运行xv6)
你不必阅读前面的章节就能理解第4章。没有太多的依赖性,xv6使用struct proc来标识进程,ptable用于存储系统中所有当前正在运行的进程,proc->context-指的是进程所处的状态(寄存器值等),这由调度程序保存。 干杯 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接