写点什么

华为“鸿蒙”所涉及的微内核到底是什么?一文带你认识微内核

  • 2019-08-14
  • 本文字数:4749 字

    阅读完需:约 16 分钟

华为“鸿蒙”所涉及的微内核到底是什么?一文带你认识微内核

最近微内核的概念常常被大家提及,同时还有 Google Fuchisa 这样的微内核新星,这里让我们一起来认识下微内核吧。

背景庞大的 UNIX 家族

计算机技术在二战后快速发展,构成计算机的主要基本单元从电子管发展到分立晶体管,再到后来的大规模集成电路。随着计算机技术发展,计算机性能越来越强劲,硬件越来越复杂,人们发现很难去直接管理计算机了,于是人们开始设计软件用于管理越来越复杂的计算机系统,这些软件称作系统级软件。从最开始的批处理系统,多道程序系统,分时系统到上世纪 60 年代开始出现通用操作系统,计算机系统层出不穷,直到上世纪 70 年代才出现被大家广泛接受广泛使用的通用操作系统。其中最经典的当然就是 UNIX 系统了。


UNIX 系统,1971 年诞生于大名鼎鼎的贝尔实验室的一台 PDP-11/24 机器上,其后经过不断发展与传播,在 80 年代取得了巨大成功,UNIX 被移植到众多的处理器架构,并在众多行业得到广泛使用,甚至成为行业标准影响至今。



UNIX 以及类 UNIX 系统如 Linux 都是典型的宏内核设计,也就是把所有系统服务都放到内核里,因为系统服务代码之间存在大量数据交换和大量的服务请求,而在同一个代码段内进行函数调用 (C 语言) 或跳转 (汇编或者机器码时代) 是最直接、最高效的方法,在同一片地址空间也方便数据交换,所以这样的宏内核设计是很自然的。


但是随着 UNIX 内核功能的拓展 (文件系统、TCP/IP 网络协议栈、进程管理、内存管理、驱动程序等),UNIX 内核代码也相应增加了很多,进而在可维护性. 稳定性,安全性方面面临一些挑战。为了试图解决这些挑战,人们开始尝试使用微内核的思想来设计系统内核。

什么是微内核?

微内核设计的基本思想是简化内核功能,在内核之外的用户态尽可能多地实现系统服务,同时加入相互之间的安全保护。内核只提供最基础的服务,比如多进程调度、多进程通信(IPC) 等。其中进程通信是作为连接应用与用户态系统服务的桥梁。


下图是宏内核与微内核的对比示意图



宏内核系统相关的服务基本都是放于内核态内核中,例如文件系统、设备驱动、虚拟内存管理、网络协议栈等;而微内核则把更多的系统服务(例如文件系统、POSIX 服务、网络协议栈甚至外设驱动)放到用户态应用,形成一个个服务,等待其他应用的请求。而后来,为了在宏内核与微内核之间扬长避短,也发展出了中间的混合内核的形态,部分服务也会放置于内核中。

微内核的发展历史

微内核这个概念从提出开始就在不断地发展、完善进步之中,到目前为止可以分为三代。

第一代微内核:从无到有

第一代微内核的主要代表是 Mach,该系统由卡内基 - 梅隆大学的 Avie Tevanian 和 Richard Rashid 主导开发。在 Mach 刚刚开始设计时,UNIX 的发展正如日中天,所以 Mach 在设计时的一大目标就是兼容 UNIX,但是与 UNIX 不同的是 Mach 尝试使用微内核架构去设计。Mach 以 IPC 是作为所有系统服务与内核交换数据的基础机制,充分运用 IPC、虚拟内存、多进程等特性将冗余的系统服务移出内核作为进程运行。


1986 年,经过两年的开发,第一版的 Mach 发布后的第二年,Mach 就发布了第 2 版,不过由于时间仓促,加之没有足够的人手与资金,所以此时 Mach 内核并不提供完全的系统服务。为了支撑系统上层运行,这一版的内核包含了大量 4.3 版本的 BSD 系统 (UNIX 的一个分支) 代码提供系统服务,并且 BSD 系统服务运行在内核状态,这导致 Mach 内核的代码体积甚至大于常规 UNIX 内核。第一版和第二版的 Mach 主要做了如下工作:1. 验证了微内核的可行性;2. 在多处理器计算机上进行移植验证了微内核在多处理器计算机上的运行;3. 最后为了提高 IPC 的效率,Mach 使用共享内存机制来完成 IPC。而 Mach 的共享内存机制是在虚拟内存技术的支持下实现的,只有需要对内存进行写入时才进行复制。这么一处理比每次都复制一遍内存节省了内存使用同时又加快了 IPC 机制的处理时间,这个改进称为写时复制,并且在如今的通用操作系统如 Linux 中常常用到。


