8

一点介绍,

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

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

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

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

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

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

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

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

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

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

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

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

4

3 回答 3

16

正如 Mat 所写,这可能是不合理的范围。但是,我会尽量关注问题的总和,就像关注一个范围合理的问题一样,希望这将有助于您开始研究。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

我认为这意味着内核可以抢占用户代码,而不是内核本身可以被抢占。中断内核的任何事情都是困难和不寻常的。那将需要更多的工作,而我正在努力了解您为什么想要它。

于 2012-07-22T17:54:59.517 回答
1

我不会回答您列举的每个问题,而是尽我所能为您(谢天谢地)加粗的请求提供服务:

回答所有问题的更好选择是,如果您可以向我推荐免费的 RTOS(甚至是免费书籍),最好是 arm

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

前往uC/OS-III 的主页,在左侧您将看到一个视频链接,该视频讨论了源代码可用性(“uC/OS-III 源代码可用”)。

就书籍而言,转到项目页面,然后选择与您的目标最匹配的书籍。90%的材料是一样​​的;只有特定于 CPU 的内容(如上下文切换、中断和初始化)会因书而异。

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

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

于 2012-07-24T03:11:05.557 回答
1

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

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

你一定要去那里看看

于 2012-07-24T05:20:57.367 回答