一、概述
本文以物联网操作系统面临的碎片化问题为主题,从CPU、外设、组件与接口四个方面出发,阐述物联网操作系统面临的挑战以及一些设计理念。以总分1.0进行度量,我认为整个物联网系统的碎片化指数如下:
从根源上来说,物联网系统的碎片化来自应用需求。这些需求的维度包括:成本、功能、性能、启动速度、功耗、实时性、安全性等等,甚至还包括编程语言与接口。有些需求是相互冲突的,比如成本低与功能强。因此我把应用的碎片化指数定义为最高的1.0。
形形色色的物联网应用需求无法用单一硬件架构满足,这导致了底层硬件的碎片化。其中尤以外设最为严重,我认为它的碎片化指数为0.9。通过操作系统的抽象与封装,在一定程度上可以降低硬件碎片化带来的影响,比如,CPU种类繁多,但经软件封装后可以提供较为一致的接口,所以上图中CPU核的碎片化指数为0.4,但CPU抽象层的碎片指数只有0.2。
为了满足应用在不同维度上的需求,物联网操作系统从接口到组件到内核都出现了较为严重的碎片化。同时,操作系统自身版本的演进也进一步带来了碎片化,不同的用户可能在使用不同的版本,甚至有的用户还在按自己的需求独立演进。
本文也将对比PC硬件平台/桌面操作系统,分析它们在面对碎片化问题时采取的策略。
二、CPU与操作系统内核
2.1 CPU的碎片化分析
市场上存在五花八门的CPU,它们各具特色。CPU通过数字电路实现,实现的依据是CPU的架构设计文档,主要是指令集架构(ISA,Instruction Set Architecture),分为两种:
(1)精简指令集(RISC ,Reduced Instruction Set Computing)。它只提供最基本的指令,通过组合多条指令实现复杂功能。该架构的CPU实现简单,功耗低。
(2)复杂指令集(CISC,Complex Instruction Set Computer),提供尽可能强大的指令。该架构的CPU实现复杂,性能高、功耗也高。
在物联网领域绝大部分都使用精简指令集架构的CPU,比如ARM、MIPS、RISC-V、CSKY,且ARM架构处于绝对垄断低位。同时,在IP核授权的产业合作模式下,一种CPU架构被应用到大量种类的物联网芯片上。
每种CPU架构都主要包含如下三个部分:
(1)指令集与寄存器。指令集包含了跳转、运算、位操作等指令,不同的架构提供了不同的指令。同时为了减少指令占用的内存空间,一些CPU架构设计了更紧凑的指令,比如ARM的thumb指令,RISC-V的压缩指令。精简指令集架构的一个显著特点是,CPU只能操作寄存器中的数据,不能直接操作内存中的数据。它提供了load和store指令,用于从内存加载数据到寄存器或把寄存器数据写到内存,即所谓的load/store架构。相比复杂指令集CPU,精简指令集CPU的寄存器个数更多,通常为16个或32个。
(2)异常与中断。异常是由指令触发的同步事件,包括无效指令、访问非法地址、系统调用等。中断由外设触发,用于处理异步事件。精简指令集架构的CPU通常把中断看作异步异常,中断和异常按相同的流程处理。CPU架构的异常与中断部分包括异常向量表、异常使能与禁用、异常进入与返回、优先级配置等。
(3)浮点。硬件提供的浮点计算能力相比用软件实现效率更高。CPU架构的浮点部分包括浮点指令、浮点通用寄存器、浮点控制寄存器等。
虽然物联网芯片基本上都使用精简指令集架构的CPU,但每种架构都有自己的指令编码、寻址方式、异常流程,有自己特有的状态寄存器、控制寄存器,也设计了特有的ABI规范。如果开发者需要面对这些繁杂的细节,不仅开发门槛大大提高,开发的周期也会拉长。C/C++语言及其编译器已经从语言级别实现了一层抽象,但这显然还不够。
2.2 CPU抽象层与内核
CPU在运行时先从内存读取一条指令,然后解析指令并执行相应的操作。这个过程以指令为单位不断重复。当中断发生时,跳转到中断入口处,处理完中断后再返回被中断打断的位置。也就是说,从CPU核的角度看,只存在两条执行流:一条是主执行流,一条是中断执行流,且两者分时运行。
传统上的裸机编程就是按CPU的这种运行特点来的,整个应用程序主