抢占和上下文切换的区别

2024-03-19

一点介绍,

我目前正在编写一个小型(读微型)RTOS 内核,它应该与内核中的大多数内容是一体的。然而,我找不到关于下面列出的一些事情的太多信息,这会很有帮助,除此之外,它实际上不是某种大学项目,而是我按照自己的意愿做的事情。

回答所有问题的一个更好的选择是,如果您可以向我推荐一个免费的适用于arm的RTOS(甚至是免费的书)它实现了用户空间并且是可抢占的(但不像linux那样复杂)。 Linux 有一些我迄今为止见过的最糟糕的文档(我确实尝试从 Linux 代码中找出一些东西,但只有大量的定义分散在数百万个文件和函数钩子中,它们的名称很奇怪,而且每个版本都被重命名。有时会移动...)

  1. “抢占”和“上下文切换”有什么区别?

  2. 抢占式和非抢占式内核之间的主要区别是什么?程序员需要做哪些工作才能使内核抢占?

  3. 如何创建和使用用户模式?

    ARM 文档说,在用户模式下,任何切换到特权模式的指令都将被视为未定义指令。

  4. 如果是这样,用户空间程序使用内核代码的唯一方法是系统调用?

  5. 那么内核如何响应或与用户空间交互呢?

  6. 这是否意味着启动后(在简单系统中)唯一的内核线程将是空闲线程?

  7. 如果切换到用户进程时内核代码和数据所在的页面未映射,那么在系统调用或中断时,内核代码如何在没有映射到虚拟地址空间的情况下执行?

  8. “可抢占式内核”是否仅意味着内核的设计方式可以在内核代码执行期间安全地进行上下文切换?或者是否需要做更多的工作(如果有)?

哦,如果这里不允许提出这样的多个问题,抱歉,找不到任何相关内容。


正如马特所写,这可能是不合理的范围。然而,我将尝试像关注一个合理范围的问题一样关注问题的总和,希望这能帮助您开始研究。

1 “抢占”和“上下文切换”有什么区别?

抢占是在不涉及进程的情况下中断进程的行为。在这种情况下,这可能意味着将触发计时器中断。这个词来源于一个法律概念抢占 http://dictionary.reference.com/browse/preemption: 在他人之前或优先于他人提出主张或购买的行为或权利。出于您的目的,这意味着当定时器中断触发时,中断服务例程 (ISR) 优先于之前运行的代码。这根本不需要涉及内核;您可以在任何 ISR 中运行代码,该代码将抢占式运行。

当操作系统代码(抢占式运行)在一个进程或线程的上下文与另一个进程或线程的上下文之间改变处理器的状态(寄存器、模式和堆栈)时,就会发生上下文切换。处理器的状态可以位于一个线程中的某一代码行。它将在寄存器中包含临时数据、位于内存特定区域的堆栈指针以及其他状态信息。抢占式操作系统可以存储此状态(存储到静态内存或进程的堆栈上)并加载前一个进程的状态。这称为上下文切换。

2 抢占式和非抢占式内核之间的主要区别是什么?程序员需要做哪些工作才能使内核抢占?

在抢占式内核中,可以在任意两个汇编指令(称为“序列点”)之间触发中断。在非抢占式内核中,正在运行的进程必须调用yield()函数允许其他线程运行。抢占式内核更复杂,但提供了更好的并发假象。非抢先式内核可以非常简单地完成setjmp.h,但是每个线程必须定期调用yield()否则其他线程将无法运行。

当像这样的函数yield()被调用时,处理器的状态会自动存储。当您想让操作系统抢占时,您必须手动存储此信息。

3 如何创建和使用用户模式?

ARM 文档说,在用户模式下,任何切换到特权模式的指令都将被视为未定义指令。

正确的。然而,他们还说任何中断都会自动在特权模式下运行。在 ARM 系统上,您可以使用svc产生软件中断的指令。然后,SVC 代码(操作系统的一部分)将能够在特权模式下运行。

4 如果是这样,用户空间程序使用内核代码的唯一方法是系统调用?

正确的。至少,这是唯一安全或正确的方法。

