抢占和上下文切换之间的区别
一点介绍,
我目前正在编写一个小的(微小的)RTOS内核,它应该与内核中的大多数东西是单片的。 然而,我无法找到关于下面列出的几件事情的很多信息,这会很有帮助,除此之外,它实际上并不是某种大学项目,而是我自己的意愿。
回答所有问题的更好的选择是,如果你可以向我推荐一个可免费使用的RTOS(甚至是免费的书),那么最好是实现用户空间并且可抢占(但不像linux那样复杂)的arm。 Linux有一些迄今为止我见过的最糟糕的文档(我曾尝试从linux代码中弄清楚一些事情,但是只有大量的定义分散在一百万个文件中,并且函数钩子包含了更加奇怪的名称,并且每个版本的内容都会重新命名有时移动...)
“抢占”和“上下文切换”有什么区别?
先发制人和非先发制人内核之间的主要区别是什么? 程序员需要什么样的工作才能使内核先发制人?
如何创建和使用用户模式?
ARM文档说,在用户模式下,任何切换到特权模式的指令将被视为未定义的指令。
如果是这样,用户空间程序使用内核代码的唯一方法是系统调用?
内核如何响应用户空间或与用户空间进行交互?
这是否意味着引导后唯一的内核线程(在一个简单的系统中)将是空闲线程?
如果内核代码和数据所在的页面在切换到用户进程时未映射,那么在系统调用或中断时,内核代码如何在未映射到虚拟地址空间的情况下执行?
“可抢占内核”是否仅意味着内核的设计方式是在执行内核代码的过程中进行上下文切换是安全的? 还是需要做更多的工作?
哦,如果这样的问题不允许在这里,对不起,找不到任何关于这个问题的事情。
正如马特写道,这可能是不合理的范围。 但是,我会尽可能多地关注这些问题的总和,因为我会考虑一个合理范围的问题,希望这可以帮助您开始研究。
1“抢占”和“上下文切换”有什么区别?
先发制人是在没有其参与的情况下中断一个进程的行为。 在这种情况下,这可能意味着定时器中断将触发。 这个词来源于一项法律概念:先发制人或先发制人或先发制人或先发制人的权利。 出于您的目的,这意味着当定时器中断触发时,中断服务例程(ISR)优先于先前正在运行的代码。 这并不一定需要涉及内核; 你可以让代码在任何ISR中运行,这些ISR将预先运行。
上下文切换是当OS代码(抢先运行)改变了一个进程或线程的上下文与另一个进程之间的处理器状态(寄存器,模式和堆栈)时发生的情况。 处理器的状态可能位于一个线程中的某一行代码中。 它将在寄存器中有临时数据,在内存的某个区域有堆栈指针,还有其他状态信息。 抢先式操作系统可以将此状态(静态内存或进程堆栈)存储并加载之前进程的状态。 这被称为上下文切换。
2先发制人和非先发制人内核之间的关键区别是什么? 程序员需要什么样的工作才能使内核先发制人?
在抢占式内核中,任何两个汇编指令(称为“序列点”)之间都可以触发中断。 在非抢占式内核中,正在运行的进程必须调用yield()
函数以允许其他线程运行。 先发制人的内核更复杂,但提供更好的并发幻觉。 非premptive内核可以用setjmp.h
来完成,但每个线程都必须定期调用yield()
否则其他线程将不会运行。
当调用类似yield()
的函数时,处理器的状态会自动存储。 当你想让你的操作系统抢占时,你必须手动存储这些信息。
3如何创建和使用用户模式?
ARM文档说,在用户模式下,任何切换到特权模式的指令将被视为未定义的指令。
正确。 但是,他们还说任何中断都会自动运行在特权模式下。 在ARM系统上,您可以使用svc
指令来生成软件中断。 SVC代码(您的操作系统的一部分)将能够以特权模式运行。
4如果是这样,用户空间程序使用内核代码的唯一方法是系统调用?
正确。 至少,这是唯一安全或正确的方式。
5内核如何响应用户空间或与用户空间进行交互?
在ARM上,SVC指令可以获得一个8位值。 这可以用来产生256个系统调用,例如yield,启用中断,禁止中断或任何你需要的。 如果您需要,您也可以选择创建共享内存或消息传递交互机制。
6这是否意味着引导后唯一的内核线程(在一个简单的系统中)将是空闲线程?
这完全取决于你如何设计你的系统。 如果你在所有线程创建完毕后才选择启动你的内核,这可能会更简单 - 这样你就不必担心动态分配线程。 或者,你可以从空闲线程开始并在稍后添加其他线程(通过远程shell?我想你至少需要一个用户线程持续运行......)
7如果内核代码和数据所在的页面在切换到用户进程时未映射,则在系统调用或中断时,内核代码如何执行而不映射到虚拟地址空间?
正如内核模式代码在特权模式下运行,即使代码先前在用户模式下执行,即使进程代码使用不同的地址空间,内核模式代码也会从主堆栈指针(MSP)运行。
8“可抢占内核”是否意味着内核的设计方式是在内核代码执行期间进行上下文切换是安全的? 还是需要做更多的工作?
我认为这意味着内核可以抢占用户代码,而不是内核本身可以被抢占。 任何中断内核都是很困难和不寻常的。 这将需要更多的工作,我正在努力去看你为什么要这样做。
我不会回答你列举的每一个问题,而是尽我所能为你提供(谢天谢地)粗体申请:
回答所有问题的更好选择是,如果您可以向我推荐一个可免费获得的RTOS(甚至是免费书籍)
Micrium的uC / OS-III是一个基于优先级的实时内核,当然支持同步和异步抢占。 而且,幸运的是(以及我回复的原因)是有一本免费的书籍,并且还有可用的源代码。
转到uC / OS-III的主页面,在左边你会看到一个关于源代码可用性的视频链接(“uC / OS-III Source is available”)。
就书本而言,请转到项目页面 ,然后选择最符合您目标的书籍。 90%的材料是相同的; 只有特定于CPU的内容(如上下文切换,中断和初始化)因书而异。
您必须注册才能下载本书和代码,对我来说看起来很公平。
祝好运并玩得开心点。 感谢您提出大胆的最终要求/目标,这使得这更容易。
我的印象是uC / OS-III不是免费的,而是许可的。
FreeRTOS(http://www.freertos.org/)是一个非常好的免费RTOS,
你一定要看看那里
链接地址: http://www.djcxy.com/p/43615.html