经过测试,Mach 2.5 的效率最多比 UNIX 少 25%,但是考虑到 Mach 带来的可靠性、可拓展性、安全性,这个效率损失尚可以接受。当然此时 Mach 内核还不算完全的微内核。而考虑到微内核可以更高效地利用多处理器计算机的处理器核心资源,人们期待着等 Mach 把系统服务都搬到内核之外后可以把运行效率损失降下来。同时 Mach 在微内核方面小小的尝试迅速吸引了大批公司与组织的注意,开放软件基金会 (Open Software Foundation, OSF) 宣布下一代系统 OSF/1 将基于 Mach 的内核, NeXTSTEP 也将使用 Mach2.5, 甚至 IBM 也打算利用 Mach 构建 Workplace OS。苹果公司这个时候也出手了,苹果公司也从此基于 Mach2.5 打造其操作系统内核 XNU,XNU 的构成如下图所示,Mach 作为内核的内环,外环右侧是苹果的驱动框架(I/O Kit),外环左侧是 BSD 的系统服务代码提供 UNIX 兼容的服务层,这三者共同协作向上层提供完整的系统服务。XNU 广泛地使用在苹果公司的 OSX,IOS 等系统中。



这个时候由于 UNIX 系统广泛使用带来的商业利益,此时 BSD 系统开发者与 UNIX 的拥有者 AT&T 陷入了法律大战,Mach 使用的 BSD 相关代码有了法律风险。提升性能的期望和规避法律风险的需求推动着 Mach 3.0 的开发,Mach 3.0 的开发目标主要是为了替换 BSD 系统服务,同时尽量多地将系统服务放到内核之外去运行,成为名副其实的微内核设计。经过众多开发者 3 年的努力,Mach 3.0 于 1990 年发布,但是由于在系统服务之间完全使用 IPC 通信,而不是向宏内核那样直接进行函数调用,即便是多处理器机器上运行也性能损失惨重,Mach 3.0 最多比 UNIX 损失 67% 运行效率,这导致 Mach 3.0 以及其所代表的第一代微内核设计被看衰。此后断断续续有在 Mach 的基础上对性能进行提升的尝试,但是均不太理想,至此 Mach 成为了微内核第一代先驱者。

第二代微内核:解决性能问题

第二代微内核的主要代表是 L3 和 L4,以及 QNX 系统使用的 Neutrino 内核。前面第一代的微内核 Mach 由于效率问题虽然失败了,但是微内核的理念并没有被放弃,德国的计算机科学家 Jochen Liedtke 认为 Mach 的 IPC 效率低下的原因就是因为 IPC 部分不够精简,于是他开发了 L3 和 L4 微内核,对 IPC 部分进行了很彻底的精简:1. 内核的 IPC 机制只是单纯地传递信息,诸如安全权限检查这类的代码都省略掉,省略掉的功能全部由用户进程自己处理。如此一来 IPC 功能部分的代码执行时间大大缩短;2. IPC 不使用内存传递消息,而使用寄存器传递消息,同时限制 IPC 每次传递的信息长度,这样省去了对内存的访问时间。L4 微内核的 IPC 速度经过测试要比 Mach 快 20 倍,这个令人惊讶的优化效果吸引了众多的目光,使微内核的研究重新火热起来。后面 L4 内核又发展出了很多相关系统,比如 Pistachio,L4/MIPS,与 Fiasco 等等,这些内核组成了 L4 的大家族。



第二代微内核的代表除了有 L4 内核,也还有其他微内核比如 Exokernel、Rambler 等,不过商业上最成功的则是目前黑莓公司旗下的 QNX 系统所使用的 Neutrino 内核(QNX,1980 年诞生,最初以 QUICK UNIX 为名,后改为 QNX;2004 年 QNX 被 Harman 国际收购;2010 年 Harman 国际下被黑莓收购,QNX 成为黑莓旗下的资产),QNX 主要为高可靠领域提供解决方案,比如交通、能源、医疗、航天航空等。


第三代微内核:主要重视安全问题等

