微内核架构
1 说明背景
关于宏内核、微内核、混合内核,都是相对而言的概念。
- 宏内核: 通用的操作系统,将操作系统内核的所有模块放置在内核态运行,具备直接操作硬件的能力。例如 UNIX/Linux, FreeBSD 等
- 微内核: 简单的操作系统,将单个功能或模块从宏内核中解耦放置到用户态运行,内核态保留核心的 IPC 功能。例如 Harmony/Mach/QNX/MINIX/L4/seL4/Zircon 等
- 混合内核: 宏内核和微内核混合的内核。例如 Windows/Macos/RT-thread Smart 等
2 微内核架构
2.1 基本信息
- 设计: 最小化、模块化、可扩展性、确定性、安全性
- 机制: Basic IPC、Virtual Memory、Scheduing
- 优点: 灵活、移植、可靠、安全
- 缺点: 性能较差、生态缺陷
- 应用: 弹性扩展能力、硬件异构性、功能安全、信息安全、确定性时延
- 系统: L4、MINIX、seL4、Zircon 等
2.2 IPC 模型
seL4 系统的 IPC 模型实现机制: send process、endpoint、recv process
- 寄存器传递: 通过栈和寄存器
- 数据流通过 seL4_send - sendIPC - register - recvIPC - seL4_recv
- 控制流通过 seL4_send - sendIPC - wake - scheduler - wake - recvIPC - seL4_recv
- 共享内存传递: 通过共享内存
- 数据流通过 seL4_send - sendIPC - endpoint - recvIPC - seL4_recv
- 控制流通过 seL4_send - sendIPC - wake - scheduler - wake - recvIPC - seL4_recv
2.2 IPC 优化
- FastPath: 用户态调用到内核态,原先线程唤醒的环节需要通过调度器,该优化让线程在内核态不经过调度器切换到目标线程的上下文。
- SkyBridge: 原先不同进程间通信需要进出内核态,该优化让进程直接在用户态调用另一个进程的代码段。
3 收集问答
QA001: 微内核需要体系结构的特殊支持吗?
HINZER:微内核是一个OS,需要体系结构的特殊支持吗?比如,它能在 X86 上运行吗?它能在 ARM 上运行吗?它能在 RISC-V 上运行吗?
ChatGPT:微内核是一种操作系统架构,它将系统内核设计为最小化,并将更多的功能转移到用户空间中的服务进程上。在这种架构下,微内核本身并不需要特定的体系结构支持,它可以在多种不同的体系结构上运行,包括 x86、ARM 和 RISC-V 等。
QA002: 微内核的设计原则一般有哪些?
HINZER:微内核的设计原则一般有哪些?
ChatGPT:
- 最小化:微内核本身应该尽可能小,只包含最基础的功能,其他功能应该转移到用户空间中的服务进程中实现。
- 模块化:微内核的各个部分应该分离,以便于更方便的维护和扩展。
- 可扩展性:微内核应该具有良好的可扩展性,以便于满足不同用户的需求。
- 确定性:微内核的执行应该具有可预测性,以便于更好地控制系统的安全性和性能。
- 安全性:微内核应该具有良好的安全性,以便于保护系统免受恶意攻击。
QA003: 微内核的通用实现机制有哪些?
HINZER:微内核 seL4 的实现机制有哪些?
ChatGPT:seL4 是一个微内核,它的实现主要基于两种机制:类型安全性和内存保护。类型安全性意味着系统只允许在编译时执行的操作,并且内存保护机制确保每个程序只能访问其被授权的内存区域。这两种机制的结合使 seL4 成为一个高度安全和可信的微内核。
QA004: 微内核系统中用户层能管理硬件吗?
HINZER:微内核似乎是将宏内核中子系统和驱动程序的实现放到用户层实现,这意味用户层的进程直接管理硬件吗?如果这样做,如何保证安全的呢?
ChatGPT:微内核架构提倡将内核中的部分子系统和驱动程序的实现移到用户空间来执行。这种做法的目的是为了让内核的代码尽可能的小,从而使内核更容易维护和开发。用户空间的进程可以直接管理硬件资源,但是需要通过一定的机制来保证安全。例如,用户空间的进程可以通过系统调用来请求内核对硬件资源进行管理,内核会在满足一定的安全条件后才会执行该请求。这样可以防止用户空间的进程绕过安全机制来不当地访问硬件资源。
QA005: 有哪些服务必须要在内核层实现,为什么呢?
HINZER:微内核有哪些服务必须要在内核层实现,为什么呢?
ChatGPT:微内核的服务通常需要在内核层实现,因为它们是系统的核心功能,对于系统的安全和可靠性至关重要。例如,内存管理、进程管理、设备驱动程序和网络协议栈通常都是由内核实现的。这些服务在用户空间中实现可能会导致安全漏洞或系统故障,因此必须在内核层进行实现。
QA006: 绕过内核,还有其他什么较好的方式?
HINZER:微内核的ipc问题可以采用栈和寄存器传递参数和上下文给对方,绕过内核,还有其他什么较好的方式?
ChatGPT:还有一种常见的方法是通过内存映射来传递参数和上下文。在这种情况下,发送方将所有需要传递的信息拷贝到一个共享的内存区域,然后告诉接收方该内存区域的地址。接收方通过将该内存区域映射到它的地址空间来访问信息。这种方法可以在系统调用期间避免使用栈和寄存器,从而减少上下文切换的次数,提高系统性能。
QA007: ISR 有什么好的优化方式或者设计方式?
HINZER:微内核的ISR有什么好的优化方式或者设计方式?
ChatGPT:一种常见的优化方式是采用分时多任务的方式来实现 ISR。在这种情况下,内核会为每个 ISR 分配一个独立的任务,并在中断触发时启动该任务进行处理。这种方法可以让 ISR 在不影响其他任务的情况下运行,提高系统的实时性。另一种常见的优化方式是采用预先分配内存的方式来管理 ISR 中的数据。在这种情况下,内核会为每个 ISR 预先分配一块内存,在 ISR 触发时直接使用该内存来存储数据,避免在 ISR 运行时申请内存带来的性能损耗。
QA008: 微内核可以结合虚拟化技术吗?
HINZER:微内核结合虚拟化技术有什么用呢?
ChatGPT:微内核可以结合虚拟化技术来实现虚拟机。在这种情况下,微内核会作为虚拟机管理程序的一部分,负责管理虚拟机之间的内存和设备资源,保证每个虚拟机只能访问其被授权的内存和设备。这种方式可以有效利用微内核的安全性和可信性特点,提高虚拟机的安全性和隔离性,使得多个虚拟机可以在同一台物理机上安全地运行。
QA009: 混合内核是否能同时发挥微内核/宏内核的优点?
HINZER:采取混合内核是否能兼顾二者的优点?或者基于微内核兼顾宏内核,是否能同时发挥二者的优点?
ChatGPT:采用混合内核的方式可以在一定程度上兼顾二者的优点,但也存在一些局限性。混合内核通常是将宏内核的部分功能和微内核的部分功能结合起来,形成一种新的内核架构。这种架构可以在一定程度上兼顾宏内核的性能和微内核的安全性,但它也会增加内核的复杂度和代码量,导致更多的安全隐患和系统故障。因此,在实际应用中,需要权衡二者的优缺点,选择最适合的内核架构方案。
QA010: 是否可以根据不同场景构建相应的通信原则?
HINZER:微内核为人诟病的性能问题,是否可以根据不同场景构建相应的通信原则?
ChatGPT:微内核的性能问题主要是由于其内核与用户空间之间的频繁通信所造成的。为了解决这个问题,可以根据不同场景构建相应的通信原则,以减少内核与用户空间之间的通信频率。例如,在系统调用过程中,可以通过内存映射的方式传递参数和上下文,避免使用栈和寄存器,减少内核与用户空间之间的切换。此外,在 ISR 的处理过程中,可以采用预先分配内存的方式,避免在 ISR 运行时申请内存,降低内核与用户空间之间的通信频率。通过这些措施,可以有效提高微内核的性能。
References
- 微内核IPC性能浅析 | 阅码场
- 微内核十问 | 阅码场
- 《现代操作系统:原理与实现》