5 那么内核如何响应或与用户空间交互?

在ARM上,SVC指令可以获得8位值。这可用于生成 256 个系统调用,例如yield、启用中断、禁用中断或任何您需要的内容。如果需要,您还可以选择创建共享内存或消息传递交互机制。

6 这是否意味着启动后(在简单系统中)唯一的内核线程将是空闲线程?

这完全取决于您如何设计系统。如果您选择仅在创建所有线程后启动内核,这可能会更简单 - 这样您就不需要担心动态分配线程。或者,您可以从空闲线程开始,稍后添加其他线程(通过远程 shell?我认为您希望至少有一个用户线程持续运行......)

7 如果切换到用户进程时内核代码和数据所在的页面未映射,那么在系统调用或中断时,内核代码如何在没有映射到虚拟地址空间的情况下执行?

正如内核模式代码在特权模式下运行(即使该代码之前在用户模式下执行)一样,内核模式代码也将从主堆栈指针 (MSP) 运行,即使进程代码使用不同的地址空间也是如此。

8 “可抢占内核”是否仅意味着内核的设计方式是在内核代码执行期间进行上下文切换是安全的?或者是否需要做更多的工作(如果有)?

我认为这意味着内核可以抢占用户代码,而不是内核本身可以被抢占。对于任何事情来说,中断内核都是困难且不寻常的。这需要更多的工作,我很难理解你为什么想要它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

