6

据我所知,每个操作系统都需要有一些机制来定期检查它是否应该运行某些任务并暂停其他任务。

一种方法是某种计时器,操作系统将在其到期时检查它是否应该运行/暂停某些任务。

一般来说,比如说在可能是某种 ISR 的 ARM 系统上。

我真正的问题是,我只能将其可视化,而在某处看不到它。有人可以指出一些免费/开放的 RTOS 代码,我实际上可以在其中看到处理抢占/调度的代码吗?

4

3 回答 3

4

freertos.org。整个操作系统都是开源的,就在那里供您查看。并且有几十个不同的端口可以比较和对比。对于上下文切换代码,您需要查看 ports 目录,在称为 port.c、port.asm 等的许多文件中的任何一个文件中。是的,在 freertos 的情况下,所有上下文切换都是在中断中执行的(a滴答计时器 ISR 或任何其他 SysCall 中断)。

上下文切换是非常特定于处理器的,因为要保存的寄存器列表和保存它们的汇编代码在处理器系列之间有所不同,有时在给定系列中也会有所不同。因此,每个端口都有一个用于此代码的单独文件。

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

于 2012-07-15T01:08:22.450 回答
3

并非 RTOS 只是周期性地进行上下文切换——这就是大多数 GPOS 的工作方式。在 RTOS 中,调度程序在任何调度事件上运行。这些包括系统滴答,但也包括消息发布、事件触发器、信号量提供或互斥解锁等。

在 ARM Cortex-M 上,CMSIS 3.x包括一个 RTOS API(主要用于 RTOS 开发人员,而不是完整的 RTOS 本身),其源代码将包括上下文切换机制。

如果您想要一个简单 RTOS 的详细描述,您可以考虑阅读µC/OS-II:实时内核或更复杂的µC/OS-III:实时内核

FreeRTOS越来越受欢迎,尽管在架构上可能有点不合常规。一个更完整(因为它不仅仅是一个调度内核,而是一个更完整的操作系统)和非常强大的选项是eCos

于 2012-07-15T08:09:55.477 回答
1

你可以看看xv6
它不是 RTOS,它只是一个用于学术目的的骨架 OS(基于 V6 unix)。
在 XV6 的看第 4 章,有关于如何在像 xv6 这样的小型操作系统上完成调度的解释和代码。XV6 在等待磁盘或某些 I/O 操作时使进程进入睡眠状态,还有每 100 毫秒的定时器中断来切换一个进程。
还有关于上下文切换如何发生的代码解释,保存了哪些信息(进程的上下文框架),当调度程序必须运行时如何从用户模式切换到内核模式。
最好的部分是你必须做的阅读量来理解这些概念与一些关于操作系统的参考书不同:) 代码相对较小,你可以在 qemu 上运行 XV6 设置断点在 sched , swtch 和其他功能并实际查看上下文切换期间保存的信息。(如何在此链接中运行 xv6 )
您无需阅读前面的章节即可理解第 4 章。没有太大的依赖关系,xv6使用struct proc来标识一个进程,ptable代表系统中所有当前运行的进程,proc->conext - 指进程所处的状态(寄存器值等),这个由调度器保存. 干杯:)

于 2012-07-14T14:29:46.650 回答