seL4微内核入门-微内核介绍
thatway 那路谈OS与SoC嵌入式软件 2022-09-24 20:53
相信大家在很多时候听说**AUOTSAR**
AP
运行在微内核
上,就像上图中的QNX
和VxWORKS
,这两个微内核在商用领域比较出名,都是美国的。AUTOSAR AP需要一个支持posix接口
的OS,
那么为什么是微内核,为什么不是嵌入式领域常用的Linux?本文做一下介绍。
1. 为什么微内核更安全
首先说汽车行业的
ASIL 等级认证,ISO 26262
确定了四种 ASIL — A、B、C 和 D表示汽车的安全等级,从A到D安全等级越来越高,对于内核也需要更高的安全等级认证,宏内核
是过不了ASIL-B以上
的安全认证,但是像QNX
微内核已经过了ASIL-D
功能安全认证
。那么微内核和宏内核有什么区别?
从内核架构来划分,操作系统内核可分为微内核(Micro Kernel)和宏内核(Monolithic Kernel)。如上图所示,微内核操作系统仅在内核中保留了调度
、基础IPC
、虚拟内存管理
等少数核心功能模块,它们位于内核空间,而操作系统的其他功能模块(譬如
文件系统
、
驱动程序
等)与用户应用程序一起运行于用户空间;宏内核操作系统在内核中包括了整个操作系统的大部分功能模块(譬如文件系统、驱动程序等),并且这些系统模块都运行在同一个内核地址空间,模块之间通过简单的系统调用进行协调工作。
继续说**为什么微内核更安全**
?提起来安全,首先对于内核里面的东西越少才越安全
,就像你有一个秘密,知道的人越少才越不会被泄露,就上上图微内核把非核心的驱动、网络、文件系统都踢出内核了。对于应用来说,最后其自己的资源都是独占的
,别人不允许访问,并且别的模块出故障
最好也不要影响我,这就是隔离
的思想。在宏内核里面只对内核和应用做了隔离,内核中各个模块的内存随便用,应用里面的各种资源随便用,很容易崩溃。
微内核由于内核较小,微内核操作系统相比宏内核操作系统还具有可靠性好、可移植性好、可维护性好的特点,如下:
1) 可扩展性
从可扩展性来看,微内核操作系统只在内核部分包括功能几乎不变的核心模块,**其他模块位于内核之上**
,便于扩展
新的模块;宏内核操作系统则在内核部分包括了大部分操作系统功能模块,添加新模块会影响到其他模块,因而不便于扩展。
2) 可连续性
在工控领域,有些系统可以连续运行几个月甚至几年。可连续性是指**长时间运行而不重启**
;当然,如果失败后应能很快恢复运行。相比宏内核,微内核因为功能少,安全性和可靠性高,因而具有更好的连续性。
3) 性能
宏内核操作系统因为在内核部分包括了大部分操作系统功能模块,这些模块只需要通过函数调用的方式就可以完成相互间的调用。但是,微内核操作系统的大部分功能模块在内核之外,需要通过上下文切换和地址空间(用户空间和内核空间)切换才能够完成。这样,**微内核的性能通常认为比宏内核差**
。但即便如此,也有观点认为微内核因为其他各种优点而会在未来的PC、服务器等领域占有一席之地。
4) 实时性
微内核与实时性没有必然联系。因为性能和实时性是两个不同的概念,所以把实时性放在性能之后来讨论。实时内核的对比对象是分时内核或非实时内核。实时内核要求系统响应的实时性,比如火箭、无人机等的操作系统就是实时的,要求对系统的各种状态做立即处理;而分时系统则对任务做分时处理,平分处理器时间,所以不具备实时性。由于一些**微内核操作系统在实时性方面做了处理**
,因而具有较好的实时性,但宏内核操作系统也可以在实时性方面进行优化处理。
2.
微内核发展历史20世纪80年代,微内核作为一种新的内核概念被提出,其采用和UNIX
这样的宏内核完全不同的设计理念,微内核的目标是将内核态实现的功能精简化
,并在用户态采用模块化的方式提供需要的系统服务。自诞生之日起,微内核技术在40多年的历史中不断发展和完善,其过程大致可分为三个阶段:第一代微内核以美国卡耐基梅隆大学的Richard Rashid和Avie Tevanian主导开发的Mach
内核为代表[7]。虽然为了适应市场需要,该内核的设计理念中就明确指出需要兼容宏内核UNIX
,但是其使用IPC机制来作为系统服务和内核进行数据交流的桥梁,并将尽可能多的系统服务移到用户态运行,从而开创了微内核架构的先河。然而受限于时间、资金等客观因素,该内核实现的服务很少,于是只能简单粗暴地复用UNIX的部分代码,这导致内核显得十分臃肿。虽然Mach内核后续发展到了第三代,但是由于完全依赖IPC进行系统服务与内核间的通信,其性能远低于同期的UNIX,这导致业界一度认为“微内核不可能有高性能” 。第二代微内核以L3和L4为主要代表,它们重点解决了Mach内核中由IPC带来的性能问题
。例如,Jochen Liedtke将内核中的IPC模块进行精简[8],使得IPC机制只负责消息的传递,而将安全权限检查这类的工作交给用户进程去处理。此外,IPC中直接使用寄存器传递消息,同时对消息的长度进行限制。这些措施使得L4中IPC的时间消耗仅为Mach内核的1/20
。因此,微内核重新成为研究热点,并且随着黑莓公司旗下的QNX
微内核操作系统在航空、医疗等领域的成功而显示出巨大的商业价值。在前一代微内核获得成功的基础上,第三代微内核发展迅速,并且十分强调在系统安全问题
上的研究,其主要代表有seL4
、Fiasco、Minix
。seL4在充分继承第二代微内核高性能特性的基础上,提出基于权能的访问控制模型
,并将所有的内核服务都纳入该模型的控制中,进一步加强应用与系统之间以及应用与应用之间的隔离性,从而增强了系统可靠性[9]。此外,它还是第一个完全通过形式化验证
的内核,从数学理论上证明了其安全性[10]。最后,se L4还是一个混合关键性实时系统(Mixed Criticality real-time Systems,MCS
),其将时间也纳入到权能的控制模型中,这能够保证关键任务即使是在与可信度较低的代码共存的场合下,也能得到实时的响应[11]。近些年来,各大商业公司在微内核技术上持续发力,互联网巨头Google研发的Fuchsia
作为Linux的衍生版,被视为真正意义上的微内核操作系统。国内通信公司华为设计的Harmony OS
的内核同样采用了微内核架构,其面市后广受好评,并且已经随着华为手机和智慧屏等产品走进千家万户。由此可见,微内核架构的操作系统的商业化进程正在加快。
3. 微内核与宏内核架构之争
**Minix**
和Linux
是两个著名的开源操作系统,Minix于1987年发布,主要用于教学;Linux最早在1991年发布,而1.0正式版本则在1994年发布。
Minix采用微内核架构,Linux采用宏内核架构,那么这两种架构到底谁更胜一筹呢?在1992年,Minix的发明者**Andrew**
S. Tanenbaum和Linux的创始人Linus
Benedict Torvalds为此有过一段著名的争论
。不过那时候,Linux才刚刚开始。看看两位大佬
的争论,对我们会有所启发。(参见:
https://www.cnblogs.com/wickedboy237/archive/2013/05/12/3074009.html,邮件中是Andy Tanenbaum)
Andrew
主要观点:
(1)微内核架构
优于宏内核架构。
(2)Linux采用宏内核架构过时了,那是一些老的操作系统采用的方法,譬如UNIX, MS-DOS,
VMS, MVS, OS/360, MULTICS。这是从90年代退回到70年代的一种设计方法,就像把一个正在运行着的C程序用BASIC重写了。在1991年还写一个宏内核操作系统真是一个愚蠢
的选择。
(3)宏内核唯一可称道的地方就是性能
,但现在有足够的证据表明微内核系统也能够和宏内核系统跑得一样快(比如Rick Rashid 发表的对 Mach 3.0 和宏内核系统对比的论文)。
(4)微内核架构的可移植性
更好,没有必要为所有的CPU都设计一个不同的宏内核。譬如不断涌现的那些Intel CPUs: 8008、8080、8086、8088、80286、80386、80486,一直到子子孙孙无穷尽。
Linus
主要观点:
(1)Linux几乎在所有的领域
里面都能战胜Minix。
(2)Minix并没有把微内核的能力
发挥出来,并且对于真正的在内核中的多任务处理还有问题。
(3)事实是Linux可移植性
比Minix好。可移植性的存在是为了那些不会编程的人。可移植性是个好东西,但只在有意义的前提下。尝试着把一个操作系统变得可移植没有必要,其实只要附带一个轻便的API就足够了(例如POSIX标准)。一个操作系统的理念是利用硬件的特点,并且把他们隐藏在一层层的高级调用中。当然这也使得内核变得不大有移植性,但它也变得更容易设计。
从1992年到2020年,世间发生了太多变化:计算机性能变得越来越好,体积越来越小;Linux变得越来越**流行**
;计算机用户越来越年轻。由于Linux庞大的开发者和用户群体,Linux也被开发者们移植到各类CPU架构中,并没有因为可移植性而受到阻碍。
总之,对于一些专用系统,主要是**实时系统**
、嵌入式系统
、物联网系统
,微内核的思想更有吸引力。究其原因,主要是因为通常这些系统都不带磁盘,整个系统都必须放在EPROM中,常常受到存储空间的限制,而所需要的服务又比较单一和简单。所以,几乎所有的实时系统、嵌入式系统和物联网系统都采用微内核。当然,微内核也有缺点,将这些服务的提供都放在进程层次上,再通过进程间通信(通常是报文的传递)提供服务,势必增加系统的运行开销,降低了效率。与微内核相对应,其他通用式系统由于所需的服务面广而量大
,采用宏内核就更为合适。
看上面大佬吵架的内容,整体上看minix更加的**学术**
,东西再先进但是不好用,Linux就更加的实用
,只要好用,性能
还可以,人们没多少关心其技术实现,安全问题
也容易被忽略。一个折中的方案,微内核之中用虚拟机
运行宏内核,这样兼容包并,如下:
4. 值得研究的微内核
对各个微内核从**技术**
上和商业
上进行评估,下面挑选一些值得我们去研读其源码的微内核系统,如果想对微内核技术有一个了解,或者想做一个微内核的话。
技术上首先直接看第三代微内核**Minix**
和seL4
这两个,Minix比较旧一些但是也一直在演进引入新的东西,内容比较全面。seL4在性能和安全性上比较好,已经进行了形式化验证。
从商业OS上看,**QNX**
在07年的时候开源了一版本内核,只有BSP部分,应用部分做成了界面化配置在卖,不够开源全面。华为的鸿蒙
系统和谷歌的Fuchsia
系统是开源的,值得研究,但是这些商业OS有版权问题,可以参考学习。
综上,学习微内核从seL4上入手,**更合适**
,seL4算是一个偏学术的微内核,落地的应用场景不多,但是里面的理念还是相对比较先进
,资料也比较多,其框架见上图。官网地址:
https://docs.sel4.systems/GettingStarted可以自己先看看,里面很详细的操作指导。本文内容有限,下次进行介绍了。
后记:
后续会对上面提到的微内核都做一个**概况介绍**
和代码运行
,都是可以看得到的代码。其实接触微内核才会有一种错觉就是Linux过时了
,只是从技术上,但是易用性上目前各种系统还是Linux的天下。相信技术是在不断进步,这可能也是一种趋势。
本文是微内核的开篇,概念历史等内容较多,之后就开始介绍
代码及运行
。
参考:
- 雷品源. 面向多核环境的微内核操作系统研究与实现[D].电子科技大学,2021.DOI:10.27005/d.cnki.gdzku.2021.003825.