在前面两代的基础上,第三代微内核蓬勃发展,许许多多微内核都被开发出来,主要代表有:seL4、Fiasco.OC、NOVA 等。本来第一代微内核的设计隔离了使内核安全性降低的系统服务,让系统服务漏洞不会影响内核,进而提高了内核安全性,可以说是关上了破坏系统的门, 但是第二代系统却又给攻击者开了个窗户;由于第二代微内核在内核中省去了关于安全性检查等步骤,把所有关于安全检查功能的实现都交给系统服务自己去实现,这导致系统服务的通信接口直接暴露给用户态,任何进程都可能无限制地请求系统服务,系统服务不得不花费额外的代价来区分请求是否合法,容易造成拒绝服务攻击。比如正常的文件服务应该是从虚拟文件系统服务 ->文件系统服务 ->磁盘驱动服务这个流程来完成的,但是如果攻击者如果绕过虚拟文件系统服务,直接无限制地请求攻击者本身没有权限访问的文件系统服务,使文件系统服务长期处于满载状态,让其他进程无法通过正常的虚拟文件系统得到文件系统服务。为了增强安全性,且不过分影响性能,人们开始研发第三代微内核。


seL4 是在第二代内核 L4 的基础上发展而来的。seL4 不仅仅继承了 L4 内核家族的高性能特性,还具备基于端点 (enndpoint) 的 IPC 机制。这种 IPC 机制最大的特点是使用了能力空间的概念,进程在使用 IPC 请求系统服务时必须具备相对应的能力,进程持有不可伪造的令牌来表示拥有请求某种服务的能力。令牌可以被复制,可以被转移,还可以通过 IPC 进行传输。令牌其实是一个指向存在于内核空间内核对象的指针,所以普通进程并不能修改自身以及其他进程的权限分配,但是内核可以对令牌指定的权限进行控制,从而保证了用户态不能绕过能力空间这个机制对系统服务造成滥用。


seL4 还是第一个完全通过形式化验证的内核,通俗说形式化验证就是在数学软件的帮助下使用数学语言自动化地推导检查系统的每一个运行状态。

其他的微内核系统:Fuchsia,Minix

Fuchsia 是 Google 开发的一款全新操作系统,试图覆盖手机、平板甚至笔记本等一系列领域。Google 为该系统配备了 Vulkan 图形接口、3D 桌面渲染 Scenic、Flutter 应用开发框架,还有一个称为 zircon 的微内核。zircon 内核是从高通平台的一个 Bootloader 项目:Little Kernel 发展而来。zircon 内核属于微内核设计,只提供 IPC,进程管理,地址空间管理功能。zircon 区别于以进程或者以文件为核心的设计,zircon 是以内存为核心来设计的,内存在 zircon 中是以对象的方式存在,可以通过 channel 通信机制传递虚拟内存对象(Virtual memory object)的句柄,进程拿到句柄后可以把这块内存映射到自己的空间。


Minix 系统则由荷兰阿姆斯特丹的 Vrije 大学的 Andrew S.Tanenbaum 教授所开发。该系统最大的特点是可以故障隔离,自动重启失败的服务。Minix 使用分层设计,最底层的微内核提供中断处理、进程管理、进程通信等服务,这一层运行在内核态;中间层提供轮回服务 (Reincarnation Server)、文件服务、进程管理、X 图形服务以及驱动等,这一层运行在用户态;最上层为用户进程。其中轮回服务负责在中间层的服务出现崩溃时重启这些服务,从而保证服务的自我修复。Minix 由于其自我修复特性被英特尔管理引擎(ME)所选用,该管理引擎主要负责管理英特尔芯片的内部模块。

微内核的优缺点

优点

  1. 系统服务模块化,可移植性高;

  2. 内核安全性提高 (模块内部的 bug 不影响内核稳定,将黑客利用软件漏洞造成的破坏限制在单个模块内部);

  3. 可以多套系统服务共存,相当于同时运行多种操作系统;

  4. 稳定统一的接口 (可以独立维护私有驱动以及服务,不需要跟内核源码绑定);

  5. 在商业上,微内核可以避免代码受到一些开源协议的影响,比如 GPL 协议;

  6. 内核精简,可以进行形式化验证,利用数学证明内核的安全性;

  7. 数学可证明的实时性;

  8. 非常适合多处理器系统设计,在多处理器核心计算机上,互相依赖的系统服务可以同时运行;

缺点

  1. 通过进程通信的方式交换数据或者调用系统服务,而不是使用系统调用,造成额外的操作系统开销;

  2. 使用一些频繁使用的系统服务时,比如网络收发数据,造成的进程上下文切换对操作系统来说也是一个负担;

  3. 由于系统服务高度模块化,系统服务之间存在大量的内存复制;

  4. 对互相之间存在复杂调用关系的系统服务,难以设计通信接口;

  5. 系统服务与内核在地址空间上分离,造成代码局部性差,降低了 cache 命中率;


