1.5.1 Linux内核的体系结构
图1-2所示为一个完整操作系统最基本的视图,由此可见,内核的作用是将应用程序和硬件分离开。
内核的主要任务是负责与计算机硬件进行交互,实现对硬件的编程控制和接口操作,调度对硬件资源的访问。除此之外,内核为用户应用程序提供一个高级的执行环境和访问硬件的虚拟接口。其实提供硬件的兼容性是内核的设计目标之一,几乎所有的硬件都可以得到Linux的支持,只要不是为其他操作系统所定制。
与硬件兼容性相关的是可移植性,即在不同的硬件平台上运行Linux的能力。从最初只支持标准IBM兼容机上的Intel X86架构到现在可以支持Alpha、ARM、MIPS、PowerPC等几乎所有硬件平台,如此广泛的平台支持之所以能够成功,部分原因在于内核清晰地划分了体系相关部分和体系无关部分。
图1-3所示为Linux操作系统的基本视图。由此可见,Linux内核分为如下两部分。
(1)体系相关部分。这部分内核为体系结构和硬件所特有。
(2)体系无关部分。这部分内核是可移植的。体系无关部分通常会定义与体系相关部分的接口,这样,内核向新的体系结构移植的过程就变成确认这些接口的特性并将它们加以实现的过程。
图1-2 操作系统的基本视图
图1-3 Linux操作系统的基本视图
用户应用程序和内核之间的联系是通过它和内核的中间层——标准C库来实现,标准C库函数是建立在内核提供的系统调用基础上的。通过标准C库,以及内核体系无关部分与体系相关部分的接口,用户应用程序和部分内核都成为可移植的。根据上述描述,下面给出Linux操作系统的标准视图,具体如图1-4所示。
图1-4 Linux系统的标准视图
在上述Linux系统的标准视图中,主要构成模块的具体说明如下。
(1)系统调用接口
为了与用户应用程序进行交互,内核提供了一组系统调用接口,应用程序通过这组接口可以访问系统硬件和各种操作系统资源。系统调用接口层在用户应用程序和内核之间添加一个中间层,在此扮演一个函数调用多路复用和多路分解器的角色。
(2)进程管理
进程管理负责创建和销毁进程,并处理它们之间的互相联系(进程间通信),同时负责安排调度它们去分享CPU。进程管理部分实现了一个进程世界的抽象,这个进程世界类似人类世界,只不过我们人类世界里的个体是人,而在进程世界里则是一个一个的进程,人与人之间通过书信、手机、网络等进行交互,而各个进程之间则是通过不同方式的进程间通信,我们所有人都在分享同一个地球,而所有进程都在分享一个或多个CPU。
(3)内存管理
在进程世界里,内存是重要的资源之一。因此,管理内存的策略与方式是决定系统性能的一个关键因素。内核的内存管理部分根据不同的需要,提供了包括malloc/free在内的许多简单或者复杂的接口,并为每个进程都提供了一个虚拟的地址空间,基本上实现虚拟内存对进程的按需分配。
(4)虚拟文件系统
虚拟文件系统为用户空间提供了文件系统接口,同时又为各个具体的文件系统提供通用的接口抽象。在VFS上面,是对诸如open、close、read和write之类函数的一个通用API抽象,在VFS下面则是具体的文件系统,它们定义了上层函数的实现方式。
通过虚拟文件系统,用户可以利用标准的Linux文件系统调用对不同介质上的不同文件系统进行操作。应该说,VFS是内核在各种具体的文件系统上建立的一个抽象层,它提供一个通用的文件系统模型,而该模型囊括了用户所能想到的所有文件系统的行为。
(5)网络功能
网络子系统处理数据包的收集、标识、分发,路由和地址的解析等所有网络有关的操作。socket层是网络子系统的标准API,它为各种网络协议提供一个用户接口。
(6)设备驱动程序
操作系统的目的在于为用户提供一种方便访问硬件的途径,因此,几乎每一个系统操作最终都会映射到物理的硬件设备上。除了CPU、内存等有限的几个对象,所有设备的访问控制操作都要由相关的代码来完成,这些代码就是所谓的设备驱动程序。
(7)代码
这里的代码需要依赖体系结构,因为部分内核代码是体系相关的,在“./linux/arch”子目录中定义内核源代码中依赖于体系结构的部分,其中包含对应各种特定体系结构的子目录。比如,对于一个典型的桌面系统来说,使用的是i386目录。
每个特定体系结构对应的子目录又包含很多下级子目录,分别关注内核中的一个特定方面,如引导、内核、内存管理等。