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

时间:2012-07-22 17:23:13

标签: architecture kernel arm rtos

一点介绍,

我目前正在编写一个小的(读取微小的)RTOS内核,它应该与内核中的大多数内容单片。但是我找不到下面列出的一些事情的很多信息,这将是非常有用的,除此之外,它实际上不是某种大学项目,而是我自己做的事情。

回答所有问题的一个更好的选择是,如果你可以向我推荐一个免费提供的RTOS(甚至免费书籍),最好是,它实现了用户空间并且是可抢占的(但并不复杂)喜欢linux)。 Linux有一些我迄今为止看过的最糟糕的文档(我确实尝试过从linux代码中解决问题,但是只有大量的定义分散在一百万个文件和函数钩子中,并且有很多名字,每个版本都会重命名有时感动......)

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

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

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

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

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

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

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

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

  8. “抢占内核”是否仅仅意味着内核的设计方式使得在执行内核代码期间进行上下文切换是安全的?或者它是否需要做更多的工作?

  9. 哦,如果这里不允许这么多问题,抱歉,找不到任何相关内容。

3 个答案:

答案 0 :(得分:13)

Mat写道,这可能是不合理的范围。但是,我会尽可能多地关注问题的总和,以及一个合理范围的问题,希望这将有助于你开始研究。

  

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

抢占是指在没有参与的情况下中断流程的行为。在这种情况下,这可能意味着定时器中断将被触发。这个词来自preemption的法律概念:在他人之前或偏好他人之前主张或购买的行为或权利。为了您的目的,这意味着当定时器中断触发时,中断服务例程(ISR)优先于先前运行的代码。这根本不需要涉及内核;您可以在任何ISR中运行代码,这些代码将抢先运行。

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

  

2抢先和非抢先内核之间的主要区别是什么?程序员需要做什么工作才能使内核先发制人?

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

调用yield()之类的函数时,会自动存储处理器的状态。如果要使操作系统处于抢占状态,则必须手动存储此信息。

  

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

     

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

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

  

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

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

  

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

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

  

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

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

  

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

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

  

8'可抢占的内核'是否仅仅意味着内核的设计方式使得在执行内核代码期间进行上下文切换是安全的?或者它是否需要做更多的工作?

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

答案 1 :(得分:1)

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

  

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

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

转到main page for uC/OS-III,在左侧,您会看到一个关于源代码可用性的视频链接(“uC / OS-III Source is available”)。

就书籍而言,请转到projects page,然后选择与您的目标最匹配的书籍。 90%的材料是相同的;只有特定于CPU的内容(如上下文切换,中断和初始化)因书而异。

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

祝你好运,玩得开心。感谢您提出大胆的最终要求/目标,这使得这更容易。

答案 2 :(得分:1)

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

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

你一定要看看那里