本文转载自【RTThread 物联网操作系统】公众号,作者 4d44f50c 张 。


原文链接:


https://mp.weixin.qq.com/s/VSmZH77GzdLoUmKtvLFl_A


2019-08-14 15:0620049

评论

发布
暂无评论
发现更多内容

【web 开发基础】PHP 自定义函数之函数的返回值-PHP 快速入门 (27)

迷彩

web开发基础 PHP基础 11月月更 return

遭MQ连连干翻后的醒悟!含恨码出5本MQ学习手册助力秋招之旅

小二,上酒上酒

面试 RocketMQ 大厂 大厂面试

Github上架3天星标55K,阿里最新产架构师速成手册成功颠覆了我的认知

程序员小毕

分布式 微服务 程序人生 架构师 Java后端

蚌住了!这份阿里P8写的Java多线程编程实战指南就这么容易开源?

小二,上酒上酒

Java 面试 多线程 阿里 大厂面试

《深入理解JavaScript特性》学习总结1-ES6基础知识点总结

肥晨

箭头函数 11月月更 ES6基础知识点总结

数字化开采|AIRIOT智慧矿山自动化生产解决方案

AIRIOT

低代码 物联网 智慧矿山

20个值得收藏的实用JavaScript技巧

千锋IT教育

2022年互联网主要技术方向招聘需求变化:人工智能岗位需求增加87.7%;SQL在就业语言需求中位列第一

雨果

sql

图文实录|UIE:基于统一结构生成的通用信息抽取

澜舟孟子开源社区

Meta Force 原力元宇宙dapp系统开发(智能合约部署)

开发微hkkf5566

redhat运维-远程日志记录

阿柠xn

运维 日志 linux 文件权限控制 11月月更

CSS修改单选框样式(element)

肥晨

11月月更 单选框样式修改 element单选框样式

为什么晶闸管能在大电流下工作?

元器件秋姐

元器件采购 元器件电商 元器件知识 华秋商城 晶闸管

商业银行普惠金融可持续发展综合能力呈现梯队化,专项领域各有所长

易观分析

普惠金融

低学历并不是阻碍职业发展的绊脚石

测吧(北京)科技有限公司

软件测试

爆肝了!阿里出版的这份Spring Security源码手册,狂揽GitHub榜首

小二,上酒上酒

Java 面试 spring security 大厂 大厂面试

java培训学习该怎么做?

小谷哥

阿里P8偷偷把内网分享的SpringCloud微服务架构精髓手册开源了

小二,上酒上酒

架构 面试 微服务 Spring Cloud

袋鼠云数栈UI5.0体验升级背后的故事:可用性原则与交互升级

袋鼠云数栈

3年测试经验跳槽成功拿下30W+年薪

测吧(北京)科技有限公司

软件测试

为什么面试官狂问八股文?我已经被三家公司问到哑口无言……

程序知音

Java java面试 java架构 后端技术 Java面试八股文

万物皆可集成系列:低代码对接Web Service接口

葡萄城技术团队

深圳市数字经济指数发布:数字经济蓬勃发展,数字用户深度渗透

易观分析

数字经济 深圳

2022开源之夏|EMQ三大开源项目开发圆满收官

EMQ映云科技

开源 物联网 IoT mqtt 11月月更

完整会议议程:NGINX Sprint China 2022 年度线上大会

NGINX开源社区

nginx

这些小技巧,让你的前端编程更优雅

好程序员IT教育

前端

大规模预训练模型:探讨与展望

澜舟孟子开源社区

《深入理解JavaScript特性》学习总结2-ES6基础知识点总结

肥晨

11月月更 ES6基础知识点总结 解构赋值

好家伙!阿里P8撰写的Java微服务架构全栈笔记GitHub一夜飞到榜首

小二,上酒上酒

Java 架构 面试 微服务

神了!阿里P8纯手写出了这份10W字的MyBatis技术原理实战开发手册

小二,上酒上酒

学习 编程 面试 mybatis

最新出炉!开源 API 网关的性能对比:APISIX 3.0 和 Kong 3.0

API7.ai 技术团队

kong api 网关 APISIX

华为“鸿蒙”所涉及的微内核到底是什么?一文带你认识微内核_5G/IoT_RTThread物联网操作系统_InfoQ精选文章