我从各种内核开发人员那里听说,大多数实时操作系统用户空间和内核空间之间没有任何分隔,因此不需要任何上下文切换。
这是真的吗?
同时,我从其他人那里听说这是不正确的,并且诸如VxWorks或Integrity之类的RTOS已将用户模式内核模式分开。
首先,哪些假设是正确的?
其次,如果两个假设都正确,那么就会提出一个问题,即RTOS供应商何时使用内核空间和用户空间之间的分隔,何时不使用?
您能说出一些没有用户模式/内核模式分离的知名RTOS吗?
最后,作为附带的问题,他们如何控制I / O操作并避免竞争状况?
通常,RTOS将配置有许多任务,每个任务都有自己的堆栈。这意味着上下文切换仍然是等式中的很大一部分,因为无论何时内核要切换任务,它都必须先保存传出任务的堆栈,然后在传入任务的堆栈中进行交换,然后再移交给传入任务。
作为第三方开发人员(ISV),您将编写代码以在任务上下文中运行,因此您可以利用任务机制使它的行为类似于轻量级线程。
仍然,如果没有MMU,在这种方案中将不会有任何“真正的”保护措施,以防止偶然地与内核发生冲突。例如,在没有MMU的情况下使RTOS崩溃的最简单的方法是错误地配置堆栈大小,然后导致堆栈溢出,意外清除内核数据/其他任务/覆盖实际程序指令...
...现在,使用MMU,内核可以设置页表映射,以便它可以拦截页错误,并在检测到错误的内存访问(违反预配置的内存边界)时使用此功能来实现段错误机制。通过将附加的安全功能嵌入芯片中,内核还可以限制允许执行何种指令,并且与MMU结合使用,可以在内核和用户模式/空间之间实现适当的分离。
而不是内核/用户空间的概念,某些在带有MMU的目标上运行的RTOS确实使用内存保护方案来将内存和内存映射的I / O分配给特定的线程/进程(和内核),以使一个线程不能破坏另一个或内核。另一方面,许多RTOS在没有MMU的目标上运行,因此无法提供这种安全性和鲁棒性。
在内部,RTOS仅指提供确定性行为的调度方法;没有一种设计,而且在方法和功能上都有很大差异。请参阅特定RTOS的文档。
如果您不了解syscall,则可以对其进行Google搜索。这是一种机制,用户可以通过软件中断服务例程来访问任何内核。
关于上下文切换,上下文切换与用户/内核分离之间没有关联。
供应商何时支持用户和内核分离?通常,它就像一个构建时间功能。由于这会增加执行时间的开销,因此这取决于其RTOS背后的供应商理念。