抢占和上下文切换的区别

8

简单介绍一下,

我正在编写一个小型(可以说是微小的)RTOS内核,它应该是单体结构,大部分功能都在内核中。但是我找不到以下几个问题的太多信息,如果您能提供一些帮助,那将非常有益。除此之外,这实际上并不是某种大学项目,而是我自愿做的。

回答所有问题的更好选择是,如果您能为我推荐一个可用于ARM的免费RTOS(甚至是免费书籍),该RTOS实现了用户空间,并且具有抢占式特性(但不像Linux那样复杂)。 Linux拥有我目前看过的最糟糕的文档(我确实尝试从Linux代码中解决问题,但是存在大量定义散布在数百万文件和函数钩子中,其名称奇怪且版本变化时也会被重命名...)

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

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

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

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

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

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

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

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

  8. “可抢占内核”只是指内核被设计为在执行内核代码期间安全地进行上下文切换吗?还需要完成更多工作吗?

哦,如果这里不允许提出多个问题,请原谅,我找不到任何相关规定。


3
根据 [faq] 中的内容:"您的问题应该有合理范围。如果您可以想象一本整本书来回答您的问题,那么您的要求就太高了。" 这里的问题太多,而且范围非常广泛。看起来你需要一本关于操作系统设计的好书,以及一本关于ARM的好书。 - Mat
是的,正如问题中提到的那样,一本书会是一个不错的选择。这些问题本身的范围并不是很广泛,它们要么涉及抢占,要么涉及内核用户关系。但是我担心这些问题太多了,无法在一个帖子中解决,对此我感到抱歉。我会看看版主建议将其分解或更改为“需要一本适用于ARM的良好系统设计书”。 - sgupta
这里不适合提出书籍推荐问题。(虽然有一些历史问题仍然存在,但新问题是不被欢迎的。) - Mat
我很乐意以任何形式提供我的答案,无论是链接到与我一样古老的线程,链接到书籍,长篇回答,链接到某些好的(免费)软件的源代码等等。但是,如果我确实需要推荐一本好的系统设计书(尽管我只是在寻找几个答案,但好的阅读也无妨),我应该在哪里发布?这是我能想到的最相关的堆栈网站。 - sgupta
Stack Exchange 网站一般都是问答网站,而不是推荐引擎。 - Mat
请参见:https://dev59.com/U2435IYBdhLWcg3wrSBB ,http://stackoverflow.com/questions/3543659/how-can-a-kernel-be-non-preemptive-and-still-have-multiple-control-paths,然后针对每个问题单独发一个帖子提出未解决的问题。 - ninjalj
3个回答

16

正如Mat所写,这可能是一个范围过于宽泛的问题。但我会尽可能关注所有问题的总和,就像对一个范围合理的问题一样,希望这可以帮助你开始研究。

1 “抢占”与“上下文切换”的区别是什么?

抢占是指在不涉及进程参与的情况下中断一个进程的行为。在这个上下文中,这可能意味着定时器中断将触发。该词源于法律概念中的preemption优先或优先于他人声明或购买的行为或权利。 对于您的目的而言,这意味着当定时器中断触发时,中断服务例程(ISR)比之前运行的代码具有优先权。这不一定需要涉及内核;您可以在任何ISR中运行代码以实现抢占式运行。

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

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

在抢占式内核中,中断可以在任意两个汇编指令之间触发(称为“序列点”)。在非抢占式内核中,正在运行的进程必须调用yield()函数才能让其他线程运行。抢占式内核更复杂,但提供更好的并发Illusion。使用setjmp.h可以非常简单地实现非抢占式内核,但是每个线程必须定期调用yield(),否则其他线程将无法运行。
当调用像yield()这样的函数时,处理器状态会自动存储。要使操作系统具有抢占性,必须手动存储此信息。
ARM文档表示,在用户模式下,任何切换到特权模式的指令都将被视为未定义指令。然而,他们也说,任何中断都会自动以特权模式运行。在ARM系统上,您可以使用svc指令生成软件中断。然后,SVC代码(您的操作系统的一部分)将能够以特权模式运行。
正确。至少,这是唯一的安全或正确的方法。
在ARM上,SVC指令可以获得8位值。这可以用于生成256个系统调用,例如yield、启用中断、禁用中断或任何您需要的内容。如果需要,您还可以选择创建共享内存或消息传递交互机制。
是的,这意味着在启动后(在简单系统中),唯一的内核线程将是空闲线程吗?

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

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

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

