一点介绍

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

回答所有问题的一个更好的选择是,如果您可以向我推荐一个免费的RTOS(甚至是一本免费的书)供arm最好使用,它实现了用户空间并且是可抢占的(但不像linux那样复杂)。到目前为止,Linux有一些最糟糕的文档(我曾尝试从linux代码中找出问题,但一百万个定义分散在百万个文件和功能钩子(Hook)中,带有怪异的名称,并且每个版本的名称都被重命名了有时感动...)

  • “抢占”和“上下文切换”有什么区别?
  • 抢占式内核与非抢占式内核之间的主要区别是什么?程序员需要做什么工作才能使内核抢占?
  • 如何创建和使用用户模式?

    ARM文档说,在用户模式下,任何切换到特权模式的指令都将被视为未定义指令。
  • 如果是这样,则用户空间程序使用内核代码的唯一方法是syscalls?
  • 然后内核如何响应用户空间或与用户空间交互?
  • 这是否意味着(在简单系统中)引导后唯一的内核线程是空闲线程?
  • 如果切换到用户进程时未映射内核代码和数据所在的页面,则在系统调用或中断时,如何在不映射到虚拟地址空间的情况下执行内核代码?
  • “可抢占式内核”是否仅表示设计内核的方式使其可以在执行内核代码期间安全地进行上下文切换?还是需要做更多的工作?

  • 哦,如果在这里不允许这么多个问题,很抱歉,找不到任何有关此的信息。

    最佳答案

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



    抢占是在不涉及进程的情况下中断进程的行为。在这种情况下,这可能意味着将触发计时器中断。这个词来自preemption的法律概念:在他人之前或优先于他人主张或购买的行为或权利。就您的目的而言,这意味着在触发定时器中断时,中断服务程序(ISR)优先于先前运行的代码。这并不一定需要包含内核。您可以让代码在任何可抢先运行的ISR中运行。

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



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

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



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



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



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



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



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



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

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

    10-10 14:03