我从各种内核开发人员那里听说大多数RTOSes 用户空间和内核空间之间没有任何分离,因此不需要任何上下文切换。
这是真的吗?
同时,我从其他人那里听说这不是真的,VxWorks 或 Integrity 等 RTOS 已经分离了用户模式内核模式。
首先,这些假设中哪一个是正确的?
其次,如果两个假设都是正确的,那么它就会提出一个问题,即当RTOS供应商使用内核空间和用户空间之间的分离时,当他们不使用时?
您能说出一些没有用户模式/内核模式分离的知名 RTOS 吗?
最后,作为一个附带问题,他们如何控制 I/O 操作并避免争用条件?
像FreeRTOS和衍生产品这样的东西在没有MMU的硬件上运行得很愉快。
如果没有 MMU,内核和用户模式之间的任何分离都有些虚幻(您可以简单地覆盖内核内存),但仍然存在区别:
通常,RTOS将配置许多任务,每个任务都有自己的堆栈。这意味着上下文切换仍然是等式的重要组成部分,因为每当内核想要切换任务时,它必须首先保存传出任务的堆栈,然后在移交给传入任务之前交换传入任务的堆栈。
作为第三方开发人员 (ISV),您将编写代码以在任务上下文中运行,因此您可以利用任务机制使其行为类似于轻量级线程。
尽管如此,如果没有 MMU,在这个方案中不会有任何"真正的"保护,以免意外弄乱内核。例如,在没有MMU的情况下使RTOS崩溃的一个最简单的方法是错误配置堆栈大小,然后最终导致堆栈溢出,意外擦除内核数据/其他任务/覆盖实际程序指令...
。现在,使用 MMU,内核可以设置页表映射,以便它可以拦截页面错误,并在检测到错误的内存访问(违反预配置的内存边界)时使用它来实现段错误机制。通过芯片中嵌入的其他安全功能,内核还可以限制允许执行的指令任务类型,并与MMU结合使用,在内核和用户模式/空间之间实现适当的分离。
上下文切换与用户/内核空间没有直接关系。 上下文切换与线程/进程/中断上下文之间的切换有关;这发生在任何RTOS中,无论用户/内核空间或MMU保护的任何概念如何。
内核/用户空间概念是指权限级别,您可以在内核空间中执行操作或访问用户空间不可用的内存或 I/O。 在嵌入式系统中,许多线程需要直接 I/O 访问来确保内核驱动程序交换机可能无法提供的实时行为,而不是概念可能没有多大意义。 许多RTOS不是完整的操作系统,而只是提供调度,IPC,同步,资源锁定和定时服务的内核; 它们通常不定义驱动程序模型或提供任何 I/O、网络或文件系统服务,因此内核空间概念几乎没有价值。
与内核/用户空间概念不同,在具有 MMU 的目标上运行的一些 RTOS 确实使用内存保护方案将内存和内存映射 I/O 分配给特定线程/进程(和内核),以便一个线程无法损坏另一个线程或内核。 另一方面,许多RTOS在没有MMU的目标上运行,因此无法提供这种安全性和鲁棒性。
在tern中,RTOS仅指提供确定性行为的调度方法;没有一种设计,并且在方法和功能上都有显着差异。请参阅特定 RTOS 的文档。
首先,RTOS可以支持用户和内核分离。有些人将其称为受保护的构建支持,其中用户/应用程序无法直接访问任何内核资源。
在没有MMU支持的RTOS中,通过仅通过syscall限制用户访问来保证用户和内核的分离。
如果你不知道syscall,你可以谷歌一下。它是一种机制,其中用户的任何内核访问都是通过软件中断服务例程进行的。
关于上下文切换,上下文切换和用户/内核分离之间没有相关性。
供应商何时支持用户和内核分离?大多数情况下,它就像构建时功能。由于这增加了执行时间的开销,因此这取决于其RTOS背后的供应商理念。
根据作为RTOS的VxWorks
架构,显然,它没有两个地址空间(用户和内核)。用户服务和内核服务都将在单个地址空间中处理,方法是为每个任务提供自己的内存空间。此内存空间需要虚拟到物理内存映射,该映射仅适用于可选组件VxVMI
(VxWorks 虚拟内存接口)。
补充信息:我们使用具有单一地址空间的 RTOS,以提供非解释服务和更快的操作系统执行。VxWorks 架构参考链接:
https://www.google.com/url?sa=t&source=web&rct=j&url=http://www.ing.iac.es/~docs/external/vxworks.old/Programmers-Guide-5.4.pdf&ved=2ahUKEwjm3rmag5XpAhVEXn0KHSGPDYwQFjAAegQIBBAB&usg=AOvVaw0E9VEDjpd5XIvaaoDxGcCD