如前所述,SKH有两种不同的虚拟化技术实现方式。首先看基于分离内核的实现方式。
因为SKH行为上类似于传统的基于RTOS扩展的Hypervisor,所以这两者经常被混淆。比如许多由GPOS和RTOS经过扩展而来的Hypervisor也被描述成Ⅰ型Hypervisor或者裸机Hypervisor。但这类Hypervisor本质上都是被托管的Hypervisor(Hosted Hypervisor),即Ⅱ型Hypervisor。换句话说,即使宿主操作系统是一个小型的RTOS,但它仍然是操作系统。而SKH是一个真正无托管的裸机Hypervisor实现。SKH不承担辅助RTOS的功能,即使这些功能很简单。之所以这样做,并不是因为这类辅助功能实现的大小问题,而是没有这些功能SKH的内核会更干净、安全,并且与RTOS无关。
基于RTOS扩展的Hypervisor实现是指在传统操作系统的基础上添加虚拟化功能,以支持多个虚拟机的运行。该设计模式的优点包括更好的兼容性和更高的灵活性,可以根据应用需求动态地分配和管理资源。
在传统的PC Hypervisor架构中,几乎所有的Hypervisor都遵循集中式开放架构,包括裸机Hypervisor(即Ⅰ型Hypervisor,比如Xen)、被托管的Hypervisor(即Ⅱ型Hypervisor,比如VMware Workstation)。由于Hypervisor围绕拥有硬件资源并管理分区的中央“主操作系统”(GPOS或者RTOS)构建,因此它们是集中式的;同时也是开放的,因为它们能在分区中托管任何操作系统。很多Hypervisor都是由RTOS扩展而来的,比如应用在航电领域的VxWorks653 Hypervisor是由VxWorks-5.5系统扩展而来的。使用这类Hypervisor通常意味着用户必须采用供应商裁剪定制的RTOS,即使所有的客户操作系统都是完全开源的。这样做通常有以下3个原因。
1)它使得Hypervisor可以利用供应商现有的RTOS BSP(Board Support Package,板级支持包),降低了BSP的开发成本。
2)从拥有所有CPU资源、内存和外围设备的RTOS内核上创建Hypervisor要比重新设计并实现分离内核的Hypervisor容易得多。
3)供应商RTOS工具链(IDE和编译器)通常与Hypervisor打包在一块,便于销售供应商的产品。
基于RTOS扩展的Hypervisor的实现代码更多。它通常包含设备驱动程序、动态内存分配和shell访问,以访问用于创建、查看和启动分区的命令解析器。RTOS将在内核同时调度系统任务和分区任务,同时RTOS内核可能还具有虚拟终端,以便访问分区客户虚拟控制台、虚拟网络服务,并允许分区共享物理网络接口。但是这类代码通常具有安全性问题(比如可能存在缓冲区溢出漏洞),这在SKH实现中是不可接受的。
基于分离内核的Hypervisor和基于RTOS扩展的Hypervisor唯一的通用代码是配置分区的代码。在基于分离内核的Hypervisor实现中,配置分区的代码是引导过程完成的。出于安全性考虑,配置分区的代码不放在SKH内核当中,这就是分离内核的分区资源是静态配置的,一旦启动完成后就不可以更改的原因。
在基于RTOS扩展的Hypervisor中,所有这些额外代码都代表着安全风险的攻击面。处在特权模式下的Hypervisor内核代码一旦出错,将具有破坏整个系统的风险。另外,Hypervisor代码量比较大,已通过形式化证明保证其正确性极具挑战。虽然这些额外代码很有价值,并且提供了有用的功能,但是根据极小化设计原则,这类功能子系统不能处于Hypervisor之中,而应放到客户分区中实现。这种在分离内核中仅包含最少代码的方法遵循了最小特权原则(Principle of Least Privilege)。操作系统微内核的设计也遵循相同的设计模式,即将辅助性组件从内核空间放到用户空间中实现。
提示: 虽然在许多方面,SKH和微内核(Micro-Kernel)非常相似,两者都有最少的代码量,并且都支持最小特权原则的体系结构。然而,这两种技术的实现目标是不同的,因此两者的最小特权运行时体系结构的构建方式也不同。
微内核的目标是提供一个比宏内核(Monolithic-Kernel)的操作系统(比如Linux)更安全的运行时环境,而分离内核Hypervisor的目标则有所不同,因为它不是一个操作系统。SKH不进行集中的系统控制,它将本地硬件资源映射到分区空间,提供给分区客户操作系统使用,并由客户操作系统为应用程序提供运行时环境。微内核操作系统需要大量的IPC(Inter-Process Communication,进程间通信),安全性不容易评估,并且应用程序之间的隔离薄弱;而SKH提供了系统资源配置模型,该模型将所有执行上下文的运行时环境约束在一组显式的物理资源防篡改的分区环境中,使得SKH内核的安全性更容易评估。另外,微内核操作系统是一个主操作系统,而SKH是一种分布式的同构框架,没有主操作系统的存在;SKH提供的多分区运行时环境可以组合并协同工作,并且SKH内核通常也是采用单体式实现的。
分离内核促进了分布式开放架构。之所以说它是分布式的,是因为没有一个主RTOS拥有所有的硬件资源。换句话说,没有一个“流量管理”RTOS,使得系统中的其他软件必须通过这个RTOS的API请求CPU时间、内存和I/O设备。相反,分离内核是一组处理程序状态机,它将真实的CPU核心、内存和设备的一个子集封装在一个分区中提供给客户操作系统使用。
由于分离内核是分布式的,从某种程度上主RTOS已经被消除了,因此原本由主RTOS提供的服务被分发到各个分区中。分离内核允许多个RTOS进行组合,以满足成本、安全性、兼容性、确定性、重用性等项目要求。一个分区中的裸机程序可以运行一个严密的实时控制循环,并获得高度安全保障。其他的开源模块可以移植到分区中,并在其他裸机分区中得到重用,同时可以托管多个开源RTOS,比如μC/OS-Ⅱ或者FreeRTOS。此类操作系统的任意组合都可以整合到系统当中,从而避免选择单个主RTOS。相比只用一个RTOS,采用分离内核的解决方案后,用户的选择会更加丰富:一方面,我们可以使用COTS(Commercial Off-The-Shelf,商用现成品) 三软件模块;另一方面,我们可以在分区中运行虚拟化的Linux内核,借助Linux完成设备虚拟化,实现应用软件的快速部署。
通过分离内核的分区来开发辅助软件模块,开发者可以突破操作系统的限制,而不必局限在某个RTOS上进行模块化设计。分离内核定义了分区可以访问哪些内存区域,哪些内存区域是只读的,哪些是可读/写的,以及哪些内存区域可以与其他分区共享。该定义是由分离内核在特权Hypervisor模式下经过MMU配置的,并且不能被分区更改或者绕过。串行端口、网络接口、图形和存储设备之类的外围设备也被分配给分区,并且分离内核使用硬件(通过对中断控制器和IOMMU(Input/Output Memory Management Umt,输入/输出内存管理单元)进行编程)来强制进行访问。通过这种方式来构建高度模块化的软件系统体系结构,这就是MOSA的初衷。