编者按
恰逢华为发布鸿蒙微内核操作系统,微内核和宏内核的争论再次成为焦点。
余承东认为,当前,Android/Linux 内核代码庞大且冗余,比如 Android 代码就有一亿行,Linux 内核代码也有 2000 万行,很难保证不同终端的体验流畅。鸿蒙 OS 采用全新的微内核设计,拥有更强的安全特性和低时延等特点。微内核设计的基本思想是简化内核功能,在内核之外的用户态尽可能多地实现系统服务,同时加入相互之间的安全保护。微内核只提供最基础的服务,比如多进程调度和多进程通信等。
小编精心挑选了这个讨论主题,本文的主体内容由陈莉君老师完成。欢迎留言发表您的意见。
在开源中国看到“Linux kernel 的设计是否已经过时?”这个题目,正好有企业界的朋友问到L4 基于微内核的操作系统怎么样。微内核与宏内核争论似乎是永远的话题,只是看你站在什么角度。依然记得99年带领学生们阅读Minix微内核操作系统设计原理和代码的情景,因为在艰难的跋涉中有清晰的导航图,《操作系统设计与实现》上下册还是被一点一点啃完。
后来阅读Linux源代码,就像走进一大片森林,在各种复杂的交错关系中摸索着前进,即使手上拿着导航图,但经常因为走进一个岔道而忘了返回的旅途,但是,因为众多的人在森林中探索,你会找到同路人(开源社区的邮件列表和各种文档),于是,在不知所然中也常常会找到帮手,于是,Linux这片森林就在不断扩大面的,走进去能走出来的人更加困难。
关于L4, 有一段文字描述或许对你有启发:
一般来讲,目前公认的L4系统有2个特点,Fast IPC和Sigma0协议。Sigma0是一种基于IPC的内存管理协议,使用Sigma0,内存管理呈现出一种层次状。举例:有A和B两个程序,如果程序B想使用程序A的内存。如果使用Sigma0,那么很容易实现,只要把A设置为B的pager,并提供B的page fault handler程序就可以。在这种情况下,程序A和程序B依然具有不同的Address Space,A和B之间互相隔离(关于这种层次式的内存管理,请参考The sawmill framework for virtual memory diversity)。但是如果使用Linux来实现这种模式,除非使用share memory,想不出其它更好的办法,但是share memory使得A和B之间有的Address Space有了交集,从security和safety两个方面来讲,都不是很好的解决方法。近年来,越来越多的L4系统开始支持一种新的特性-Capability, Capability是为了提高操作系统安全性而设计的,Capability和要访问的Resource之间的关系类似于文件描述符号和文件之间的关系一样,要访问一个Resource,必须通过Capability来进行,Capability里面规定了那么资源可以被访问等安全特性,Capability允许被grant(从一个用户转移到另外一个用户),总之,Capability是比Access Control List更好的一种增强系统安全性的方法。
抛砖引玉,以下是reddit上讨论的部分内容
—————————————————
Linux 多年来取得的成绩毋庸多言。但最近,reddit 上有人发起了一个话题,想知道 Linux 的内核设计是否已经过时,并得到了一些有趣的答案。
这位 Ronis_BR 的用户提问大致如下:
Linux 是在 1992 年启动的,一些特性到现在都没有改变。我猜想最新的操作系统内核设计技术(如果存在…)应该较之前有很大的进步。那 Linux 内核是否已经过时?
与 Windows、macOS、FreeBSD 内核的设计相比,Linux 内核的设计有没有在哪些方面比较先进?(注意,重点是设计的先进,而不是哪一个更好)。
该话题引起了近 400 条回复,大家纷纷发表了自己对内核设计的看法,节选几条不同的观点:
ExoticMandibles:
“过时”?不存在的。Linux kernel 对现代内核的设计其实是非常了解的,只是它选择了保持传统的形式。
内核设计的核心在于“安全/稳定”和“性能”之间的关系。Microkernels(微内核)以性能为代价保证安全。如果你有极小的微内核,那么它将具有相对较小的 API surface,使其难以被攻击。而且当你有一个错误的文件时,驱动程序崩溃而不占用内核,可以无损重启。优越的稳定性!优越的安全性!一切很美好。
但这种方案的缺点是所有 IPC 永远且不可避免的开销。如果你的程序想从文件加载数据,则必须访问文件系统驱动,这意味着 IPC 要处理进程上下文切换和两次 ring transitions 。然后,文件系统驱动要求内核与硬件通信,这也意味着两次 ring transitions。然后文件系统驱动发送其回复,这意味着又一轮的两次,以及另一次上下文切换。总开销:两次上下文切换,两次 IPC 调用和六次 ring transitions。非常贵!
宏内核将所有设备驱动合拢到内核中。所以当出现一个错误的图形驱动,就可以占用内核,或者如果它有一个安全漏洞,那么可能被用来危及系统。但是,如果你的程序需要从磁盘加载某些东西,则会调用内核,进行 ring transitions,与硬件通话,计算结果,并返回结果,进行另一个 ring transitions。总开销:两次 ring transitions。便宜得多,也快得多!
简而言之,微内核是:“放弃性能来提高安全性和稳定性”;宏内核是:“保持性能,只要修复安全和稳定性问题就可以了”。而目前,大家更愿意接受后者。
Scandalousmambo:
开发一个和 Linux kernel 相同的系统,从本质上决定了它一旦设计出来就会“过时”。
KugelKurt:
尽管这里讨论的大部分内容都是关于微内核与宏内核的关系,但是最近的研究还涉及到编程语言。如果你今天启动一个全新的内核,那么就可能不会用 C 去写。微软的 Singularity 和 Midori 项目探讨了用 C#托管代码内核的可行性。
Daemonpenguin:
有一些概念,在理论上可以提供更好的内核设计。比如,理论上微内核也有一些非常好的设计选择,使得它们具有便携性、可靠性和潜在的自我修正能力。
然而,无论理论多么好,人们总是会根据实际情况进行设计。Linux 内核拥有如此多的硬件支持,那么多公司支持开发,其他内核(不管设计得多炫酷)都不太可能赶得上。
例如,MINIX 具有良好的设计和一些很棒的功能,但硬件支持很少,几乎没有人为此平台开发。