我计划运行一个实时操作系统,例如Nuttx,作为另一个实时操作系统例如FreeRTOS的一个进程,这样自由实时操作系统任务和作为自由实时操作系统任务运行的Nuttx将共存。
鉴于底层硬件是ARM cortex A8单核处理器,这是可行的实现吗?如果实施不是基于VM概念,需要做哪些更改?
发布于 2015-06-02 18:24:03
简而言之,您的需求是允许来宾RTOS完全在底层主机RTOS的范围内工作。第一个答案是使用虚拟化扩展,但A8处理器没有,因此将排除此选项。如果没有虚拟化扩展,您必须求助于以下方法之一,并且需要大量代码更改。
选项1-移植来宾操作系统应用编程接口的
获取所有来宾操作系统的API并替换它们的实现,以便它通过利用主机操作系统的API来模仿所需的API行为。从技术上讲,现在您的来宾操作系统将没有调度程序,而将缩减为主机操作系统之上的一个端口层。当公司需要他们的软件解决方案在多个RTOS上工作时,他们会使用这种方法。他们会基于一个RTOS来编写他们的软件解决方案。当客户要求在他们的RTOS上运行软件时,他们会简单地将RTOS API实现移植到客户的RTOS上。
选项2-半虚拟化
来宾RTOS用户和内核空间都应该在宿主RTOS的用户空间内工作。让我们把这个问题分成几个部分。
处理特权指令的
当您的来宾操作系统在“内核模式”下执行时,尝试执行特权指令时,将导致undef指令中止。您必须修改主机内核的undef指令中止处理程序,以捕获/拦截这些指令并对其执行操作。每一条特权指令都必须被捕获/拦截和“模拟”。有一些指令不会陷入陷阱,但需要通过修改代码来处理。例如:如果您的内核代码读取CPSR以确认执行模式,则CPSR将显示该模式为用户模式。(此指令不会导致指令中止,因此您不能遵循陷阱和模拟模型。唯一的方法是在您的客户操作系统代码库中识别、搜索和替换这些指令。)
内存管理单元
如果发生特权冲突,数据中止将被触发到您的主机操作系统。必须将其转发到您的来宾操作系统。
中断
您必须使用虚拟SVC调用替换来宾操作系统的中断控制器驱动程序,这些调用将调用您的主机操作系统来设置中断。
计时器
在运行主机操作系统任务时,您必须修改来宾计时器驱动程序,以解决“丢失的”计时器。
硬件驱动程序
必须修改来宾操作系统使用的所有其他硬件驱动程序,以允许来宾和主机之间的设备共享。
调度程序
您的来宾操作系统调度器现在可以在另一个调度器(主机操作系统调度器)中工作(因此受其支配)。
发布于 2015-06-12 19:36:24
这是可行的。你需要分离资源:内存、定时器、IRQ等,这样“主机”操作系统(FreeRTOS)甚至不会“知道”“来宾”操作系统(Nuttx)所使用的资源。
对于Cortex-A8,您可能希望对FreeRTOS使用IRQ,对GuestOS使用FIQ。它将允许您不重写IRQ控制器(但同样,确保主机在GuestOS启动后不控制FIQ )。
上下文切换可能需要一些更改:您需要不同于主机-主机上下文切换、主机-访客(和访客-主机)和访客-访客上下文切换。
发布于 2017-01-30 21:53:53
虽然不是直接回答你的问题,但在设计层解决这个问题,分离依赖于硬件的代码(创建API),使应用程序层代码独立于底层操作系统或运行时,即依赖于特定的实现,让它依赖于API。
无论何时需要,都可以将依赖于硬件(OS)的代码移植到底层操作系统/运行时
https://stackoverflow.com/questions/30572084
复制相似问题