我打算运行RTOS,例如Nuttx作为另一个RTOS的进程,例如FreeRTOS,以便freertos任务和作为Freertos任务运行的Nuttx将共存。
鉴于底层硬件是ARM cortex A8单核处理器,这是否可行?如果实施不是基于VM概念,可能需要进行哪些更改?
答案 0 :(得分:2)
简而言之,您的要求是允许GUEST RTOS在底层HOST RTOS的领域内完全运行。第一个答案是使用虚拟化扩展,但A8处理器没有,因此将统治此选项。如果没有虚拟化扩展,则必须使用以下方法之一,并且需要进行大量代码更改。
选项1 - 移植您的GUEST OS API
获取所有GUEST OS API并替换它们的实现,以便通过使用HOST OS的API来模仿所需的API行为。从技术上讲,现在您的GUEST操作系统将没有调度程序,并将缩减为主机操作系统之上的移植层。当公司需要他们的软件解决方案来跨多个RTOS工作时,公司就会使用这种方法。他们会根据RTOS编写软件解决方案。当客户要求在他们的RTOS上运行软件时,他们只需将RTOS API实现移植到客户的RTOS上。
选项2 - 半虚拟化
您的guest虚拟机RTOS用户和内核空间应该都在主机RTOS的用户空间内工作。让我们把问题分成几个部分。
处理特权说明
当您的Guest OS在“内核模式”下执行尝试执行特权指令时,将导致undef指令中止。您必须修改主机内核的undef指令中止处理程序以捕获/拦截这些指令并对其进行操作。每个特权指令都必须被捕获/截获并“模拟”。有一些指令不会陷阱,但需要通过修改代码来处理。例如。如果您的内核代码读取CPSR以确认执行模式,则CPSR会将模式称为用户模式。 (该指令不会导致指令中止,因此您无法跟踪陷阱并模拟模型。唯一的方法是在GUEST OS代码库中识别,搜索和替换这些指令。)
内存管理单元
如果发生权限违规,数据中止将被触发到您的主机操作系统。它必须转发给您的客户操作系统。
<强>中断强>
您必须使用虚拟SVC调用替换您的GUEST OS的中断控制器驱动程序,这些调用将调用您的主机操作系统来设置中断。
<强>计时器强>
在运行HOST OS任务时,您必须修改GUEST计时器驱动程序以解决“丢失”刻度。
硬件驱动程序
必须修改GUEST OS使用的所有其他硬件驱动程序,以允许GUEST和HOST之间的设备共享。
<强>调度程序强>
您的GUEST操作系统调度程序现在可以在另一个调度程序(HOST OS Scheduler)内部工作(因此受其支配)。
答案 1 :(得分:1)
这是可行的。 您需要分离资源:内存,计时器,IRQ等。这样,&#34; Host&#34;操作系统(FreeRTOS)甚至不知道&#34;知道&#34;关于&#34; Guest&#34; OS(Nuttx)。
对于Cortex-A8,您可能希望将IRQ用于FreeRTOS,将FIQ用于GuestOS。它会让你不要重写IRQ控制器(但是再次确保HostOS在GuestOS启动后不控制FIQ。)
上下文切换可能需要进行一些更改:您需要区别主机 - 主机上下文切换,Host-Guest(和Guest-Host)和Guest-Guest上下文切换。
答案 2 :(得分:1)
虽然不直接回答你的问题,但是在设计层面解决这个问题,分离依赖硬件的代码(创建API)并使应用程序级代码独立于底层操作系统或运行时,即依赖于特定的实现让它取决于API。
需要将硬件(OS)相关代码移植到底层OS /运行时