聚内核与微内核

2023-12-01 19:48
文章标签 内核 微内核

本文主要是介绍聚内核与微内核,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

可以把内核分为主要的两个类别:聚内核与微内核(还有第三类,外核,主要存在于研究领域)。聚内核比其它两类的设计更简单,在1980之前所有内核都采用聚内核的方式。聚内核被实现为运行在单一的地址空间里的单一的进程。因此,这种内核通常以一个静态的二进制文件保存在磁盘中。所以内核的服务都存在并执行于一个大的内核地址空间里。在内核的内部进行通信显得直接了当,因为所有运行在内核态的代码都在相同的地址空间里:内核可以直接调用函数,就像用户空间的应用程序一样。这个模型的支持者们以聚内核的简洁和性能为理由。多大数Unix系统都采用聚内核的设计方法。

微内核则不是实现为单个的大的进程。而是把内核的功能分解成不同的进程,通常把这些进程称为服务。理想情况,只有在必要的时候服务才运行在特权模式下。其他服务都运行在用户空间里。所有这些服务,都被分解到不同的地址空间里,因此,像聚内核那样的直接的函数调用不再可能(指在多个服务间进行通信时)。替代地,微内核的通信通过消息传递:一套进程间通信(IPC)的机制被内嵌到系统中,各种服务通过在IPC之上发送消息来相互调用彼此的服务。把各种服务的分离可以防止一个服务的失败引起其他服务的失败。同样的,这种模块化的系统允许一个服务替换掉另一个服务。

由于IPC的机制会导致比平常的函数调用更多一些的开销,此外,它还包含在内核空间与用户空间之间进行上下文切换的开销,同时消息传递也会有一些延迟,所以微内核的吞吐量似乎不如采用简洁函数调用的聚内核。因此,所有实用的基于微内核的系统,现在都把大多数或所有服务放在内核空间,以避免频繁的上下文切换带来的开销,并潜在的支持直接的函数调用。Windows NT内核(被用于Windows XP,Vista,7)和Mach(被用于部分Mac OS X)就是微内核的例子。最新版的Windows NT和Mac OS X都不会在用户空间运行微内核的服务,它们都背离了微内核的设计初衷。

Linux属于聚内核,也就是说,整个Linux内核运行在内核态的单一的地址空间里。然而,Linux也从微内核中借鉴了很多好的想法:Linux推崇模块化的设计、可以抢点它自己(称为抢占式内核)、支持内核线程、可以动态加载二进制文件(内核模块)到内核镜像中。因此,Linux没有任何一个微内核设计带来的性能损耗:内核的代码都运行在内核态、直接的函数调用、没有消息传递的通信模式。虽然如此,Linux是模块化的、线程的、并且它自己是可调度的。实用主义再一次胜利。


1、Linux支持动态加载Linux模块。尽管Linux是聚内核,它可以按需动态地加载或卸载模块。
2、Linux支持对称多处理器(SMP)。尽管大多数商业版的Unix变种已经支持SMP,大多数传统的Unix实现是不支持的。
3、Linux内核是抢占式的。与传统Unix变种不一样,Linux内核可以抢占一个任务,即使这个任务正在执行。在其他的商业版Unix实现中,Solaris和IRIX是抢占式,其他大多数都不是。
4、Linux采用了有趣的方式支持线程:它并不区分线程和普通进程。对Linux内核而言,线程和进程都一样的——线程只是共享资源的进程。
5、Linux提供面向对象的设备模型。包括:设备类别、热插拨的事件、以及一个用户空间的设备系统(sysfs)。
6、Linux忽略某些通用的内核开发者们认为不良设计的Unix特性。例如STREAMS,或无法简洁地实现的标准。
7、Linux在任何意义上都是免费的。这个特性使Linux的实现成为Linux开放开发模型的自由运动的必然结果。如果一个特性没有价值或没有考虑透彻,Linux开发者们没有义务去实现它。相反地,Linux在面对变化时,采用一种先进的理念:修改必须解决一个特定的现实问题、来源于一个简洁的设计,并且有稳健的实现。因此,在其他现代Unix变种中,某些只是为了制造销售的噱头或是针对某个单一的需求而开发的一些特性,如可分页的内核内存,Linux是不会考虑的。

这篇关于聚内核与微内核的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/442486

相关文章

Linux内核之内核裁剪详解

《Linux内核之内核裁剪详解》Linux内核裁剪是通过移除不必要的功能和模块,调整配置参数来优化内核,以满足特定需求,裁剪的方法包括使用配置选项、模块化设计和优化配置参数,图形裁剪工具如makeme... 目录简介一、 裁剪的原因二、裁剪的方法三、图形裁剪工具四、操作说明五、make menuconfig

如何安装HWE内核? Ubuntu安装hwe内核解决硬件太新的问题

《如何安装HWE内核?Ubuntu安装hwe内核解决硬件太新的问题》今天的主角就是hwe内核(hardwareenablementkernel),一般安装的Ubuntu都是初始内核,不能很好地支... 对于追求系统稳定性,又想充分利用最新硬件特性的 Ubuntu 用户来说,HWEXBQgUbdlna(Har

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel

kernel起始与ENTRY(stext),和uboot一样,都是从汇编阶段开始的,因为对于kernel而言,还没进行栈的维护,所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。         内核起始部分代码被解压代码调用,前面关于uboot的文章中有提到过(eg:zImage)。uboot启动是无条件的,只要代码的位置对,上电就工作,kern

Ubuntu22.04回退系统内核

文章目录 起因回退操作卸载内核禁止内核升级 起因 最近因为系统内核自动升级,导致显卡驱动检测不到,炼丹环境被破坏。无奈只能重装驱动,于是跟着手册操作发现驱动要求的是内核版本是5.15.0-25-generic,而我通过uname -r发现这时候的内核版本是6.8.0-40-generic,看来只能回退了。 我搜索了网上很多的文章,没有一篇文章能够完全解决这个问题,所以在我多次尝

跟我一起玩《linux内核设计的艺术》第1章(四)——from setup.s to head.s,这回一定让main滚出来!(已解封)

看到书上1.3的大标题,以为马上就要见着main了,其实啊,还早着呢,光看setup.s和head.s的代码量就知道,跟bootsect.s没有可比性,真多……这确实需要包括我在内的大家多一些耐心,相信见着main后,大家的信心和干劲会上一个台阶,加油! 既然上篇已经玩转gdb,接下来的讲解肯定是边调试边分析书上的内容,纯理论讲解其实我并不在行。 setup.s: 目标:争取把setup.

编译linux内核出现 arm-eabi-gcc: error: : No such file or directory

external/e2fsprogs/lib/ext2fs/tdb.c:673:29: warning: comparison between : In function 'max2165_set_params': -。。。。。。。。。。。。。。。。。。 。。。。。。。。。。。。。 。。。。。。。。 host asm: libdvm <= dalvik/vm/mterp/out/Inte

linux 内核提权总结(demo+exp分析) -- 任意读写(四)

hijack_modprobe_path篇 本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com/user-815036.htm     原理同hijack_prctl, 当用户执行错误格式的elf文件时内核调用call_usermod

linux 内核提权总结(demo+exp分析) -- 任意读写(三)

hijack_prctl篇 本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com/user-815036.htm   prctl函数: 用户态函数,可用于定制进程参数,非常适合和内核进行交互 用户态执行prctl函数后触发prctl系统