鸿蒙这个系统最早可以追溯到2012年,当时华为刚刚跟思科打完官司,吃了一堑,所以华为内部储备了两个备份,硬件是海思,软件就是鸿蒙。当然那个时候还不叫鸿蒙这个名字,以后万一又被别人断了供应链,自己就还有一个备胎。那后面的事情大家都知道了,2019年美国制裁,这个备胎就转正,华为OS就开始正式被推上前台。
鸿蒙出现至今,最大的争议就在于它和Linux和安卓的关系,它到底是不是套壳?在鸿蒙4.0之前,鸿蒙的内核一直是基于linux,初期为了推广才兼容安卓的app。兼容安卓符合短期利益,但不符合长期战略。为什么会这样?关键是内核变了,安卓是宏内核,而鸿蒙是微内核。从鸿蒙next也就是鸿蒙5发布之后,系统内核正式转为鸿蒙kernel,无论从表象还是内在就彻头彻尾的是一个独立的系统,分水岭就在于这一次内核的转换。
内核是一个什么东西呢?给大家形象的做一个比喻,操作系统就象是我们人和硬件之间的一座桥,桥这头是跟我们人打交道的,我们管它叫用户空间。我们平时用的各种应用象浏览器、播放器、游戏,都是跑在用户空间里的。那用户空间里的进程,如果想要去动桥对面的硬件,它是不可以直接下手的。它必须先把请求划到对面,再由系统内核来代劳。象CPU调度、内存管理、硬盘读写这些东西属于是高权限操作,不可以瞎搞,所以桥这头属于是操作系统的核心地带,只有系统自己才可以进出,那这部分就被称为内核空间。
在现代操作系统里,内核一般都是一个超级复杂的庞然大物。比如Linux,它的内核里面就包含了进程调度、内存管理、文件系统,还有五花八门的硬件驱动等等。把所有的核心功能全都塞进内核,它们就可以共享同一个地址空间,互相可以直接调用非常高效。象这种功能紧密耦合的设计就叫做宏内核,目前大部分的主流操作系统都是这种宏内核的设计。而鸿蒙用的是另一种思路叫做微内核,我们不要把什么东西都往内核里面塞,只保留最基础最核心的部分,象鸿蒙内核空间只有4个东西,线程调度器、定时器驱动、串口和访问控制能力。而其它的一些模块,象文件系统、硬件驱动、网络服务通通都搬到了用户空间里面。
为什么这么做呢?这就要说到鸿蒙的核心战略,从顶层设计上看,鸿蒙的目标是万物互联,用一套系统跑遍所有终端。在鸿蒙设备里,性能的差异是非常巨大的,高性能设备如手机、电脑,低性能低功耗的呢,如智能家居、穿戴设备等等。如果大家都用宏内核,对很多设备来说都是非常浪费的。一个智能门锁你要什么文件管理?一个手环你也不需要视频解码吧!所以华为需要的其实是一个可伸可缩、可长可短的东西。我们先用这四个模块组成一个最小系统,然后想做什么功能,把积木往上搭就可以了。想智能门锁,我们就加一个蓝牙加个指纹,然后串口控制下电机,这就OK了。手表就稍微复杂一点,蓝牙、Wifi、传感器,然后音频解码、UI渲染,然后简单的文件管理就差不多了。象手机、平板就是完全体,所有功能全部都怼上去。
鸿蒙选用微内核架构,首先解决的是不同设备的可扩展和可裁剪的问题。除此之外,它还有一个优点就是移植成本,鸿蒙设备家族品类非常的多,它必然要面对异构部署的问题。象手机手表这种个人终端,目前是以arm架构为主,但是象IoT设备或者是工业设备,那架构就是五花八门了,x86、RISC-V、MIPS可能都会有。如果用宏内核,CPU架构一换,重写内核这个工作量就是老大了。但是微内核就相对简单一点,所以微内核的优势是把各个功能模块解耦来提高稳定性、灵活性,降低移植成本。但是,它也失去了宏内核一个最大的优势:效率。
宏内核架构就好象是一家大公司,所有的业务部门都在同一个办公室里上班,需要沟通的时候喊一嗓子就可以了。但是微内核这间办公室里面只留了CEO、财务这些核心部门,其它业务全部都外包出去了。想干点什么事得先写成邮件,然后在各个分公司之间来回的发,那这个动作就叫做IPC跨进程通信。IPC所带来的开销是微内核架构最大的性能短板,我们拿播音乐来举例,如果是宏内核播音乐,这个请求到了内核之后,内核首先会验证一次权限,然后调用文件管理模块,把音乐文件读出来交到音频解码模块,CPU解码完成后推给声卡驱动,这个音乐就播出来了。整个过程中,所有的工作全都在内核空间完成,这个时间开销一般是纳秒级的。可是在微内核里,因为文件管理、音频解码、声卡驱动这三名员工被挪到了用户空间,所以内核收到请求之后,需要先把请求写成邮件,转交到文件管理,文件读出来之后再写成邮件转交到音频解码服务,当最后数据到达声卡被播放出来的时候,它已经经过了三次IPC。而其中每次IPC都要做一次地址空间切换,且都需要验证权限,这些开销加起来就是微秒级的了。
如果设备不复杂,比如说一个简单的传感器,我只要偶尔向处理器汇报一次数据,这种场景IPC的开销它是可以忽略的。但是象手机、平板这种高性能的复杂设备,系统调用频率一秒钟可能就是几万次,象应用启动、UI渲染、后台服务、网络收发,这些看似简单的动作背后其实都是跨服务的调用,虽然每次只慢一点点,但是叠加起来这些开销就会被迅速的放大。怎么办?这里鸿蒙主要做了两件事情,第一你不是IPC多吗,那我们就想办法减少IPC的频率,让应用跟服务尽量少走这道门;第二当我们必须走这道门的时候,想办法让这扇门开关的更快。比如手机,文件系统和内存管理这两个部门每天都要高频的配合,在性能优先的场景,鸿蒙可以先把这两个部分临时给并成一家,这样不就降低了IPC开销吗?而到了安全优先的场景,比如支付场景,这两个部分如果再放在一起,哪边要是被攻破了,另外一头也要失守。所以这个场景下,鸿蒙又会把他们拆开以隔离敏感数据。在鸿蒙内核设计里,各个模块的隔离是可以动态调整,需要性能的时候降低隔离、减少IPC、提高效率。而需要稳定的时候,提高隔离用效率来换取安全。
鸿蒙对IPC的第二个优化是对权限机制的简化,还记得刚刚播音乐的例子吧,发送IPC的时候,每经过一个模块都要回到内核来验证一次权限,这会带来大量的重复。而在鸿蒙的机制中,我们一旦向某个服务给出权限,那在有效期内服务就可以直接操作资源,不用每次都绕回来验票。
从鸿蒙4到鸿蒙next并不是一次常规的升级,而是一次地基的改变。在鸿蒙4的时代,虽然华为已经有了自家的分布式特性和系统框架,但是系统的内核层依然是基于LSP的Linux宏内核,大家对它套壳的质疑也正来源于此。从鸿蒙5.0起,内核彻底换成鸿蒙kernel之后,从底层基础到上层建筑就完全是新的设计了。
鸿蒙体系对于消费者来说,最显著也最重要的吸引力当属业界独一份的多设备协同能力,华为给这个标志性的能力起了一个有点拗口的名字叫分布式软总线。它为什么是分布的,软又软在哪里?先从最后面的总线开始说起,总线它的英文跟公交车是同一个词bus,它是计算机不同设备之间公用的数据传输通道。比如最常见的USB,我们把鼠标、键盘、U盘插上去,其实就是把它们挂在了这条总线下面,让它们和主机来通信。而总线指的不仅仅是这几根物理上的线,它还自带了一整套通信规则,象这么多设备谁先说话、谁后说话,两个人同时开口了怎么办?或者是说话没听清楚怎么办?甚至大家要用多快的语速来聊天。有了规则之后,不同的设备就可以在同一条总线上井井有条的对话了。
USB总线上挂载的是一个个实体的物理设备,而软总线之所以叫软,是因为它上面挂载的是被抽象出来的能力。比如摄像头就会被抽象成拍照能力,屏幕就会被抽象成显示能力,每个设备上线的时候它都会向这条总线广播自己的能力列表,我叫什么、名字、我能做什么。如果总线上有其它的设备对他感兴趣,又给它单独的单播一个自己的能力列表,两边完成握手之后,这些能力就可以相互调用了。电脑可以调用手机的摄像头来拍照,手机可以用电视的屏幕来看电影。鸿蒙生态内的所有应用跨设备流转,从底层看都是依赖这条软总线来做能力的调节。
微内核的核心思路是把一个个的功能模块解耦拆分,并且通过IPC来调用。而分布式软总线则是把本地的IPC机制扩展成跨设备的IPC,把摄像服务、麦克风服务这些具体的实现,抽象成对外可调用的能力接口。这样一来,微内核负责把能力拆出来,软总线负责把能力串起来。这套机制鸿蒙就可以利用微内核高度解耦、能力独立的优势,实现多设备稳定高效的互联互通。鸿蒙的最终图形并不是要让你更快的打开个APP,而是要让所有的设备可以象一台设备一样协作运转。
别忘了华为是一家通信公司,它是ICT基础设施提供方。消费者容易感知到的是那些看得见、摸得着的、印着菊花logo的手机跟手表,但是华为的真正价值并不在某台终端本身,而是在终端和终端之间的连接。连接越多、越稳定、越高效,华为的价值就越大。未来各种不同的设备都跑在同一套系统上,且能力互相共享,为了实现这个目标,华为弃用了宏内核,另起炉灶拆分服务搭建软总线,让系统可以象拼积木一样伸缩组合,让开发者只需要一次开发就可以多端部署,让信息和能力在设备之间无缝的流转。
没有一个宏伟蓝图是不需要代价的,一个操作系统背后伴生的是庞大的生态链,是成千上万的设备适配,是无数的第三方开发者的迁移,是年复一年的技术维护,而这些都要吞噬掉巨量的社会生产力。我们做任何事情是要考虑成本的,我们说一个东西好,可能不一定是它真的有多好,而是它值啊!一个系统能不能生存下去,不能只看工程和架构是否先进,也要看市场和生态的生命力,因为理念超前、技术先进,但是最后在市场上折戟沉沙的前辈历史上并不少见。