抢占和上下文切换的区别 的相关文章

  • 将 CPU 频率指定为 Linux 启动时的内核 CMD_LINE 参数?

    我将笔记本电脑的i5 CPU更换为i7 CPU 这样它可以运行得更快 但由于i7的功率更大 温度也比以前更高 所以我的笔记本经常死机 所以 我使用cpupower来指定CPU的最大频率 它起作用了 现在 我的问题是 有没有办法在启动时将CP
  • 使用heroku上传文件

    据我所理解heroku http heroku com不允许存储单个 Rails 应用程序的上传文件 在他们的文档中 他们提到文件可以上传到亚马逊S3 http aws amazon com s3 实例 我目前没有 S3 帐户 因此假设我只
  • JPA 实体和/与 DTO

    在这些情况下帮助决定何时使用 DTO 以及何时使用 Entity 的总体思路是什么 UI 服务器端java调用服务 它应该获取 发送实体还是 DTO Web 服务调用服务 服务是否应该接受实体或 DTO 我喜欢阅读传递实体的代码 传递更简单
  • 如何动态添加 mixin 作为基类而不出现 MRO 错误?

    说我有课A B and C Class A and B都是 Class 的 mixin 类C class A object pass class B object pass class C object A B pass 这在实例化 C 类
  • 在 MVC 中拥有巨大的控制器或许多控制器更好?

    我们正在 ASP NET MVC 中构建一个相当大的 HR 应用程序 到目前为止 我们的控制器变得相当大 例如 我们有一个员工控制器 并且包含所有员工视图 个人信息 员工扣除额 家属等 每个视图都可能有多个操作或子视图 例如 CRUD 每个
  • 在 ARM 处理器上执行存储在外部 SPI 闪存中的程序

    我有一个 ARM 处理器 能够与外部闪存芯片连接 写入芯片的是为 ARM 架构编译的程序 可供执行 我需要知道如何将这些数据从外部闪存获取到 ARM 处理器上以供执行 我可以提前运行某种复制例程 将数据复制到可执行内存空间吗 我想我可以 但
  • 小型 ARM 微控制器的 RTOS 内核之间的可量化差异 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有许多不同的 RTOS 可用于微控制器 我专门寻找支持 ARM Cortex M 处理器的 RTOS 另外 我对闭源解决方案不感兴趣 试图从网站
  • 用于 RHEL 的 gdb-multiarch

    我正在尝试寻找方法来运行gdb 多架构RHEL 中的命令 我已经安装了用于 ARM 处理的 QEMU 模拟器 我想安装GDB进行调试 我能够安装GDB 多体系结构在 Ubuntu 中运行命令成功 sudo apt get GDB multi
  • 如何使用 gcc 编译代码和 ARM Cortex A8 目标进行调用图分析?

    我对这个已经咬牙切齿了 我需要在 ARM 板上进行分析并需要查看调用图 我尝试使用 OProfile Kernel perf 和 Google 性能工具 一切正常 但不输出任何调用图信息 这使我得出结论 我没有正确编译代码 我在编译 C 代
  • 如何通过WMI确定操作系统平台?

    我试图弄清楚 WMI 中是否有一个位置可以返回可在 所有 版本的 Windows 上工作的操作系统架构 即 32 位或 64 位 当我发现以下内容时 我以为我已经弄清楚了我的Win2k8系统 Win32 OperatingSystem OS
  • DSP 库 - RFFT - 奇怪的结果

    最近我一直在尝试在我的STM32F4 Discovery评估板上进行FFT计算 然后将其发送到PC 我已经调查了我的问题 我认为我对制造商提供的 FFT 函数做错了 我正在使用 CMSIS DSP 库 现在我一直在用代码生成样本 如果工作正
  • 什么算作失败?

    假设我有一个伪 C 程序 For i 0 to 10 x a 2 x 5 next 30 FLOPS 的 FLOP 数量是 1 x 1 x 5 1 2 x 5 10 loop 吗 我很难理解什么是失败 请注意 指示我从何处获取 操作 计数
  • 源和目标具有不同的 EABI 版本

    我正在尝试使用 ARM 工具链编译 so 文件 但是我不断收到这个错误 错误 源对象的 EABI 版本为 0 但目标对象的 EABI 版本为 5 我无法更改工具链中的任何内容 因为我必须使用给定的工具链 我以前从未见过这个错误 我使用了这个
  • 可以使用Visual Studio 2012构建ARM桌面程序吗?

    我正在使用 Visual Studio 2012 beta 我的桌面 win32 程序在 ARM 架构中编译得很好 升级到 Visual Studio 2012 RC 后 编译器无法工作并出现以下错误 不支持为 ARM 平台编译桌面应用程序
  • 使用多个提供程序的客户端应用程序应使用什么设计/模式?

    这是一个与设计相关的问题 假设我们有一个名为 ClientAPI 的公共 API 其中包含一些 Web 方法 例如 CreateAccount GetAccount 根据客户的不同 我们使用许多不同的提供商来满足这些请求 假设我们有 Pro
  • 如何发出 JMS 同步请求

    我有一个 Web 应用程序 预计将从外部应用程序获取和显示数据 该外部应用程序只能通过消息传递 JMS 访问 因此 如果用户在浏览器上提交请求 则同一 HTTP 请求线程将必须与消息系统 MQ 系列 交互 以便同一请求线程可以显示从消息系统
  • 如何在Linux内核中启用CONFIG_PREEMPT选项?

    我是 Linux 内核编程的新手 尝试在 x86 64 上使用旧内核 Linux 2 6 32 我想启用其中的 CONFIG PREEMPT 选项 但找不到有关如何执行此操作的信息 我可以使用我的首选选项编译新内核 但不知道在这种情况下我需
  • 杀死 OpenCL 内核

    有没有办法通过 OpenCL API 终止正在运行的 OpenCL 内核 我在规范中没有找到任何内容 我能想到的唯一解决方案是 1 定期检查内核中主机希望内核停止时写入的标志 或 2 在单独的进程中运行内核并终止整个进程 我认为这两个都不是
  • ARM + gcc:不要使用一大块 .rodata 部分

    我想使用 gcc 编译一个程序 并针对 ARM 处理器进行链接时间优化 当我在没有 LTO 的情况下编译时 系统会被编译 当我启用 LTO 时 使用 flto 我收到以下汇编错误 错误 无效的文字常量 池需要更近 环顾网络 我发现这与我系统
  • 您会在新的商业项目中使用 S#arp 架构吗?

    The S arp 架构 http code google com p sharp architecture 看起来真的很酷 但是您是否认为它仍然太新而无法在重要的新项目中做出承诺 我们假设该项目乍一看很适合它 It all seems非常

随机推荐