链接:https://www.zhihu.com/question/339567108/answer/782431141
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
不请自来,怒答一波。
希望我可以带大家认识一个不同的鸿蒙OS。关于微内核,这个东西一直是学界的宠儿,并不是业界的宠儿。 以应用为代表的Linux之父从技术的角度狂喷微内核。
LUPA开源社区|开源资讯门户网站微内核经过好几代发展, 发展到seL4,这个L4厉害了。它是人类历史上第一个用形式化证明的操作系统[1]。
简单点说,用数学方法从逻辑的角度证明这个操作系统是 Bug Free的,是没有 Bug的。 为什么Linux不可以呢?哈哈,很简单,内核太复杂了。没有办法证明,超出人类人力所及范围。正所谓成也萧何,败也萧何。 微内核的简单,成就了它的高安全。但是……
核心只保留基本的资源管理:处理器的时间、内存、通讯、中断等。所有其他功能统统都扔给应用层管理,以服务的形式去提供功能。服务之间采用IPC通讯,即进程间通讯。对比一下seL4的架构图和Linux的架构图,不难发现,Linux这种宏内核是啥都有,seL4的东西好像都被排在用户空间里。也正因为这个原因,seL4的核心非常小,不到9000行C代码。两种内核各有好处。
L4系统的架构。
Linux的宏内核架构
对于微内核,由于用MMU(内存管理单元)对进程空间(内存区域)做了隔离保护,没有授权的进程是无法访问其他进程的空间。这就阻止了恶意程序对其他进程数据的窃取。进程是一个操作系统的抽象概念,简单的说:每个进程运行一段用户编写的代码,从这个代码看过去,它好像拥有自己的CPU和所有的一切资源(内存、设备等)。当然我们都知道,这是操作系统给它造成的假象。当进程需要额外的资源时,得向操作系统申请。和别的进程通讯,也得和操作系统申请。哈哈,看起来有点啰嗦,实际上比看起来还啰嗦。但好处是不言而喻的,没权限,你啥都别想干。想干坏事,好!把你的资源全部收回。大家脑补一下,想想用Windows Ctrl+Alt+del,杀掉没有响应的程序。 Linux下的 Kill -9 了解一下。
微内核连驱动都可能是进程的,也就说,只是内核不可以重启,其他的组件统统可以重启。看得激动人心,但实际上它是最后防线,实践中用不到。系统不可能带着有重启Bug的驱动跑,这不会造成系统奔溃,但用户可不买账。对于写驱动的程序员是个好消息,至少不太容易把内核搞死 :-),可反复调试找问题。
在微内核的管理下,用户进程要存储个东西,必须请求内核,内核把数据丢给文件系统的进程处理。因为这个MMU封锁太严格了,早期的办法,只得把数据从用户进程搬到文件系统进程。这个过程非常耗时,不幸的是,还没什么好办法突破MMU的保护。这是导致了微内核性能低下的主要原因。
CPU不支持微内核特性 -> 微内核承受着性能上的惩罚 -> 微内核不在主流的操作系统框架中 -> CPU们不会响应来自微内核的需求 -> CPU 不支持微内核特性
(一个恶性循环)
反观Linux这种内核,如果驱动不好,搞死内核的事情是常有的事。但因为文件系统都在内核里,内核是可以直接访问用户空间的数据的,相对来讲。Linux采用的是系统调用,非IPC的方法,速度较之IPC要快。那Linux下也有IPC,嘿嘿,不幸的是,IPC在Linux下,性能也不咋地。但Linux并不依赖IPC通讯,但微内核依赖。所以,这事给微内核就没处去说理去了。
因为IPC这个脚后跟没有泡过冥河的水,被Linux这种宏内核吊打。怎么办呢?学界一直没有闲着,想了很多办法。L4提出了一个Fast IPC的办法,只要你IPC通讯没数据,可以借用CPU核心寄存器的办法传递消息,速度大大加快。有一个牛人2017年想了dIPC, direct IPC[2]。用标签内存的办法进行隔离,传递数据,无需通过内核空间。大大加快了通讯速度。但标签内存这个玩意,不符合现在计算机体系的架构,实践中,采用的可能性较小。
下面牛人登场,
如何评价上海交通大学陈海波教授加入华为?上交的陈海波教授团队,19年想了两个办法进行IPC的加速。一个是XPC[3],一个是Skybridge[4]。传闻他是华为鸿蒙的核心人物。这两个方法XPC是硬件的,增加了一点点CPU硬件修改,使得IPC通讯无需内核的参与,也无需数据拷贝;Skybridge,采用双内核的办法,一个RootKernel,类似type-1的虚化,专门负责IPC数据通讯,上层的Kernel为微内核。这样IPC绕过了MMU 机制,也不会对微内核之上的MMU保护机制产生破坏。在IPC通讯的时候,无内核参与,无需拷贝。(知乎上有些朋友说这是共享内存的老技术,嗯,共享内存访问没有权限约束,会引入Time-Of-Check-To-Time-Of-Use, TOCTTOU 的问题,请脑补一下那些大小不一的自旋锁,知友有兴趣多看看相关的研究,谢谢。)
我们来看看Android的架构,Android因为采用了非常多的服务,非常依赖于IPC通讯,这不同于普通的应用。为了提高速度,开发了 IPC Binder Drivers 来加速 Linux下的IPC通讯。结果呢?效果还是不太满意。我们来看看XPC对Binder IPC的加速。也就是50多倍吧,哈哈。
17年的dIPC也是吊打Linux的 IPC。
SkyBridge应该和dIPC处于同一性能级别,略差。XPC要更高。从论文上看,SkyBridge更实用一些,未来XPC还依赖于硬件的革新。
目前市场上还是宏内核的天下,如Linux、Unix、Windows等,微内核商业上较为有名气的可算是QNX。好在巨头们都看到了微内核的进步,Google搞了Fuchsia OS (内核 Zircon),华为搞了 鸿蒙,苹果MAC和IOS也号称微内核,微软搞混合内核。一时间好不热闹。我个人坚信微内核是未来的方向,尤其是华为手握CPU的设计和操作系统的设计,想做个带硬件优化的高性能系统并非难事。此举会引领学界和产业界对微内核的一个小高潮。
微内核因为比较小,不到1万行C代码。只要处理器支持MMU,应该就可以跑出微内核的全特性。服务是可扩展的,依据不同的应用上不同的服务就好,有点像USB热拔插,现在电脑没有光驱、硬盘、打印机等,用USB扩呗。这也决定着,微内核可以在各种场景下见到它的身影。手机,上面弄个Android Binder,堆上相关的库就可以跑Android;服务器,上面弄个Type-2的虚化或者容器,就可以跑各种各样的服务。嵌入式,嗯,当然,体积不是问题,应用更不是问题。
华为这次的发力,真正的用一种操作系统内核统一了大多数应用场景。配上他们自家的开发工具,相信应该是很好用的。对于华为的开源,还有鸿蒙的未来发展,我持乐观态度,毕竟中国市场问题不大。活下来,发展起来,生态都只是时间问题。同时,推动微内核的发展,这个是一个开启新纪元的事。
-------------分割线---------------------
知乎小透明一个,谢谢大家支持。
文无第一,武无第二。操作系统领域也是。产业用什么往往并不代表那就是方向,要结合行业支撑发展和行业应用的发展看。紧跟时代潮流,我们错过两次工业革命,难道再错过第三次吗?
操作系统这个领域,是国人研究的弱项,为什么?
首先是这个领域是基础领域,已经被研究得太多了,没办法,研究的点很难找。想发一篇像样的论文毕业,太难太难,这也使得很多人不愿意选择这个领域;
其次,操作系统是一个工程性非常强的领域,你说那么多废话有啥用,来做个系统跑跑看?MMU的各种切换,内存的各种管理,各种调度算法,各种虚化……虽然可以用流程图画完,估计没几个能坚持下来,更不用说兑换成相应的代码了。算法不仅要正确,一堆工程细节,实现起来痛不欲生。调试异常困难。需要非常好的抽象和分析能力。
最后,企业们都知道,拿来主义好。早年用uC/OS-II,商业偷着用。后来改用FreeRTOS。做应用的企业都明白,操作系统不是最终产品,花那么多精力在底层上,是吃饱了撑得吗?所以,很少企业投入这块。加之国内的知识付费,软件付费的氛围,导致这块没有利润,就活不下来。
企业没需求,学生毕业没工作;学界需要论文,需要成果。大家都不愿意搞这个领域,其结果就是我们在这个领域的落后。
现在,鹅厂搞了一个物联网的OS,与FreeRTOS这种核心类似,主要目的也不是发展操作系统,而是推自家的云平台。阿里也是。不过,至少,这些大企业意识到,这种基础软件的支撑意义。
-------------分割线---------------------
大家都知道Linux。这个系统大都跑在有MMU的处理器上,(早年有uCLinux,现在Linux也可裁剪跑在无MMU的系统上。不过不是主流。),物联网就覆盖不到。怎么办?Linux基金会(谢谢知友指出错误)又搞了个 Zephyr,和 Linux 高低搭配,准备统治世界。
但是物联网的应用比手机到服务器的变化还要大,怎么去适配呢?各个公司都拿出自己的本事,如:RT-Thread,SylixOS。想把世界一口吃下,奈何市场并不买账。这里面有很多原因。但都做出了自己的尝试,取得了一些效果。
微内核是多少年人们对操作系统领域的总结,提炼。大家认识到,浓缩的一定要是精华。把操作系统内核最核心的功能提炼出来以后固定下来,上面的服务,那就一花一世界,一叶一菩提啦。这个好处就是,大家的根是一样的,通用。
Android是跑在Android Binder上的,下面是Linux还是Unix,什么x都不重要,重要的是提供的API的行为是一致的。 所以微内核是可以统一大部分软件系统的底层的。理论实践都没啥大问题。
微内核的确有一些性能上的瓶颈,但学界已经在努力,工业界已经开始在破冰。这都是好的迹象。且,像华为这样的企业,自己拥有CPU的设计能力,设计一个微内核的加速硬件模块,并不是难事,可以直接把微内核送上天。反正手机底层是封闭的。其他的领域,比如说车载、军事、服务器,有些地方都是超高可靠性的领域。非微内核不能。
可以看出来,华为真的是用心做事情,有一些大厂搭着仿制内核推自己的云就不说了。
关于鸿蒙的生态,我并不认为有多大问题。
首先选择不选择一个生态,开发者主要还是看未来和当下。华为手机市场占有率摆在那里,Android上的应用都能被复用到鸿蒙上,用不用在手机上只是一个核心而已。当然Linux的应用也可以跑在鸿蒙上。参考Linux下的 WINE,可以把windows下的应用程序跑在Linux下。幸亏Windows没开源,开源的话,Linux + WINE 真的扫平家用电脑了。鸿蒙是可以复用其他生态发展自己的。国内缺大旗。当下、未来都没啥大障碍。
其次,好用的工具链,让生态发展起来增色不少。发展生态这个,要学毛主席的抗日统一民族战线,团结可以团结的一切力量。好用的工具链让稍微受过专业训练的人都可以来开发,支持更高级别的语言,不要陷入无谓的工程细节。
最后,华为的管理者们也有意识地去推广鸿蒙,很大的格局去做这个事,撒了很多钱给开发者开发上面的应用。
多管齐下,发展不会不好,相信华为领导深谙此道,别问我怎么知道的。人力牛叉的公司,发展一定不差!
---------2019.8.12.更新-------------------
知乎小透明,再次感谢大家。
仔细爬了下留言,借着午休做个澄清。
1.我们这里谈得是微内核,有位知友说的非常好,操作系统 ≠ 内核。是的,完全两个概念。内核相当于操作系统的发动机。生态这个概念之于内核还是有点大了,内核普通用户是感受不到的。复用生态是内核的工作之一,复用了,可以让生态快速起来,避免不应期。
有知友说iOS的生态问题,我觉得没太大说服力,苹果的生态建立的时候,身边没有成熟的手机生态。微软在自己身边俩大 Android、iOS 生态发展起来的时候,搞了操作系统没引入Android生态。不兼容生态的后果大家看到了。世界容不下第三个生态了。
2.有一些知友和我讨论专业问题,首先谢谢信任。不过 Talk is cheap,一些概念问题学界也有争议,我建议不要深入讨论,没有必要也没有结果。还有一些知友直接发表对微内核的质疑,当然,科学的核心精神之一就是质疑。不过,概念、问题还有提出形式有一定的要求,参考学术论文的方法。不然,浪费你我时间。
3. 欢迎专业人士与我讨论,让我增长见识。谢谢。
另外觉得,
看完,做个比方的话意思是不是宏内核相当于一台带自带显卡硬盘内存条的电脑,由于现在usb2.0接口太慢了这些部件只能嵌在主板上;而微内核相当于只剩一个micro-atx主板了,上面有块cpu,但是现在发明了usb10.0接口,巨快无比,只要一个盒子,需要什么部件自己插就行了?可以做一个20g+gtx10060高性能游戏pc,也可以做一个2g+核显的轻薄办公pc?[好奇]
[1]Gerwin Klein, Kevin Elphinstone, Gernot Heiser, June Andronick, David Cock, Philip Derrin, Dhammika Elkaduwe, Kai Engelhardt, Rafal Kolanski, Michael Norrish, Thomas Sewell, Harvey Tuch, and Simon Winwood. 2009. seL4: formal verification of an OS kernel. In Proceedings of the ACM SIGOPS 22nd symposium on Operating systems principles (SOSP '09). ACM, New York, NY, USA, 207-220. DOI: https://doi.org/10.1145/1629575.1629596
[2] Lluís Vilanova, Marc Jordà, Nacho Navarro, Yoav Etsion, and Mateo Valero. 2017. Direct Inter-Process Communication (dIPC): Repurposing the CODOMs Architecture to Accelerate IPC. In Proceedings of the Twelfth European Conference on Computer Systems (EuroSys '17). ACM, New York, NY, USA, 16-31. DOI: https://doi.org/10.1145/3064176.3064197
[3]Dong Du, Zhichao Hua, Yubin Xia, Binyu Zang, and Haibo Chen. 2019. XPC: architectural support for secure and efficient cross process call. In Proceedings of the 46th International Symposium on Computer Architecture (ISCA '19). ACM, New York, NY, USA, 671-684. DOI: https://doi.org/10.1145/3307650.3322218
[4] Zeyu Mi, Dingji Li, Zihan Yang, Xinran Wang, and Haibo Chen. 2019. SkyBridge: Fast and Secure Inter-Process Communication for Microkernels. In Proceedings of the Fourteenth EuroSys Conference 2019 (EuroSys '19). ACM, New York, NY, USA, Article 9, 15 pages. DOI: https://doi.org/10.1145/3302424.3303946