抢占和上下文切换之间的区别



简介

我目前正在编写一个小型(读起来很小)RTOS内核,它应该是与内核中的大多数东西集成在一起的。然而,我在下面列出的几件事上找不到太多信息,这会很有帮助,除此之外,这实际上不是什么大学项目,而是我自己想做的事情。

回答所有问题的一个更好的选择是,如果你能向我推荐一本免费提供的arm RTOS(甚至是一本免费的书),最好是,它实现了用户空间并可抢占(但不像linux那样复杂)。到目前为止,Linux有一些我见过的最糟糕的文档(我确实尝试过从Linux代码中找出一些东西,但只有大量的定义散布在一百万个文件和函数挂钩中,其中有不同的名称和东西被重命名,每个版本有时也会被移动…)

  1. "抢占"one_answers"上下文切换"之间有什么区别?

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

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

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

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

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

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

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

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

哦,如果这里不允许这样多个问题,对不起,我找不到任何关于这方面的信息。

正如Mat所写,这可能是不合理的范围。然而,我会尽可能多地关注问题的总和,就像关注一个范围合理的问题一样,希望这能帮助你开始研究。

1"抢占"one_answers"上下文切换"之间的区别是什么?

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

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

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

在抢占式内核中,中断可以在任意两条汇编指令(称为"序列点")之间触发。在非抢占式内核中,正在运行的进程必须调用yield()函数才能允许其他线程运行。抢占式内核更为复杂,但提供了更好的并发错觉。使用setjmp.h可以非常简单地完成非预处理内核,但每个线程必须定期调用yield(),否则其他线程将不会运行。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

与其回答您列举的每一个问题,我将尽我所能满足您(谢天谢地)大胆的请求:

回答所有问题的更好选择是,如果你能向我推荐一本免费的手臂RTOS(甚至一本免费书),最好是

Micrium的uC/OS-III是一个基于优先级的实时内核,它(当然)支持同步和异步抢占。幸运的是(我回复的原因)是有一本免费的书,还有源代码。

转到uC/OS-III的主页,在左侧您将看到一个关于源代码可用性的视频链接("uC/OS-III源代码可用")。

至于书籍,请转到项目页面,然后选择最符合您目标的书籍。90%的材料是相同的;只有CPU特定的东西(如上下文切换、中断和初始化)会因书而异。

你必须注册才能下载这本书&代码,对我来说似乎很公平。

祝你好运,玩得开心。感谢你大胆地提出你的最终要求/目标,这让事情变得容易多了。

我觉得uC/OS-III不是免费的,而是许可的。

一个很好的免费RTOS,并且解释得很好,是FreeRTOS(http://www.freertos.org/)

你绝对应该看看那里的

相关内容

  • 没有找到相关文章

最新更新