支持这个网站。捐。
Search
内核(操作系统)
有关其他用途,请参阅内核(消歧)。
“内核(计算)”重定向到这里。有关其他用途,请参阅内核(消歧)。
“核心(计算机科学)”重定向到这里。不要与Compute内核,内核方法或内核(图像处理)混淆。
该内核是一个计算机程序是计算机的核心操作系统,拥有系统的一切完全控制。[1]在大多数系统中,它是启动时加载的第一个程序之一(在引导加载程序之后)。它处理剩余的启动以及来自软件的输入/输出请求,将它们转换为中央处理单元的数据处理指令。它处理内存和外围设备,如键盘,显示器,打印机和扬声器。
内核将应用程序软件连接到计算机的硬件。
内核的关键代码通常被加载到一个单独的内存区域,该区域受到应用程序或操作系统的其他不太关键的部分的访问保护。内核在此受保护的内核空间中执行其任务,例如运行进程,管理硬盘等硬件设备以及处理中断。相比之下,浏览器,文字处理器或音频或视频播放器等应用程序使用单独的内存区域,即用户空间。这种分离可以防止用户数据和内核数据相互干扰并导致不稳定和缓慢,[1] 以及防止故障应用程序崩溃整个操作系统。
内核的接口是一个低级 抽象层。当进程发出内核请求时,它被称为系统调用。内核设计在管理这些系统调用和资源方面有所不同。一个单内核上运行的所有操作系统的指令在同一地址空间的速度。甲微内核运行在用户空间多数工艺中,[2]为模块化。[3]
内容
功能
资源管理
内存管理
设备管理
系统调用
内核设计决策
内核支持保护的问题
基于硬件或基于语言的保护
流程合作
I / O设备管理
内核范围的设计方法
单片内核
微内核
单片内核与微内核
性能
混合(或模块化)内核
Nanokernels
Exokernels
内核开发的历史
早期的操作系统内核
分时操作系统
的Amiga
Unix的
苹果系统
微软Windows
IBM主管
开发微内核
也可以看看
笔记
参考
进一步阅读
外部链接
功能
内核的主要功能是调解对计算机资源的访问,包括:[4]
中央处理器(CPU)
计算机系统的这个中心组件负责运行或执行程序。内核负责随时决定应将多个正在运行的程序中的哪一个分配给处理器。
随机存取存储器(RAM)
随机存取存储器用于存储程序指令和数据。通常,两者都需要存在于存储器中以便程序执行。通常,多个程序需要访问内存,通常需要比计算机可用内存更多的内存。内核负责决定每个进程可以使用哪个内存,并在没有足够内存可用时确定要执行的操作。
输入/输出(I / O)设备
I / O设备包括键盘,鼠标,磁盘驱动器,打印机,USB设备,网络适配器和显示设备等外围设备。内核从应用程序分配请求以执行适当设备的I / O,并提供使用设备的便捷方法(通常抽象到应用程序不需要知道设备的实现细节的点)。
资源管理
资源管理所必需的关键方面是执行域(地址空间)的定义以及用于调解域内资源访问的保护机制。[4]内核还提供了同步和进程间通信(IPC)的方法。这些实现可能在内核本身内,或者内核也可以依赖于它正在运行的其他进程。尽管内核必须提供进程间通信以便提供对彼此提供的工具的访问,但内核还必须为运行程序提供访问这些工具的请求的方法。
内存管理
更多信息:内存管理(操作系统)
内核具有对系统内存的完全访问权限,并且必须允许进程根据需要安全地访问此内存。通常,执行此操作的第一步是虚拟寻址,通常通过分页和/或分段来实现。虚拟寻址允许内核使给定的物理地址看起来是另一个地址,即虚拟地址。对于不同的进程,虚拟地址空间可能不同; 一个进程在特定(虚拟)地址访问的内存可能与另一个进程在同一地址访问的内存不同。这允许每个程序的行为就好像它是唯一一个(除内核之外)运行,从而防止应用程序相互崩溃。[5]
在许多系统上,程序的虚拟地址可能指的是当前不在内存中的数据。虚拟寻址提供的间接层允许操作系统使用其他数据存储(如硬盘驱动器)来存储否则必须保留在主存储器(RAM)中的数据存储。因此,操作系统可以允许程序使用比系统实际可用的内存更多的内存。当程序需要当前不在RAM中的数据时,CPU向内核发出已发生这种情况的信号,并且内核通过将非活动内存块的内容写入磁盘(如果需要)并将其替换为请求的数据来响应。该程序。然后可以从停止的程序恢复该程序。这种方案通常被称为请求分页。
虚拟寻址还允许在两个脱节区域中创建内存的虚拟分区,一个用于内核(内核空间),另一个用于应用程序(用户空间)。处理器不允许应用程序处理内核内存,从而防止应用程序损坏正在运行的内核。这种存储空间的基本划分对实际通用内核的当前设计贡献很大,并且在这样的系统中几乎是通用的,尽管一些研究内核(例如,奇点)采用其他方法。
设备管理
要执行有用的功能,进程需要访问连接到计算机的外围设备,这些外围设备由内核通过设备驱动程序控制。设备驱动程序是使操作系统能够与硬件设备交互的计算机程序。它为操作系统提供了如何控制和与某个硬件通信的信息。驱动程序是程序应用程序的重要组成部分。驱动程序的设计目标是抽象; 驱动程序的功能是将OS强制的抽象函数调用(编程调用)转换为特定于设备的调用。理论上,设备应该与合适的驱动器一起正常工作。设备驱动程序用于诸如视频卡,声卡,打印机,扫描仪,调制解调器和LAN卡之类的设备。设备驱动程序的常见抽象级别是:
1.在硬件方面:
直接连接。
使用高级接口(视频BIOS)。
使用较低级别的设备驱动程序(使用磁盘驱动程序的文件驱动程序)
使用硬件模拟工作,同时做一些完全不同的事情。
2.在软件方面:
允许操作系统直接访问硬件资源。
仅实现原语。
实现非驱动程序软件的接口(例如:TWAIN)。
实现一种语言,有时是高级语言(例如PostScript)。
例如,为了向用户显示屏幕上的内容,应用程序将向内核发出请求,内核会将请求转发给其显示驱动程序,然后显示驱动程序负责实际绘制字符/像素。[5]
内核必须维护可用设备的列表。该列表可以提前知道(例如,在可用硬件改变的情况下将重写内核的嵌入式系统上),由用户配置(典型地在旧PC上和非设计用于个人用途的系统上)或由操作系统在运行时(通常称为即插即用)。在即插即用系统中,设备管理器首先在不同的硬件总线上执行扫描,例如外围组件互连(PCI)或通用串行总线(USB),以检测已安装的设备,然后搜索适当的驱动程序。
由于设备管理是一个特定于操作系统的主题,每种内核设计对这些驱动程序的处理方式不同,但在每种情况下,内核都必须提供I / O以允许驱动程序通过某些端口或内存物理访问其设备地点。在设计设备管理系统时必须做出非常重要的决定,因为在某些设计中,访问可能涉及上下文切换,使得操作非常占用CPU并且容易导致显着的性能开销。[ 引证需要 ]
系统调用
主要文章:系统调用
在计算中,系统调用是进程从操作系统内核请求服务的方式,它通常不具有运行权限。系统调用提供进程和操作系统之间的接口。与系统交互的大多数操作需要用户级进程不可用的权限,例如,使用系统上存在的设备执行的I / O,或者与其他进程的任何形式的通信都需要使用系统调用。
系统调用是应用程序用来从操作系统请求服务的机制。它们使用机器代码指令使处理器改变模式。一个例子是从管理员模式到保护模式。这是操作系统执行访问硬件设备或内存管理单元等操作的地方。通常,操作系统提供位于操作系统和普通程序之间的库。通常它是一个C库,如Glibc或Windows API。该库处理将信息传递给内核并切换到管理程序模式的低级细节。系统调用包括关闭,打开,读取,等待和写入。
要实际执行有用的工作,进程必须能够访问内核提供的服务。这由每个内核以不同方式实现,但大多数提供C库或API,后者又调用相关的内核函数。[6]
调用内核函数的方法因内核而异。如果正在使用内存隔离,则用户进程无法直接调用内核,因为这会违反处理器的访问控制规则。一些可能性是:
使用软件模拟中断。此方法适用于大多数硬件,因此非常常见。
使用呼叫门。调用门是由内核存储在处理器已知位置的内核存储器的列表中的特殊地址。当处理器检测到对该地址的调用时,它会重定向到目标位置,而不会导致访问冲突。这需要硬件支持,但硬件很常见。
使用特殊的系统调用指令。这种技术需要特殊的硬件支持,常见的架构(尤其是x86)可能缺乏这种支持。然而,系统调用指令已添加到x86处理器的最新型号中,并且一些PC操作系统在可用时使用它们。
使用基于内存的队列。生成大量请求但不需要等待每个请求的应用程序的应用程序可能会将请求的详细信息添加到内核区域定期扫描以查找请求的内存区域。
内核设计决策
内核支持保护的问题
设计内核时的一个重要考虑因素是它提供了对故障(容错)和恶意行为(安全性)的保护。这两个方面通常没有明确区分,并且在内核设计中采用这种区别会导致拒绝保护的分层结构。[4]
内核提供的机制或策略可以根据几个标准进行分类,包括:静态(在编译时强制执行)或动态(在运行时强制执行); 先发制人或后检测; 根据他们满足的保护原则(例如Denning [7] [8]); 它们是硬件支持还是基于语言; 他们是更多的开放机制还是具有约束力的政策; 还有很多。
通常使用CPU模式实现对分层保护域[9]的支持。
许多内核提供“功能”的实现,即提供给用户代码的对象,允许对内核管理的底层对象的有限访问。文件处理中会出现一个常见的例子:文件是存储在永久存储设备上的信息的表示。内核可能能够执行许多不同的操作(例如,读取,写入,删除或执行文件内容),但是仅允许用户级应用程序执行这些操作中的一些(例如,可能只允许读取文件) 。这种情况的一个常见实现是内核向应用程序提供一个对象(通常称为“文件句柄”),然后应用程序可以调用操作,内核在请求操作时检查该操作的有效性。
提供硬件功能支持的一种有效且简单的方法是委派MMU负责检查每次内存访问的访问权限,这种机制称为基于能力的寻址。[10]大多数商业计算机体系结构缺乏对功能的MMU支持。
另一种方法是使用通常支持的分层域来模拟功能; 在这种方法中,每个受保护对象必须驻留在应用程序无权访问的地址空间中; 内核还维护这种内存中的功能列表。当应用程序需要访问受功能保护的对象时,它会执行系统调用,然后内核检查应用程序的功能是否授予它执行请求的操作的权限,如果允许,则执行对它的访问(直接,或者将请求委托给另一个用户级进程)。地址空间切换的性能成本限制了这种方法在对象之间复杂交互的系统中的实用性,[11] [12] 保护机制不支持固件但是在更高级别进行模拟的方法(例如,通过在没有直接支持的硬件上操作页表来模拟功能)是可能的,但是存在性能影响。[13]但是,对于选择使用基于语言的保护的系统,缺乏硬件支持可能不是问题。[14]
一个重要的内核设计决策是选择应该实现安全机制和策略的抽象级别。内核安全机制在支持更高级别的安全性方面发挥着关键作用。[10] [15] [16] [17] [18]
一种方法是使用固件和内核支持来实现容错(参见上文),并在此基础上构建恶意行为的安全策略(在必要时添加加密机制等功能),将一些责任委托给编译器。将安全策略的实施委派给编译器和/或应用程序级别的方法通常称为基于语言的安全性。
当前主流操作系统中缺少许多关键安全机制阻碍了在应用程序抽象级别实施适当的安全策略。[15]事实上,计算机安全中的一个常见误解是,无论内核支持如何,任何安全策略都可以在应用程序中实现。[15]
基于硬件或基于语言的保护
当今典型的计算机系统使用硬件强制规则来规定允许哪些程序访问哪些数据。处理器监视执行并停止违反规则的程序(例如,即将读取或写入内核存储器的用户进程,等等)。在缺乏功能支持的系统中,通过使用单独的地址空间将进程彼此隔离。[19]通过要求用户进程使用上述系统调用方法之一来调节从用户进程到内核的调用。
另一种方法是使用基于语言的保护。在基于语言的保护系统中,内核只允许执行由可信语言编译器生成的代码。然后可以设计该语言,使得程序员不可能指示它做违反安全要求的事情。[14]
这种方法的优点包括:
无需单独的地址空间。在地址空间之间切换是一个缓慢的操作,导致大量开销,并且当前执行了许多优化工作以防止当前操作系统中不必要的切换。在基于语言的保护系统中完全不需要切换,因为所有代码都可以安全地在相同的地址空间中操作。
灵活性。可以使用该方法实现可以设计为通过编程语言表达的任何保护方案。保护方案的改变(例如,从分层系统到基于能力的系统)不需要新的硬件。
缺点包括:
更长的应用程序启动时间。应用程序在启动时必须进行验证,以确保它们已由正确的编译器编译,或者可能需要从源代码或字节码重新编译。
不灵活的类型系统。在传统系统上,应用程序经常执行非类型安全的操作。在基于语言的保护系统中不允许执行此类操作,这意味着应用程序可能需要重写,并且在某些情况下可能会失去性能。
具有基于语言的保护的系统示例包括JX和Microsoft的Singularity。
流程合作
Edsger Dijkstra证明,从逻辑的角度来看,在二进制信号量上运行的原子 锁和解锁操作足以表达过程协作的任何功能。[20]然而,这种方法通常在安全性和效率方面缺乏,而消息传递方法更灵活。[21] 还有许多其他方法(较低或较高级别),许多现代内核为共享内存和远程过程调用等系统提供支持。
I / O设备管理
作为并行协作过程,I / O设备与其他过程统一处理的内核的想法最初是由Brinch Hansen提出并实现的(尽管1967年提出了类似的想法[22] [23])。在Hansen对此的描述中,“常见”过程称为内部过程,而I / O设备称为外部过程。[21]
与物理内存类似,允许应用程序直接访问控制器端口和寄存器可能导致控制器出现故障或系统崩溃。有了这个,根据设备的复杂性,一些设备可能会出乎意料地编程复杂,并使用几个不同的控制器。因此,提供更抽象的界面来管理设备非常重要。此接口通常由设备驱动程序或硬件抽象层完成。应用程序通常需要访问这些设备。内核必须通过以某种方式查询系统来维护这些设备的列表。这可以通过BIOS或通过各种系统总线(例如PCI / PCIE或USB)之一来完成。当应用程序请求设备上的操作(例如显示字符)时,内核需要将此请求发送到当前活动视频驱动程序。反过来,视频驱动程序需要执行此请求。这是进程间通信(IPC)的一个例子。
内核范围的设计方法
当然,上面列出的任务和特征可以以许多方式提供,这些方式在设计和实现方面彼此不同。
机制和政策分离的原则是微观和单一核心哲学之间的重大差异。[24] [25]这里的机制是允许实施许多不同政策的支持,而政策是一种特殊的“运作模式”。例如,一种机制可以提供用户登录尝试来调用授权服务器以确定是否应该授予访问权限; 策略可以是授权服务器请求密码并根据存储在数据库中的加密密码进行检查。由于该机制是通用的,因此可以更容易地更改策略(例如,通过要求使用安全令牌而不是机制和政策是否集成在同一模块中。
在最小的微内核中只包含一些非常基本的策略,[25]它的机制允许在内核(操作系统的剩余部分和其他应用程序)上运行的内容决定采用哪些策略(作为内存管理,高级进程调度,文件系统管理等)。[4] [21]单片内核往往包含许多策略,因此限制系统的其余部分依赖它们。
Per Brinch Hansen提出了支持机制和政策分离的论据。[4] [21]未能正确实现这种分离是现有操作系统缺乏实质性创新的主要原因之一,[4]这是计算机体系结构中常见的问题。[26] [27] [28]单片设计由“内核模式”/“用户模式”架构保护方法(技术上称为分层保护域)引起,这在传统商业系统中很常见; [29]实际上,各模块需要保护因此优选包含到内核中。[29]单片设计与“特权模式”之间的这种联系可以重新解决机制 - 政策分离的关键问题; [4]事实上,“特权模式”架构方法将保护机制与安全策略融合在一起,而主要的替代架构方法,基于能力的寻址,明确区分两者,自然导致微内核设计[4](见保护和安全的分离)。
虽然单片内核在相同的地址空间(内核空间)中执行所有代码,但微内核尝试在用户空间中运行其大部分服务,旨在提高代码库的可维护性和模块性。[3]大多数内核并不完全适合这些类别中的一个,而是在这两个设计之间找到。这些被称为混合内核。有更多奇特的设计,如超微内核和外包,但很少用于生产系统。的Xen的管理程序,例如,是一个外核。
单片内核
主要文章:单片内核
整体内核的图
在单片内核中,所有OS服务都与主内核线程一起运行,因此也驻留在相同的内存区域中。这种方法提供了丰富而强大的硬件访问。一些开发人员,比如UNIX开发人员Ken Thompson,认为它比微内核“更容易实现单片内核” [30]。单片内核的主要缺点是系统组件之间的依赖关系 - 设备驱动程序中的错误可能会使整个系统崩溃 - 以及大型内核可能变得非常难以维护的事实。
单片内核传统上由类Unix操作系统使用,包含所有操作系统核心功能和设备驱动程序。这是UNIX系统的传统设计。单片内核是一个单独的程序,包含执行每个与内核相关的任务所需的所有代码。大多数程序无法放入库中的每个部分都在内核空间中:设备驱动程序,调度程序,内存处理,文件系统,网络堆栈。许多系统调用都提供给应用程序,以允许它们访问所有这些服务。单片内核虽然最初加载了可能不需要的子系统,但可以调整到与硬件专门设计的内核一样快或更快的程度,尽管在一般意义上更相关。Linux和FreeBSD都属于类Unix操作系统,它具有在运行时加载模块的能力,从而可以根据需要轻松扩展内核的功能,同时有助于最大限度地减少内核空间中运行的代码量。在整体内核中,一些优势取决于以下几点:
由于涉及的软件较少,因此速度更快。
因为它是一个单独的软件,它在源代码和编译形式中应该更小。
较少的代码通常意味着更少的错误可以转化为更少的安全问题。
单片内核中的大多数工作都是通过系统调用完成的。这些接口通常以表格结构保存,可访问内核中的某些子系统,例如磁盘操作。基本上是在程序内进行调用,并且通过系统调用传递请求的已检查副本。因此,旅行不远。整体Linux内核可以做得非常小,不仅因为它能够动态加载模块,而且还因为它易于定制。实际上,有些版本足够小,可以与单个软盘上的大量实用程序和其他程序配合使用,并且仍然提供功能齐全的操作系统(其中最受欢迎的是muLinux))。这种使其内核小型化的能力也导致Linux在嵌入式系统中的使用迅速增长。
这些类型的内核包括操作系统的核心功能和能够在运行时加载模块的设备驱动程序。它们提供了丰富而强大的底层硬件抽象。它们提供一小组简单的硬件抽象,并使用称为服务器的应用程序来提供更多功能。这种特殊方法定义了硬件上的高级虚拟接口,通过一组系统调用来实现操作系统服务,例如在管理程序模式下运行的多个模块中的进程管理,并发和内存管理。这种设计有几个缺陷和局限:
内核中的编码可能具有挑战性,部分原因是因为不能使用公共库(如全功能的libc),并且因为需要使用像gdb这样的源级调试器。通常需要重新启动计算机。这不仅仅是开发人员方便的问题。当调试更难,并且随着困难变得越来越强烈,代码变得越来越“笨拙”。
内核的一部分中的错误具有强烈的副作用; 由于内核中的每个函数都具有所有权限,因此一个函数中的错误可能会破坏另一个完全不相关的内核或任何正在运行的程序的数据结构。
内核通常变得非常大并且难以维护。
即使为这些操作提供服务的模块与整体分离,代码集成也很紧凑,并且难以正确执行。
由于模块在相同的地址空间中运行,因此错误会导致整个系统崩溃。
单片内核不可移植; 因此,必须为每个要使用操作系统的新体系结构重写它们。
在微内核方法中,内核本身仅提供允许执行服务器的基本功能,单独的程序承担以前的内核功能,例如设备驱动程序,GUI服务器等。
微内核
主要文章:微内核
Microkernel(也缩写为μK或uK)是描述操作系统设计方法的术语,通过该方法,系统的功能从传统的“内核”移出,进入通过“最小”内核进行通信的一组“服务器” ,尽可能少地留在“系统空间”中,并尽可能地留在“用户空间”中。专为特定平台或设备设计的微内核只能拥有它需要的操作。微内核方法包括定义硬件上的简单抽象,使用一组基元或系统调用来实现最小的OS服务,如内存管理,多任务处理和进程间通信。其他服务(包括通常由内核提供的服务,例如网络)在用户空间程序(称为服务器)中实现。微内核比单片内核更容易维护,但是大量的系统调用和上下文切换可能会降低系统速度,因为它们通常比普通函数调用产生更多的开销。
只有真正需要处于特权模式的部分才在内核空间中:IPC(进程间通信),基本调度程序或调度原语,基本内存处理,基本I / O原语。现在,许多关键部分都在用户空间中运行:完整的调度程序,内存处理,文件系统和网络堆栈。微内核被发明为对传统“单片”内核设计的反应,其中所有系统功能都放在一个以处理器的特殊“系统”模式运行的静态程序中。在微内核中,仅执行最基本的任务,例如能够访问一些(不一定是全部)硬件,管理存储器并协调进程之间的消息传递。一些使用微内核的系统是QNX和HURD。在QNX的情况下和Hurd用户会话可以是系统本身或视图的整个快照。微内核架构的本质说明了它的一些优点:
维护通常更容易。
可以在单独的实例中测试修补程序,然后交换以接管生产实例。
无需重启内核即可测试快速开发时间和新软件。
一般情况下更持久,如果一个实例变为干线,通常可以用操作镜替代它。
大多数微内核使用某种消息传递系统来处理从一个服务器到另一个服务器的请求。消息传递系统通常使用微内核以端口为基础进行操作。例如,如果发送了更多内存的请求,则会打开一个端口,其中包含微内核并发送请求。一旦进入微内核,这些步骤就类似于系统调用。其基本原理是它将在系统架构中带来模块化,这将需要更清洁的系统,更容易调试或动态修改,可根据用户的需求进行定制,以及更高的性能。它们是GNU Hurd,MINIX,MkLinux,QNX和Redox OS等操作系统的一部分。虽然微内核本身非常小,但结合它们所需的所有辅助代码,它们实际上通常比单片内核更大。单片内核的倡导者还指出,微内核系统的双层结构,其中大多数操作系统不直接与硬件交互,在系统效率方面产生了不显着的成本。这些类型的内核通常只提供最小的服务,例如定义内存地址空间,进程间通信(IPC)和进程管理。其他功能(如运行硬件进程)不是由微内核直接处理的。微内核的支持者指出那些单片内核的缺点是内核中的错误可能导致整个系统崩溃。然而,
内核提供的其他服务(如网络)在称为服务器的用户空间程序中实现。服务器允许通过简单地启动和停止程序来修改操作系统。例如,对于没有网络支持的计算机,网络服务器未启动。进出内核以在各种应用程序和服务器之间移动数据的任务会产生开销,与单片内核相比,这会对微内核的效率产生不利影响。
然而,存在微内核中的缺点。有些是:
运行内存占用量更大
需要更多用于接口的软件,存在性能损失的可能性。
消息传递错误可能更难修复,因为他们必须采取更长的行程,而不是单片内核中的一次性副本。
一般来说,流程管理可能非常复杂。
微内核的缺点是基于上下文。例如,它们适用于小型单一用途(和关键)系统,因为如果需要运行的流程不多,则可以有效地减轻流程管理的复杂性。
微内核允许将操作系统的其余部分实现为以高级语言编写的普通应用程序,并在同一个未更改的内核之上使用不同的操作系统。[21]还可以在操作系统之间动态切换并同时激活多个活动系统。[21]
单片内核与微内核
随着计算机内核的发展,其可信计算基础的规模和漏洞也在增长; 并且,除了降低安全性之外,还存在扩大存储器占用空间的问题。通过完善虚拟内存系统可以在一定程度上缓解这种情况,但并非所有计算机体系结构都具有虚拟内存支持。[31]为了减少内核的占用空间,必须进行大量编辑以小心地删除不需要的代码,这对于具有数百万行代码的内核部分之间的非显而易见的相互依赖性来说可能非常困难。
到20世纪90年代初,由于单片内核与微内核的各种缺点,几乎所有操作系统研究人员都认为单片内核已经过时了。[ 引证需要 ]因此,Linux作为单片内核而不是微内核的设计是Linus Torvalds和Andrew Tanenbaum之间着名辩论的主题。[32]在Tanenbaum-Torvalds辩论中提出的论点双方都有其优点。
性能
单片内核旨在将所有代码放在相同的地址空间(内核空间)中,一些开发人员认为这是提高系统性能所必需的。[33]一些开发人员还认为,如果写得好,单片系统效率极高。[33]所述的单片模型趋向于更有效的[34]通过使用共享存储器内核,而不是微内核设计的慢IPC系统,该系统通常是基于消息传递。[ 引证需要 ]
在20世纪80年代和90年代初期,微内核的性能都很差。[35] [36]然而,经验性地测量这些微核的性能的研究没有分析这种低效率的原因。[35]这些数据的解释留给了“民间传说”,假设它们是由于从“内核模式”切换到“用户模式”,[35]到交互频率增加的频率增加。- 进程通信[35]以及上下文切换频率的增加。[35]
实际上,正如1995年所猜测的那样,微内核性能不佳的原因可能是:(1)整个微内核方法的实际效率低下,(2)在这些微内核中实现的特定概念,以及(3)这些概念的具体实施。[35]因此,仍然如果建立一个高效的微内核的溶液,待研究不像以前的尝试中,应用正确的构造技术。[35]
另一方面,导致单片内核[29]设计的分层保护域体系结构每次在不同的保护级别之间存在交互时(即,当进程必须同时操纵数据结构时)具有显着的性能缺陷。 ‘用户模式’和’管理员模式’),因为这需要按值复制消息。[37]
到20世纪90年代中期,大多数研究人员已经放弃了这样一种信念,即仔细调整可以显着减少这种开销,[ 引证需要 ]但最近,针对性能优化的新型微内核,如L4 [38]和K42已经解决了这些问题。[ 需要验证 ]
该混合核方法结合了速度,并用微内核的模块性和执行安全单内核的简单的设计。
混合(或模块化)内核
主要文章:混合内核
混合内核用于大多数商业操作系统,如Microsoft Windows NT 3.1,NT 3.5,NT 3.51,NT 4.0,2000,XP,Vista,7,8,8.1和10. Apple Inc自己的macOS使用称为混合内核的混合内核XNU基于来自OSF / 1的Mach内核(OSFMK 7.3)[39]和FreeBSD的单片内核的代码。它们类似于微内核,除了它们在内核空间中包含一些额外的代码以提高性能。这些内核代表了一些开发人员在证明纯微内核可以提供高性能之前实现的折衷。这些类型的内核是微内核的扩展,具有单片内核的一些属性。与单片内核不同,这些类型的内核无法在运行时自行加载模块。混合内核是微内核,在内核空间中具有一些“非必要”代码,以使代码比在用户空间中运行更快。混合内核是单片和微内核设计之间的折衷。)在内核空间中,以减少传统微内核的性能开销,但仍然将内核代码(例如设备驱动程序)作为用户空间中的服务器运行。
许多传统的单片内核现在至少添加(如果不是主动利用)模块功能。这些内核中最着名的是Linux内核。模块化内核本质上可以包含内核中的部分内核二进制文件或二进制文件,可根据需要加载到内存中。值得注意的是,代码受污染的模块有可能破坏正在运行的内核的稳定性。在讨论微内核时,许多人在这一点上感到困惑。可以在完全独立的存储空间中为微内核编写驱动程序,并在“上线”之前对其进行测试。当加载内核模块时,它会通过向其添加所需内容来访问单片部分的内存空间,从而打开可能污染的门户。模块化(或)混合内核的一些优点是:
可以在模块内运行的驱动程序的开发时间更快。测试不需要重新启动(假设内核不稳定)。
随需应变能力与花费时间重新编译整个内核,用于新驱动程序或子系统等。
更快地整合第三方技术(与开发相关但仍然与之相关)。
通常,模块使用某种模块接口与内核通信。接口是通用的(尽管特定于给定的操作系统),因此并不总是可以使用模块。通常,设备驱动程序可能需要比模块接口提供的更多灵活性。本质上,它是两个系统调用,通常只需要在单片内核中执行一次安全检查,现在可以完成两次。模块化方法的一些缺点是:
随着更多接口的传递,存在增加错误的可能性(这意味着更多的安全漏洞)。
在处理符号差异等问题时,维护模块可能会使某些管理员感到困惑。
Nanokernels
主要文章:Nanokernel
纳米内核几乎将所有服务(包括中断控制器或定时器等最基本的服务)委托 给设备驱动程序,以使内核内存需求甚至小于传统的微内核。[40]
Exokernels
主要文章:Exokernel
Exokernels是一种仍然是实验性的操作系统设计方法。它们与其他类型的内核的不同之处在于它们的功能仅限于原始硬件的保护和多路复用,不提供用于开发应用程序的硬件抽象。硬件保护与硬件管理的这种分离使应用程序开发人员能够确定如何最有效地使用每个特定程序的可用硬件。
Exokernel本身非常小。但是,它们还附带了库操作系统(另请参见unikernel),为应用程序开发人员提供了传统操作系统的功能。基于exokernel的系统的一个主要优点是它们可以包含多个库操作系统,每个操作系统都导出不同的API,例如一个用于高级UI开发,一个用于实时控制。
内核开发的历史
早期的操作系统内核
主要文章:操作系统的历史
严格地说,运行计算机不需要操作系统(因此,内核)。程序可以直接在“裸机”机器上加载和执行,前提是这些程序的作者愿意在没有任何硬件抽象或操作系统支持的情况下工作。大多数早期的计算机在20世纪50年代和60年代早期以这种方式运行,这些计算机在执行不同程序之间被重置和重新加载。最终,程序加载器和调试器等小型辅助程序在运行之间留在内存中,或从ROM加载。随着这些开发,它们构成了早期操作系统内核的基础。所述“裸机”今天仍在某些视频游戏控制台和嵌入式系统中使用这种方法,[41]但一般来说,较新的计算机使用现代操作系统和内核。
1969年,RC 4000多道程序设计系统引入了一个小核的系统设计理念,“在这个核心上可以有序地构建用于不同目的的操作系统”,[42]这就是所谓的微内核方法。
分时操作系统
主要文章:分时
在Unix之前的十年中,计算机的功耗已经大大增加 - 计算机运营商正在寻找新的方法让人们在他们的机器上利用业余时间。在这个时代,一个主要的发展是分时,一些用户可以获得一小部分计算机时间,其速度似乎是每个用户都连接到他们自己的,速度较慢的机器上。[43]
分时系统的发展导致了许多问题。一个是用户,特别是在正在开发系统的大学,似乎想破解系统以获得更多的CPU时间。出于这个原因,安全性和访问控制成为1965年Multics项目的主要焦点。[44]另一个持续的问题是正确处理计算资源:用户大部分时间都在盯着终端并考虑输入什么而不是实际输入使用计算机的资源,分时系统应该在这些时间段内为活动用户提供CPU时间。最后,系统通常提供存储器层次结构几层深,分割这种昂贵的资源导致了虚拟内存系统的重大发展。
的Amiga
主要文章:AmigaOS
该准将 Amiga的发布于1985年,是最早-当然最成功的-家用电脑配备了先进的核心架构。AmigaOS内核的执行组件exec.library使用微内核消息传递设计,但还有其他内核组件,如graphics.library,可以直接访问硬件。没有内存保护,内核几乎总是在用户模式下运行。在内核模式下只执行特殊操作,用户模式应用程序可以要求操作系统在内核模式下执行其代码。
Unix的
主要文章:Unix
类Unix系统的前身/后继系列关系图
在Unix的设计阶段,程序员决定将每个高级设备建模为文件,因为他们认为计算的目的是数据转换。[45]
例如,打印机在已知位置表示为“文件” - 当数据被复制到文件时,打印出来。提供类似功能的其他系统倾向于在较低级别虚拟化设备 - 也就是说,设备和文件都是某些较低级别概念的实例。在文件级虚拟化系统允许用户使用其现有的文件管理实用程序和概念来操纵整个系统,从而大大简化了操作。作为相同范例的扩展,Unix允许程序员使用一系列小程序来操作文件,使用管道的概念,允许用户分阶段完成操作,通过一系列单用途工具提供文件。虽然最终结果是相同的,但以这种方式使用较小的程序可以显着提高灵活性以及易于开发和使用,允许用户通过添加或删除链中的程序来修改其工作流程。
在Unix模型中,操作系统由两部分组成:第一部分是驱动大多数操作的大量实用程序; 第二,运行程序的内核。[45]在Unix下,从编程的角度来看,两者之间的区别相当薄弱; 内核是一个以管理员模式运行的程序,[46]作为组成系统其余部分的小型实用程序的程序加载器和管理程序,并为这些程序提供锁定和I / O服务; 除此之外,内核根本没有干预用户空间。
多年来,计算模型发生了变化,Unix将所有内容视为文件或字节流的处理不再像以前那样普遍适用。虽然终端可以被视为文件或字节流,它被打印或读取,但对于图形用户界面来说似乎并非如此。网络化带来了另一个问题。即使可以将网络通信与文件访问进行比较,低级别的面向数据包的体系结构也处理离散的数据块而不是整个文件。随着计算机能力的增长,Unix变得越来越混乱代码。这也是因为Unix内核的模块化可以广泛扩展。[47]虽然内核在七十年代和八十年代可能拥有100,000 行代码,但像Linux这样的现代Unix继承者的内核拥有超过1300万行代码。[48]
现代Unix衍生产品通常基于模块加载单片内核。这方面的例子是Linux内核的许多发行版以及Berkeley Software Distribution变种内核,如FreeBSD,DragonflyBSD,OpenBSD,NetBSD和macOS。除了这些替代方案之外,业余开发人员还维护着一个活跃的操作系统开发社区,其中包含自编的业余内核,这些内核最终会与Linux,FreeBSD,DragonflyBSD,OpenBSD或NetBSD内核共享许多功能和/或与它们兼容。[49]
苹果系统
主要文章:经典Mac OS和macOS
Apple于1984年首次推出其经典的Mac OS,与其Macintosh 个人电脑捆绑在一起。Apple在Mac OS 8.6中采用了超微内核设计。与此相反,现代macOS(最初名为Mac OS X)基于Darwin,它使用称为XNU的混合内核,它是通过组合4.3BSD内核和Mach内核创建的。[50]
微软Windows
主要文章:Microsoft Windows的历史
Microsoft Windows于1985年首次发布,作为MS-DOS的附加组件。由于它依赖于另一个操作系统,Windows 95之前的初始版本被认为是一个操作环境(不要与操作系统混淆)。该产品线在20世纪80年代和90年代继续发展,Windows 9x系列增加了32位寻址和抢先式多任务处理; 但随着2000年Windows Me的发布而结束。
微软还开发了Windows NT,这是一个具有非常相似接口的操作系统,但是面向高端和商业用户。这一行从1993年发布的Windows NT 3.1开始,随着2001年10月Windows XP的发布向一般用户介绍- 用完全不同的,更复杂的操作系统取代Windows 9x。这是继续使用Windows 10的产品线。
Windows NT内核的体系结构被认为是混合内核,因为内核本身包含诸如Window Manager和IPC Managers之类的任务,以及客户端/服务器分层子系统模型。[51]
IBM主管
监督程序或监督程序是计算机程序,通常是操作系统的一部分,它控制其他例程的执行并调节工作调度,输入/输出操作,错误操作和类似功能,并调节数据处理系统中的工作流程。。
从历史上看,这个术语基本上与IBM从OS / 360开始的大型机操作系统系列相关联。在其他操作系统中,管理程序通常称为内核。
在20世纪70年代,IBM进一步从硬件中抽象出管理员状态,从而形成了一个支持完全虚拟化的虚拟机管理程序,即在同一台机器上完全独立运行多个操作系统的能力。因此,第一个这样的系统被称为虚拟机或VM。
开发微内核
尽管1985年至1994年在卡内基梅隆大学开发的Mach是最着名的通用微内核,但其他微内核已经开发出更具体的目标。创建L4微内核系列(主要是L3和L4内核)以证明微内核不一定很慢。[38]像Fiasco和Pistachio这样的新实现能够在单独的地址空间中的其他L4进程旁边运行Linux。[52] [53]
此外,QNX是一种微内核,主要用于嵌入式系统,[54]和开源软件 MINIX,虽然最初是为教育目的而创建的,现在专注于成为一个高度可靠和自我修复的微内核操作系统。
也可以看看
操作系统内核的比较
进程间通信
笔记
^ a b “内核”。林佛。贝尔维尤Linux用户组。检索2016 年9月15日。
^ cf. 守护进程(计算)
^ a b Roch 2004
^ a b c d e f g h Wulf 1974 pp.337-345
^ a b Silberschatz 1991
^ Tanenbaum,Andrew S.(2008)。现代操作系统(第3版)。普伦蒂斯霍尔。第50-51页。国际标准书号 978-0-13-600663-3。。。。几乎所有系统调用都是通过调用库过程从C程序调用的。。。图书馆程序。。。执行TRAP指令以从用户模式切换到内核模式并开始执行。。。
^ Denning 1976
^ Swift 2005,第29页引用:“隔离,资源控制,决策验证(检查)和错误恢复。”
^ 施罗德72
^ a b Linden 76
^ Stephane Eranian和David Mosberger, IA-64 Linux内核中的虚拟内存,Prentice Hall PTR,2002
^ Silberschatz&Galvin,操作系统概念,第4版,第445和446页
^ Hoch,查尔斯; JC Browne(1980年7月)。“PDP-11/45上的功能实现”。ACM SIGOPS操作系统评论。14(3):22-32。doi:10.1145 / 850697.850701。
^ a b 基于语言的安全方法,Schneider F.,Morrissett G.(康奈尔大学)和Harper R.(卡内基梅隆大学)
^ a b c P. A. Loscocco,SD Smalley,PA Muckelbauer,RC Taylor,SJ Turner和JF Farrell。失败的必然性:现代计算环境中有缺陷的安全假设存档 2007-06-21在Wayback机器上。“第21届国家信息系统安全会议论文集”,第303-314页,1998年10月。[1]。
^ J. Lepreau等人。本地操作系统与全球应用的持久相关性。第7届ACM SIGOPS会议记录Eurcshelf / book001 / book001.html信息安全:综合集文集,IEEE Comp。1995年。
^ J.安德森,计算机安全技术计划研究存档 2011-07-21在Wayback机器,空军当选。系统部门,ESD-TR-73-51,1972年10月。
^ * Jerry H. Saltzer; Mike D. Schroeder(1975年9月)。“保护计算机系统中的信息”。IEEE会议记录。63(9):1278-1308。CiteSeerX 10.1.1.126.9257。doi:10.1109 / PROC.1975.9939。
^ Jonathan S. Shapiro; 乔纳森史密斯; David J. Farber(1999)。“EROS:快速能力系统”。第十七届ACM操作系统原理研讨会论文集。33(5):170-185。doi:10.1145 / 319344.319163。
^ Dijkstra,EW合作顺序过程。数学。Dep。,Technological U.,Eindhoven,1965年9月。
^ a b c d e f Brinch Hansen 70 pp.238-241
^ “SHARER,CDC 6600的分时系统” 。检索2007-01-07。
^ “动态监督员 - 他们的设计和建筑” 。检索2007-01-07。
^ Baiardi 1988
^ a b 莱文75
^ Denning 1980
^ JürgenNehmer操作系统的不朽,或者:操作系统的研究是否仍然合理?计算机科学讲义; 卷。563. 90年代及以后国际操作系统讲习班的会议记录。pp.77-83(1991) ISBN 3-540-54987-0 [2]引用:“过去25年来,对操作系统架构的研究对现有的主流[原文如此 ]系统产生了轻微的影响。”
^ Levy 84,第1页引述:“虽然计算机应用程序的复杂性每年都在增加,但应用程序的底层硬件架构几十年来一直保持不变。”
^ a b c Levy 84,第1页引用:“传统架构支持单一特权操作模式。这种结构导致单片设计;任何需要保护的模块必须是单个操作系统内核的一部分。相反,如果是任何模块可以在受保护的域内执行,系统可以构建为任何用户都可以扩展的独立模块的集合。“
^ “开源:开源革命的声音”。1-56592-582-3。1999年3月29日。
^ 虚拟寻址最常通过内置内存管理单元实现。
^ 关于Torvalds和Tanenbaum之间争论的记录可以在 dina.dk 找到。存档 2012-10-03在 Wayback Machine, groups.google.com, oreilly.com和 Andrew Tanenbaum的网站
^ a b 马修罗素。“什么是达尔文(以及它如何为Mac OS X提供动力)”。奥莱利媒体。 引用:“单片内核的紧密耦合特性使其能够非常有效地利用底层硬件[…]微内核,另一方面,在用户区运行更多核心流程。[…]不幸的是,这些好处的代价是微内核必须通过称为上下文切换的进程将大量信息传入和传出内核空间。上下文切换引入了相当大的开销,因此导致性能损失。
^ “操作系统/内核模型 - Wikiversity”。en.wikiversity.org。
^ a b c d e f g Liedtke 95
^ Härtig97
^ Hansen 73,第7.3节第233页“不同保护级别之间的相互作用需要按值传输消息 ”
^ a b “L4微内核系列 - 概述”。os.inf.tu-dresden.de。
^ Apple WWDC视频(2017年2月19日)。“Apple WWDC 2000 Session 106 - Mac OS X:Kernel” - 通过YouTube。
^ KeyKOS Nanokernel Architecture 归档 2011-06-21在 Wayback机器
^ 球:嵌入式微处理器设计,p。129
^ Hansen 2001(os),第17-18页
^ “BACJ版本的C.ACM Unix纸”。bell-labs.com。
^ FJorbató和VA Vissotsky对Multics系统的介绍和概述。
^ a b “单一Unix规范”。开放组。2016-10-04 原版存档。检索2016-09-29。
^ 最高权限级别在不同体系结构中具有各种名称,例如管理程序模式,内核模式,CPL0,DPL0,环0等。有关详细信息,请参阅 Ring(计算机安全性)。
^ “Unix的复仇”。asymco.com。2010年9月29日。
^ Linux内核2.6:它值得更多!,David A. Wheeler,2004年10月12日
^ 这个社区主要聚集在 Bona Fide OS Development, Mega-Tokyo留言板和其他操作系统爱好者网站上。
^ XNU:核心归档 2011-08-12在 Wayback机器
^ “Windows - Microsoft Windows 10 Home&Pro OS,笔记本电脑,PC,平板电脑等的官方网站”。windows.com。
^ “Fiasco微内核 - 概述”。os.inf.tu-dresden.de。
^ Zoller(inaktiv),亨氏(2013年12月7日)。“L4Ka - L4Ka项目”。www.l4ka.org。
^ “QNX操作系统”。blackberry.qnx.com。
参考
罗奇,本杰明(2004年)。“单片内核与微内核” (PDF)。源自2006-11-01 的原始版 (PDF)。检索2006-10-12。
亚伯拉罕的Silberschatz ; 詹姆斯·彼得森; Peter B. Galvin(1991)。操作系统概念。马萨诸塞州波士顿:Addison-Wesley。页。696. ISBN 978-0-201-51379-0。
Ball,Stuart R.(2002)[2002]。嵌入式微处理器系统:Real World Designs(第一版)。爱思唯尔科学。国际标准书号 978-0-7506-7534-5。
Deitel,Harvey M.(1984)[1982]。操作系统介绍(重新编辑第一版)。Addison-Wesley出版社。页。673. ISBN 978-0-201-14502-1。
Denning,Peter J.(1976年12月)。“容错操作系统”。ACM计算调查。8(4):359-389。doi:10.1145 / 356678.356680。ISSN 0360-0300。
Denning,Peter J.(1980年4月)。“为什么不在计算机架构方面进行创新?” ACM SIGARCH计算机体系结构新闻。8(2):4-7。doi:10.1145 / 859504.859506。ISSN 0163-5964。
Hansen, Per Brinch (April 1970). “The nucleus of a Multiprogramming System”. Communications of the ACM. 13 (4): 238–241. CiteSeerX 10.1.1.105.4204. doi:10.1145/362258.362278. ISSN 0001-0782.
Hansen, Per Brinch (1973). Operating System Principles. Englewood Cliffs: Prentice Hall. p. 496. ISBN 978-0-13-637843-3.
Hansen, Per Brinch (2001). “The evolution of operating systems” (PDF). Retrieved 2006-10-24. included in book: Per Brinch Hansen, ed. (2001). “1” (PDF). Classic operating systems: from batch processing to distributed systems. New York: Springer-Verlag. pp. 1–36. ISBN 978-0-387-95113-3.
Hermann Härtig, Michael Hohmuth, Jochen Liedtke, Sebastian Schönberg, Jean Wolter The performance of μ-kernel-based systems, Härtig, Hermann; Hohmuth, Michael; Liedtke, Jochen; Schönberg, Sebastian (1997). “The performance of μ-kernel-based systems”. Proceedings of the sixteenth ACM symposium on Operating systems principles - SOSP '97. p. 66. CiteSeerX 10.1.1.56.3314. doi:10.1145/268998.266660. ISBN 978-0897919166. ACM SIGOPS Operating Systems Review, v.31 n.5, p. 66–77, Dec. 1997
Houdek,ME,Soltis,FG和Hoffman,RL 1981.IBM System / 38支持基于能力的寻址。在第八届ACM国际计算机体系结构研讨会论文集中。ACM / IEEE,第341-348页。
英特尔公司(2002)IA-32架构软件开发人员手册,第1卷:基础架构
Levin,R。; 科恩,E。; Corwin,W。; 波拉克,F。; Wulf,William(1975)。“九头蛇的政策/机制分离”。关于操作系统原理的ACM研讨会/第五届ACM操作系统原理研讨会论文集。9(5):132-140。doi:10.1145 / 1067629.806531。
Levy,Henry M.(1984)。基于能力的计算机系统。梅纳德,马萨诸塞州:数字出版社。国际标准书号 978-0-932376-22-0。
Liedtke,Jochen。关于μ-Kernel Construction,Proc。第15届ACM操作系统原理研讨会(SOSP),1995年12月
Linden,Theodore A.(1976年12月)。“支持安全性和可靠软件的操作系统结构”。ACM计算调查。8(4):409-445。doi:10.1145 / 356678.356682。ISSN 0360-0300。,“支持安全性和可靠软件的操作系统结构” (PDF)。检索2010-06-19。
Lorin, Harold (1981). Operating systems. Boston, Massachusetts: Addison-Wesley. pp. 161–186. ISBN 978-0-201-14464-2.
Schroeder, Michael D.; Jerome H. Saltzer (March 1972). “A hardware architecture for implementing protection rings”. Communications of the ACM. 15 (3): 157–170. doi:10.1145/361268.361275. ISSN 0001-0782.
Shaw, Alan C. (1974). The logical design of Operating systems. Prentice-Hall. p. 304. ISBN 978-0-13-540112-5.
Tanenbaum, Andrew S. (1979). Structured Computer Organization. Englewood Cliffs, New Jersey: Prentice-Hall. ISBN 978-0-13-148521-1.
Wulf, W.; E. Cohen; W. Corwin; A. Jones; R. Levin; C. Pierson; F. Pollack (June 1974). “HYDRA: the kernel of a multiprocessor operating system”(PDF). Communications of the ACM. 17 (6): 337–345. doi:10.1145/355616.364017. ISSN 0001-0782. Archived from the original (PDF) on 2007-09-26. Retrieved 2007-07-18.
Baiardi, F.; A. Tomasi; M. Vanneschi (1988). Architettura dei Sistemi di Elaborazione, volume 1 (in Italian). Franco Angeli. ISBN 978-88-204-2746-7.
Swift, Michael M.; Brian N. Bershad; Henry M. Levy. Improving the reliability of commodity operating systems (PDF).
Gettys, James; Karlton, Philip L.; McGregor, Scott (1990). “Improving the reliability of commodity operating systems”. Software: Practice and Experience. 20: S35–S67. doi:10.1002/spe.4380201404. Retrieved 2010-06-19.
“ACM Transactions on Computer Systems (TOCS), v.23 n.1, p. 77–110, February 2005”. Missing or empty |url= (help)
Further reading
Andrew Tanenbaum, Operating Systems – Design and Implementation (Third edition);
Andrew Tanenbaum, Modern Operating Systems (Second edition);
Daniel P. Bovet, Marco Cesati, The Linux Kernel;
David A. Peterson, Nitin Indurkhya, Patterson, Computer Organization and Design, Morgan Koffman(ISBN 1-55860-428-6);
B.S. Chalk, Computer Organisation and Architecture, Macmillan P.(ISBN 0-333-64551-0).
External links
维基大约有学习资源内核模式的
操作系统/内核模型
大多数流行的操作系统内核之间的详细比较