8 '可抢占内核' 是否仅意味着内核被设计成在内核代码执行期间进行上下文切换是安全的?还是需要做更多的工作?

我认为这意味着内核可以抢占用户代码,而不是内核本身可以被抢占。任何东西要打断内核都很困难和不寻常。这需要更多的工作,我很难想象为什么您会需要这样做。


内核抢占非常重要(我敢打赌,特别是对于实时系统)。http://www.linuxjournal.com/article/5600 - Mat
@Mat - 啊,我明白了 - 你基本上是在与你的可抢占内核并发地运行另一个内核。有趣! - Kevin Vermeer
我已经点赞了,但是如果有更好的答案,我会再等一段时间。谢谢你的时间。 - sgupta
@user1075375,由于已经有了这个回答,你不太可能得到更好的答案。像我这样的其他人可能也会发布答案,但我们不会这样做,因为大部分内容都是重复的。 - JeremyP
@KevinVermeer 如果你仔细想一下,这是必然的情况。如果一个进程从磁盘请求一个块,你不希望整个计算机在检索时停止运行。此时最好切换到另一个进程。话虽如此,有时也需要显式地进行让出操作。 - JeremyP
显示剩余4条评论

1
与其回答您列出的每个问题,我会尽力为您服务(感谢您加粗的请求):
更好的选择是,如果您能向我推荐一个可用于ARM的自由RTOS(甚至是一本免费书籍),那就更好了。
Micrium的uC/OS-III是基于优先级的实时内核,支持同步和异步抢占。 幸运的是(也是我回复的原因),有一本免费的书可用,并且源代码也可用。
请访问uC/OS-III的主页,在左侧您将看到一个视频链接,介绍源代码的可用性(“uC/OS-III源代码可用”)。
就书而言,请转到项目页面,选择最接近您目标的书。90%的材料是相同的;只有特定于CPU的内容(如上下文切换、中断和初始化)会因书而异。
您需要注册才能下载书籍和代码,这对我来说很公平。
祝你好运并玩得开心。感谢您将最终请求/目标加粗,这使得翻译更容易了。

谢谢,我也会查看的。 - sgupta

1
我曾经认为uC/OS-III不是免费的,而是需要许可证的。
一个非常好的免费RTOS,并且解释得非常清楚,就是FreeRTOS(http://www.freertos.org/)。
你一定要去看看。

uC/OS在商业产品中的许可证不是免费的,也从未如此。根据我所听到的,各种产品/产品线/CPU/站点许可证的定价范围从10k美元到20k美元不等。然而,它一直是源代码可用的,并且这本书非常棒(是的,我认为它比FreeRTOS更好地记录了);Jean Labrosse在教育和开放方面做得非常好。 - Kevin Vermeer
建议的编辑已被拒绝:http://stackoverflow.com/suggested-edits/327885 - Kevin Vermeer
@KevinVermeer - 这是一个非常极端的编辑,它改变了答案的意思,所以我可以理解为什么人们会拒绝它。我的建议是要么将其作为全新的答案发布,要么将其附加到您已接受的答案中。看起来是很好的材料,但我们确实尝试尊重原始作者的意图。 - Brad Larson
@BradLarson - 感谢您的参与。我知道这增加了很多内容,但我并没有添加新信息。我是在澄清作者的意图:通过来自源站点的证据备份和澄清模糊的“印象”,从纯文本链接更改为正确格式化的链接到大型站点的有用部分,并引用有关建议的RTOS优点的相关文章。 - Kevin Vermeer
@KevinVermeer - 开始时语气有些微妙的变化,你添加了很多新信息。我们过去曾经有人抱怨编辑在修改答案时添加了太多内容,因此我仍然认为最好的解决方案是根据你的编辑编写自己的答案(也许可以说一些类似于“扩展Rafael在他的答案中所说的内容...”)。对于一个问题有多个答案并没有问题。 - Brad Larson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接