专栏首页LINUX阅码场【讨论】Linux kernel 的设计是否已经过时?微内核?

【讨论】Linux kernel 的设计是否已经过时?微内核?

编者按

恰逢华为发布鸿蒙微内核操作系统,微内核和宏内核的争论再次成为焦点。

余承东认为,当前,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 具有良好的设计和一些很棒的功能,但硬件支持很少,几乎没有人为此平台开发。

本文分享自微信公众号 - Linux阅码场(LinuxDev),作者:陈莉君

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-08-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Linux为什么一定要copy_from_user ?

    网上很多人提问为什么一定要copy_from_user,也有人解答。比如百度一下:

    Linux阅码场
  • 熊大微评微内核|华为“鸿蒙”所涉及的微内核究竟是什么?

    又一波微内核讨论,同时也见到网上太多的言论,甚至把RT-Thread物联网操作系统归类到微内核行列。所以重新把这篇科普文章发下,并做部分澄清。

    Linux阅码场
  • 陈莉君: 中国台湾開源人年会之Linux内核之旅(附演讲PPT及讲解)

    今年是第一次参加COSCUP 开源人年会,到底与大家分享些什么,与社区大牛BOB沟通后,他建议我就分享自己这20年来的Linux内核之旅。

    Linux阅码场
  • 大佬解读 | 华为发布会: 牛逼鸿蒙,吹水的大会

    前天,华为举行了一场盛大的发布会,会议开头介绍了华为在消费者市场所取得的成绩,说实话,看了还挺震撼的,华为确实是一家很厉害的商业公司。

    AI算法与图像处理
  • 资深大厂工程师谈鸿蒙: 牛逼鸿蒙,吹水的大会

    前天,华为举行了一场盛大的发布会,会议开头介绍了华为在消费者市场所取得的成绩,说实话,看了还挺震撼的,华为确实是一家很厉害的商业公司。

    用户1564362
  • 什么叫做微内核?与安卓系统有什么区别?

    从事嵌入式开发多年,要讲清楚这个事情真需要一定开发经验特别是关于linux上面的,首先微内核是相对于强内核而言,linux属于典型的强内核架构,从第一版本开始就...

    程序员互动联盟
  • 入围名单公布!腾讯云IoT应用创新大赛火爆进行中!

    腾讯云IoT应用创新大赛是腾讯云面向物联网领域举办的大型竞赛,通过腾讯云IoT全链路产品能力,开放平台和服务,与广大开发者共同创新,孵化优秀的IoT产品和解决方...

    腾小云
  • GlusterFs使用解析,关于新版本部分Volume模式废弃!!

    ##本文纯手工制作,转载请注明出处!且不可转载为收费,技术共享无边界,作者范体贴。

    范体贴
  • 视频流媒体平台EasyNVR视频录像打开缓慢延迟问题解决

    我们之前为大家解答过不少关于流媒体服务器可能出现的问题,比如降低直播延迟、302重定向、播放中断等问题,都为大家提出了适合的解决办法。我们的流媒体服务器一次授权...

    EasyNVR
  • 【HDU5831】Rikka with Parenthesis II(括号)

    注意()是No的情况。 任意时刻)不能比(超过2个以上。 最后)和(的差距要在两个以内,且n必须是偶数。

    饶文津

扫码关注云+社区

领取腾讯云代金券