操作系统基础3-宏内核与微内核
1.操作系统的内核
内核 是计算机上配置的底层软件,是操作系统最基本、最核⼼的部分。实现操作系统内核功能的那些程序就是内核程序。
可以看到内核的主要功能有:时钟管理、中断管理、原语(设备驱动、CPU切换等)。还有对系统资源的管理功能:进程管理、存储器管理、设备管理等功能。有些操作系统不把这部分功能归为"内核"功能,不同的操作系统对内核功能的划分可能不⼀样。
2.宏内核与微内核
宏内核
简单的讲宏内核就是操作系统是个⼤管家,⼏乎包办⼀切,⽤户应⽤程序的需求直接向内核提出就⾏;微内核更像⼀个代理⼈,⼏乎所有的驱动、⽂件系统全部运⾏在与⽤户应⽤程序平级的⽤户模式下。
UNIX 系统,1971 年诞⽣于⼤名⿍⿍的贝尔实验室的⼀台 PDP-11/24 机器上,其后经过不断发展与传播,在 80 年代取得了巨⼤成功,UNIX 被移植到众多的处理器架构,并在众多⾏业得到⼴泛使⽤,甚⾄成为⾏业标准影响⾄今。
庞⼤的 UNIX 家族
UNIX 以及类 UNIX 系统如 Linux 都是典型的宏内核设计,也就是把所有系统服务都放到内核⾥,因为系统服务代码之间存在⼤量数据交换和⼤量的服务请求,⽽在同⼀个代码段内进⾏函数调⽤(C 语⾔)或跳转(汇编或者机器码时代)是最直接、最⾼效的⽅法,在同⼀⽚地址空间也⽅便数据交换,所以这样的宏内核设计是很⾃然的。
微内核
微内核设计的基本思想是简化内核功能,在内核之外的⽤户态尽可能多地实现系统服务,同时加⼊相互之间的安全保护。内核只提供最基础的服务,⽐如多进程调度、多进程通信(IPC)等。其中进程通信是作为连接应⽤与⽤户态系统服务的桥梁。
宏内核与微内核的对⽐⽰意图
微内核则把更多的系统服务(例如⽂件系统、POSIX 服务、⽹络协议栈甚⾄外设驱动)放到⽤户态应⽤,形成⼀个个服务,等待其他应⽤的请求。
微内核在效率⽅⾯肯定是处于劣势的,所以⽬前的主流操作系统如Linux和Windows本质上使⽤的都是
宏内核,当然有读者可能会提出Windows 使⽤的是混合内核,不过这种混合内核也是以效率优先的扁平化架构,本质上还是宏内核。
微内核
下⾯重点说说微内核
微内核这个概念从提出开始就在不断地发展、完善进步之中,到⽬前为⽌可以分为三代。
第⼀代微内核:从⽆到有
第⼀代微内核的主要代表是 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. 验证了微内核的可⾏性;
linux内核设计与实现 pdf
2. 在多处理器计算机上进⾏移植验证了微内核在多处理器计算机上的运⾏;
IPC。
IPC(进程通信) 的效率,Mach 使⽤共享内存机制来完成 IPC
3. 最后为了提⾼ IPC(进程通信)
⽽ Mach 的共享内存机制是在虚拟内存技术的⽀持下实现的,只有需要对内存进⾏写⼊时才进⾏复制。这么⼀处理⽐每次都复制⼀遍内存节省了内存使⽤同时⼜加快了 IPC 机制的处理时间,这个改进称为写时复制,并且在如今的通⽤操作系统如 Linux 中常常⽤到。
当然此时 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 机制只是单纯地传递信息,诸如安全权限检查这类的代码都省略掉,省略掉的功能全部由⽤户进程⾃⼰处理。如此⼀来 IP C功能部分的代码执⾏时间⼤⼤缩短;
2. IPC 不使⽤内存传递消息,⽽使⽤寄存器传递消息,同时限制 IPC 每次传递的信息长度,这样省去了对内存的访问时间。L4 微内核的 IPC 速度经过测试要⽐ Mach 快 20 倍,这个令⼈惊讶的优化效果吸引了众多的⽬光,使微内核的研究重新⽕热起来。后⾯ L4 内核⼜发展出了很多相关系统,⽐如 Pistachio、L4/MIPS 与 Fiasco 等等,这些内核组成了 L4 的⼤家族。
QNX 系第⼆代微内核的代表除了有 L4 内核,也还有其他微内核⽐如 Exokernel、Rambler 等,不过商业上最成功的则是⽬前⿊莓公司旗下的 QNX
QNX;2004 年 QNX 被 Harman 国际收购;2010统所使⽤的 Neutrino 内核(QNX,1980年诞⽣,最初以 QUICK UNIX 为名,后改为 QNX
年 Harman 国际下被⿊莓收购,QNX 成为⿊莓旗下的资产),QNX 主要为⾼可靠领域提供解决⽅案,⽐如交通、能源、医疗、航天航空等。
第三代微内核:主要重视安全问题等
在前⾯两代的基础上,第三代微内核蓬勃发展,许许多多微内核都被开发出来,主要代表有:seL4、Fiasco.OC、NOVA 等。
本来第⼀代微内核的设计隔离了使内核安全性降低的系统服务,让系统服务漏洞不会影响内核,进⽽提⾼了内核安全性,可以说是关上了破坏系统的门, 但是第⼆代系统却⼜给攻击者开了个窗户。
由于第⼆代微内核在内核中省去了关于安全性检查等步骤,把所有关于安全检查功能的实现都交给系统服务⾃⼰去实现,这导致系统服务的通信接⼝直接暴露给⽤户态,任何进程都可能⽆限制地请求系统服务,系统服务不得不花费额外的代价来区分请求是否合法,容易造成拒绝服务攻击。
⽐如正常的⽂件服务应该是从虚拟⽂件系统服务->⽂件系统服务->磁盘驱动服务这个流程来完成的,但是如果攻击者如果绕过虚拟⽂件系统服务,直接⽆限制地请求攻击者本⾝没有权限访问的⽂件系统服务,使⽂件系统服务长期处于满载状态,让其他进程⽆法通过正常的虚拟⽂件系统得到⽂件系统服务。为了增强安全性,且不过分影响性能,⼈们开始研发第三代微内核。
seL4 是在第⼆代内核 L4 的基础上发展⽽来的。seL4 不仅仅继承了 L4 内核家族的⾼性能特性,还具备基于端点(enndpoint)的 IPC 机制。
这种 IPC 机制最⼤的特点是使⽤了能⼒空间的概念,进程在使⽤ IPC 请求系统服务时必须具备相对应的能⼒,进程持有不可伪造的令牌来表⽰拥有请求某种服务的能⼒。令牌可以被复制,可以被转移,还可以通过 IPC 进⾏传输。令牌其实是⼀个指向存在于内核空间内核对象的指针,所以普通进程并不能修改⾃⾝以及其他进程的权限分配,但是内核可以对令牌指定的权限进⾏控制,从⽽保证了⽤户态不能绕过能⼒空间这个机制对系统服务造成滥⽤。
seL4 还是第⼀个完全通过形式化验证的内核,通俗说形式化验证就是在数学软件的帮助下使⽤数学语⾔⾃动化地推导检查系统的每⼀个运⾏状态。seL4 形式化验证相关论⽂。
其他的微内核系统:Fuchsia、Minix
Fuchsia 是 Google 开发的⼀款全新操作系统,试图覆盖⼿机、平板甚⾄笔记本等⼀系列领域。Google 为该系统配备了 Vulkan 图形接⼝、3D 桌⾯渲染 Scenic、Flutter 应⽤开发框架,还有⼀个称为 zircon 的微内核。
IPC、进程管理、地址空间管zircon 内核是从⾼通平台的⼀个 Bootloader 项⽬:Little Kernel发展⽽来。zircon内核属于微内核设计,只提供 IPC
理功能。zircon 区别于以进程或者以⽂件为核⼼的设计,zircon 是以内存为核⼼来设计的,内存在 zircon 中是以对象的⽅式存在,可以通过channel 通信机制传递虚拟内存对象(Virtual memory object)的句柄,进程拿到句柄后可以把这块内存映射到⾃⼰的空间。
Minix 系统则由荷兰阿姆斯特丹的 Vrije ⼤学的 Andrew S.Tanenbaum 教授所开发。
该系统最⼤的特点是可以故障隔离,⾃动重启失败的服务。
Minix 使⽤分层设计,最底层的微内核提供中断处理、进程管理、进程通信等服务,这⼀层运⾏在内核态;中间层提供轮回服务(Reincarnation Server)、⽂件服务、进程管理、X 图形服务以及驱动等,这⼀层运⾏在⽤户态,最上层为⽤户进程。
其中轮回服务负责在中间层的服务出现崩溃时重启这些服务,从⽽保证服务的⾃我修复。Minix 由于其⾃我修复特性被英特尔管理引擎(ME)所

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。