Arm RTOS中的RTOS

Arm RTOS中的RTOS,arm,rtos,freertos,Arm,Rtos,Freertos,我计划将一个RTOS(如Nuttx)作为另一个RTOS(如FreeRTOS)的进程运行,这样FreeRTOS任务和作为FreeRTOS任务运行的Nuttx将共存 考虑到底层硬件是ARM cortex A8单核处理器,这种实现是否可行?如果实现不是基于虚拟机概念,那么需要进行哪些更改?简而言之,您的要求是允许来宾RTO完全在底层主机RTO的范围内工作。第一个答案是使用虚拟化扩展,但A8处理器没有,因此将排除此选项。如果没有虚拟化扩展,您必须求助于以下方法之一,并且需要大量代码更改 选项1-移植来宾

我计划将一个RTOS(如Nuttx)作为另一个RTOS(如FreeRTOS)的进程运行,这样FreeRTOS任务和作为FreeRTOS任务运行的Nuttx将共存


考虑到底层硬件是ARM cortex A8单核处理器,这种实现是否可行?如果实现不是基于虚拟机概念,那么需要进行哪些更改?

简而言之,您的要求是允许来宾RTO完全在底层主机RTO的范围内工作。第一个答案是使用虚拟化扩展,但A8处理器没有,因此将排除此选项。如果没有虚拟化扩展,您必须求助于以下方法之一,并且需要大量代码更改

选项1-移植来宾操作系统API

获取所有来宾操作系统API并替换它们的实现,以便它通过使用主机操作系统的API模仿所需的API行为。从技术上讲,现在您的来宾操作系统将没有调度器,并将减少到主机操作系统顶部的移植层。当公司需要其软件解决方案跨多个RTO工作时,可使用此方法。他们将编写基于RTOS的软件解决方案。当客户要求在其RTO上运行软件时,他们只需将RTOSAPI实现移植到客户的RTO上

选项2-准虚拟化

来宾RTOS用户和内核空间都应该在主机RTOS的用户空间内工作。让我们把这个问题分成几个部分

处理特权指令

当您的来宾操作系统在“内核模式”下执行时尝试执行特权指令,将导致undef指令中止。您必须修改主机内核的undef指令中止处理程序,以捕获/截获这些指令并对其执行操作。必须捕获/截获并“模拟”每一条特权指令。有些指令不会陷入陷阱,但需要通过修改代码来处理。如果内核代码读取CPSR以确认执行模式,CPSR会说该模式是用户模式。(此指令不会导致指令中止,因此您无法遵循陷阱和模拟模型。唯一的方法是在来宾操作系统代码库中识别、搜索和替换这些指令。)

内存管理单元

如果发生权限冲突,将触发主机操作系统的数据中止。它必须转发给您的来宾操作系统

中断

您必须将来宾操作系统的中断控制器驱动程序替换为虚拟SVC调用,该调用将调用主机操作系统来设置中断

计时器

您必须修改来宾计时器驱动程序,以说明在运行主机操作系统任务时“丢失”的滴答声

硬件驱动程序

必须修改来宾操作系统使用的所有其他硬件驱动程序,以允许来宾和主机之间的设备共享

调度程序

您的来宾操作系统调度器现在在另一个调度器(主机操作系统调度器)内部工作(因此受其支配)。

这是可行的。 您需要分离资源:内存、计时器、IRQ等,以便“主机”操作系统(FreeRTOS)甚至不“知道”“来宾”操作系统(Nuttx)使用的资源

对于Cortex-A8,您可能希望对FreeRTOS使用IRQ,对GuestOS使用FIQ。它将允许您不重写IRQ控制器(但再次确保主机在GuestOS启动后不控制FIQ)


上下文切换可能需要一些更改:您需要区分主机-主机上下文切换、主机-来宾(和来宾-主机)上下文切换和来宾-来宾上下文切换。

虽然不能直接回答您的问题,但请在设计级别解决此问题,对依赖于硬件的代码进行分离(创建API)并使应用程序级代码独立于底层操作系统或运行时,即依赖于特定的实现,让它依赖于API


如果需要将依赖于硬件(OS)的代码移植到底层OS/运行时

感谢信息专家,但我在提出问题时遗漏了一个小细节-我所有的代码都需要在SVC模式下运行,因此没有用户和内核空间概念…NUTTX的调度程序将如何使用?