architecture - 抢占和上下文切换的区别

标签 architecture kernel arm rtos

一点介绍,

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

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

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

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

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

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

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

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

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

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

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

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

最佳答案

正如 Mat 所写,这可能是不合理的范围。不过,我会尽力像关注一个合理范围的问题一样关注这些问题的总和,希望这能帮助您开始研究。

1 What is the difference between "preemption" and "context switch" ?

抢占是在没有进程参与的情况下中断进程的行为。在这种情况下,这可能意味着将触发计时器中断。这个词来源于法律概念preemption :在其他人之前或优先于其他人主张或购买的行为或权利。就您的目的而言,这意味着当定时器中断触发时,中断服务例程 (ISR) 优先于执行该操作的代码。之前正在运行。这根本不需要涉及内核;您可以在任何 ISR 中运行代码,这些 ISR 会抢占式运行。

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

2 What are the key differences between a preemptive and nonpreemptive kernel ? What all work is required from a programmer to make the kernel preemptive ?

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

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

3 How to create and work with user mode ?

ARM docs say that in user mode, any instruction switching to a privileged mode will be treated as undefined instruction.

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

4 If so, the only way for a userspace program to use kernel code is syscalls ?

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

5 How does a kernel respond or interact with userspace then ?

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

6 Does that mean the only kernel thread after booting (in a simple system) would be the idle thread ?

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

7 If the Page where kernel code and data resides is unmapped when switching to a user process, then on a syscall or interrupt, how does the kernel code execute without being mapped in the virtual address space ?

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

8 Does a 'preemptible kernel' only mean that the kernel was designed in a way that it would be safe to have context switch during execution of kernel code ? or does it require more work to be done if any ?

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

关于architecture - 抢占和上下文切换的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11602395/

相关文章:

design-patterns - 您在使用软件设计模式方面有哪些实践经验?

javascript - 单页应用中如何处理用户权限

Android 模拟器系统镜像和 AMD 处理器

macos - 在 OS X 上,如何找出共享库的编译架构?

architecture - Apache Open NLP 与 NLTK

operating-system - 虚拟内存真的一直有用吗?

android - 每次修改都会出现内核编译错误

c - 如何在 vxworks 6.7 中设置 wdb 进行内核前调试?

c - 为什么用 void 关键字调用函数没有效果?

c - Mac OS X,如何为ARM编译.c文件并在之后反汇编它?