正如我所理解的,每个操作系统都需要有一些机制来定期检查是否应该运行一些任务并挂起其他任务。
一种方法是某种计时器,在计时器到期时,操作系统将检查是否应该运行/挂起某些任务。
一般来说,比如说在ARM系统上,它可能是某种ISR。
我真正的问题是,我只能想象这一点,而不能在某个地方看到它。有人能指出一些免费/开放的RTOS代码吗?在那里我可以真正看到处理抢占/调度的代码?
freertos.org。整个操作系统都是开源的,就在那里供您查看。还有几十个不同的端口可以进行比较和对比。对于上下文切换代码,您需要在ports目录中,在许多名为port.c、port.asm等的文件中的任何一个中查找。是的,在freertos的情况下,所有上下文切换都是在中断(滴答计时器ISR或任何其他SysCall中断)中执行的。
上下文切换在很大程度上是特定于处理器的,因为要保存的寄存器列表和保存它们的汇编代码在处理器系列之间有所不同,有时在给定的系列中也有所不同。因此,每个端口都有一个用于此代码的单独文件。
另一方面,调度(选择下一个要运行的任务)是在一个名为tasks.c的文件中完成的,该文件对所有端口都是通用的,并引用特定于端口的代码。
RTOS只是周期性地切换上下文,这就是大多数GPOS的工作方式。在RTOS中,调度器在任何调度事件上运行。其中包括系统tick,但也包括消息发布、事件触发器、信号量给定或互斥锁解锁。
在ARM Cortex-M上,CMSIS 3.x包括RTOS API(主要用于RTOS开发人员,而不是完整的RTOS本身),其来源将包括上下文切换机制。
如果你想对一个简单的RTOS进行详细描述,你可以考虑阅读µC/OS-II:实时内核或稍微复杂一点的µC/OSIII:实时内核。
FreeRTOS越来越受欢迎,尽管在架构上可能有点非传统。eCos是一个更完整的(因为它不仅仅是一个调度内核,而是一个更完善的操作系统)和非常强大的选项。
您可以查看xv6。
它不是一个RTOS,它只是一个用于学术目的的骨架操作系统(基于V6.unix)
在XV6的书中,请看第4章,其中有关于如何在像XV6这样的小型操作系统上进行调度的解释和代码。XV6在等待磁盘或某些I/O操作时使进程进入睡眠状态,还有每隔100毫秒中断一次的定时器来切换进程
还用代码解释了上下文切换是如何发生的,保存了什么信息(进程的上下文框架),以及在调度程序必须运行时如何从用户模式切换到内核模式
最棒的是,理解这些概念所需的阅读量与操作系统上的一些参考书不同:)代码相对较小,您实际上可以在qemu上运行XV6,在sched、swtch和其他函数中设置断点,并实际查看上下文切换期间保存的信息。(如何在此链接中运行xv6)
你不必阅读前几章就能理解第四章。没有太多的依赖性,xv6使用struct proc来识别进程,可用于系统中所有当前运行的进程,proc->conext-指的是进程所处的状态(寄存器值等),这由调度器保存。干杯:)