一、内核简介
内核:在计算机科学中是一个拿来管理软件发出的数据I/O(输入与输出)要求的计算机程序,将那些要求转译为数据处理的指令并交由中央处理器(CPU)及计算机中其他电子组件进行处理,是现代操作系统中最基本的部份。它是为诸多应用程序提供对计算机硬件的安全访问的一部份软件,这些访问是有限的,并由内核决定一个程序在哪些时侯对某部份硬件操作多长时间。直接对硬件操作是十分复杂的。所以内核一般提供一种硬件具象的方式,来完成这种操作。通过进程间通讯机制及系统调用,应用进程可间接控制所需的硬件资源(非常是处理器及IO设备)。
图1:GNU/Linux操作系统的基本体系结构
最前面是用户(或应用程序)空间。这是用户应用程序执行的地方。用户空间之下是内核空间,Linux内核正是坐落这儿。
GNUCLibrary(glibc)也在这儿。它提供了联接内核的系统调用插口,还提供了在用户空间应用程序和内核之间进行转换的机制。这点十分重要,由于内核和用户空间的应用程序使用的是不同的保护地址空间。每位用户空间的进程都使用自己的虚拟地址空间,而内核则占用单独的地址空间。
Linux内核可以进一步界定成3层。最前面是系统调用插口,它实现了一些基本的功能,比如read和write。系统调用插口之下是内核代码,可以更精确地定义为独立于体系结构的内核代码。这种代码是Linux所支持的所有处理器体系结构所通用的。在这种代码之下是依赖于体系结构的代码,构成了一般称为BSP(BoardSupportPackage)的部份。这种代码用作给定体系结构的处理器和特定于平台的代码。
二、Linux内核的子系统
图2:Linux内核的一个体系结构透视图
2.1系统调用插口
SCI层提供了个别机制执行从用户空间到内核的函数调用。这个插口依赖于体系结构linux内核24版源代码分析大全,甚至在相同的处理器家族内也是这么。SCI实际上是一个十分有用的函数调用多路复用和多路分解服务。在./linux/kernel中您可以找到SCI的实现,并在./linux/arch中找到依赖于体系结构的部份。
2.2进程管理
进程管理的重点是进程的执行。在内核中,这种进程称为线程,代表了单独的处理器虚拟化(线程代码、数据、堆栈和CPU寄存器)。在用户空间,一般使用进程这个术语,不过Linux实现并没有分辨这两个概念(进程和线程)。内核通过SCI提供了一个应用程序编程插口(API)来创建一个新进程(fork、exec或PortableOperatingSystemInterface[POSIX]函数),停止进程(kill、exit),并在它们之间进行通讯和同步(signal或则POSIX机制)。
2.3显存管理
内核所管理的另外一个重要资源是显存。为了提升效率,若果由硬件管理虚拟显存,显存是根据所谓的显存页形式进行管理的(对于大部份体系结构来说都是4KB)。Linux包括了管理可用显存的方法,以及数学和虚拟映射所使用的硬件机制。
2.4虚拟文件系统
虚拟文件系统(VFS)是Linux内核中十分有用的一个方面,由于它为文件系统提供了一个通用的插口具象。VFS在SCI和内核所支持的文件系统之间提供了一个交换层。
图3:VFS在用户和文件系统之间提供了一个交换层
在VFS里面,是对例如open、close、read和write之类的函数的一个通用API具象。在VFS下边是文件系统具象,它定义了下层函数的实现方法。它们是给定文件系统(超过50个)的插件。文件系统的源代码可以在./linux/fs中找到。
文件系统层之下是缓冲区缓存,它为文件系统层提供了一个通用函数集(与具体文件系统无关)。这个缓存层通过将数据保留一段时间(或则随后预先读取数据便于在须要是就可用)优化了对化学设备的访问。缓冲区缓存之下是设备驱动程序,它实现了特定化学设备的插口。
2.5网路堆栈
网路堆栈在设计上依循模拟合同本身的分层体系结构。回想一下,InternetProtocol(IP)是传输合同(一般称为传输控制合同或TCP)下边的核心网路层合同。TCP里面是socket层linux内核24版源代码分析大全,它是通过SCI进行调用的。
socket层是网路子系统的标准API,它为各类网路合同提供了一个用户插口。从原始帧访问到IP合同数据单元(PDU),再到TCP和UserDatagramProtocol(UDP),socket层提供了一种标准化的方式来管理联接,并在各个终点之间联通数据。内核中网路源代码可以在./linux/net中找到。
2.6设备驱动程序
inux内核中有大量代码都在设备驱动程序中,它们就能运转特定的硬件设备。Linux源码树提供了一个驱动程序子目录,这个目录又进一步界定为各类支持设备,比如Bluetooth、I2C、serial等。设备驱动程序的代码可以在./linux/drivers中找到。
三、内核的分类
内核在设计上分为宏内核与微内核两大架构。
3.1宏内核
宏内核:是在硬件之上,定义了一个高阶的具象插口,应用子句或系统调用来实现操作系统的功能,比如:进程管理、文件系统和储存管理等,这种功能由多个运行在内核上的模块来完成。
虽然每一个模块都是单独地服务那些操作,内核代码是高度集成的,并且无法编撰正确。由于所有的模块都在同一个内核空间上运行,一个很小的bug就会使整个系统崩溃。但是,假若开发顺利,单内核结构就可以从运行效率上得到益处。
好多现代的宏内核结构内核,如Linux和FreeBSD内核,才能在运行时将模块调入执行,这就可以使扩展内核的功能显得更简单,也可以使内核的内核部份显得更简练。
图4:宏内核示意图
宏内核结构的事例:
传统Unix内核:BSD、Solaris
类Unix系统(Unix-like)内核:FreeBSD、OpenBSD、NetBSD、Linux
DOS:DR-DOS
3.2微内核
微内核:是由一个特别简单的硬件具象层层和一组比较关键的子句或系统调用促使,这种解释器,仅仅包括了创建一个系统必需的几个部份;如线程管理,地址空间和行程间通信等。
微核的目标是将系统服务的实现和系统的基本操作规则分离开来。诸如,进程的输入/输出锁定服务可以由运行在微核之外的一个服务组件来提供。那些特别模块化的用户态服务器用于完成操作系统中比较中级的操作,这样的设计使内核中最内核的部份的设计更简单。一个服务组件的失效并不会造成整个系统的崩溃,内核须要做的北京linux培训,仅仅是重新启动这个组件,而毋须影响其它的部份
微内核将许多OS服务倒入分离的进程,如文件系统,设备驱动程序,而进程通过消息传递调用OS服务。微内核结构必然是多线程的,第一代微内核,在内核提供了较多的服务,因而被称为'胖微内核',它的典型代表是Mach,它是MacOSX的内核,可以说,蒸蒸日上。第二代微内核只提供最基本的OS服务,典型的OS是QNXlinux更改ip地址,QNX在黑莓手机BlackBerry10系统中被采用。
图5:微内核示意图
微内核结构的事例:AIX、BeOS、L4微内核系列、Mach(用于XNU、GNUHurd)、Minix