【问题标题】:How do OSes Handle context switching?操作系统如何处理上下文切换?
【发布时间】:2012-07-14 01:24:09
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: operating-system scheduled-tasks rtos


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

        在 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

        【讨论】:

          猜你喜欢
          • 2021-12-22
          • 2015-03-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多