Linux系统的核心是内核。内核控制着计算机系统上的所有硬件和软件,在必要时分配硬件,
并根据需要执行软件。

如果你一直都在关注Linux世界,肯定听说过Linus Torvalds。Linus还在赫尔辛基大学上学时
就开发了第一版Linux内核。起初他只是想仿造一款Unix系统而已,因为当时Unix操作系统在很
多大学都很流行。

Linus完成了开发工作后,将Linux内核发布到了互联网社区,并征求改进意见。这个简单的
举动引发了计算机操作系统领域内的一场革命。很快,Linus就收到了来自世界各地的学生和专
业程序员的各种建议。

如果谁都可以修改内核程序代码,那么随之而来的将是彻底的混乱。为了简单起见,Linus
担当起了所有改进建议的把关员。能否将建议代码并入内核完全取决于Linus。时至今日,这种
概念依然在Linux内核代码开发过程中沿用,不同的是,现在是由一组开发人员来做这件事,而
不再是Linus一个人。

内核主要负责以下四种功能:

  1. 系统内存管理
  2. 软件程序管理
  3. 硬件设备管理
  4. 文件系统管理

后面几节将会进一步探究以上每一种功能。

1. 系统内存管理

操作系统内核的主要功能之一就是内存管理。内核不仅管理服务器上的可用物理内存,还可以创建和管理虚拟内存(即实际并不存在的内存)。

内核通过硬盘上的存储空间来实现虚拟内存,这块区域称为交换空间(swap space)。内核不断地在交换空间和实际的物理内存之间反复交换虚拟内存中的内容。这使得系统以为它拥有比物
理内存更多的可用内存(如图1-2所示)。
image.png
内存存储单元按组划分成很多块,这些块称作页面(page)。内核将每个内存页面放在物理
内存或交换空间。然后,内核会维护一个内存页面表,指明哪些页面位于物理内存内,哪些页面
被换到了磁盘上。

内核会记录哪些内存页面正在使用中,并自动把一段时间未访问的内存页面复制到交换空间
区域(称为换出,swapping out)——即使还有可用内存。当程序要访问一个已被换出的内存页
面时,内核必须从物理内存换出另外一个内存页面给它让出空间,然后从交换空间换入请求的内
存页面。显然,这个过程要花费时间,拖慢运行中的进程。只要Linux系统在运行,为运行中的
程序换出内存页面的过程就不会停歇。

2. 软件程序管理

Linux操作系统将运行中的程序称为进程。进程可以在前台运行,将输出显示在屏幕上,也
可以在后台运行,隐藏到幕后。内核控制着Linux系统如何管理运行在系统上的所有进程。

内核创建了第一个进程(称为init进程)来启动系统上所有其他进程。当内核启动时,它会
将init进程加载到虚拟内存中。内核在启动任何其他进程时,都会在虚拟内存中给新进程分配一
块专有区域来存储该进程用到的数据和代码。
一些Linux发行版使用一个表来管理在系统开机时要自动启动的进程。在Linux系统上,这个
表通常位于专门文件/etc/inittab中。

另外一些系统(比如现在流行的Ubuntu Linux发行版)则采用/etc/init.d目录,将开机时启动
或停止某个应用的脚本放在这个目录下。这些脚本通过/etc/rcX.d目录下的入口(entry)①启动,
这里的X代表运行级(run level)。

① 这些入口实际上是到/etc/init.d目录中启动脚本的符号链接。——译者注(后文若无特殊说明,脚注均为“译者 注”。)

Linux操作系统的init系统采用了运行级。运行级决定了init进程运行/etc/inittab文件或
/etc/rcX.d目录中定义好的某些特定类型的进程。Linux操作系统有5个启动运行级。

运行级为1时,只启动基本的系统进程以及一个控制台终端进程。我们称之为单用户模式。
单用户模式通常用来在系统有问题时进行紧急的文件系统维护。显然,在这种模式下,仅有一个
人(通常是系统管理员)能登录到系统上操作数据。

标准的启动运行级是3。在这个运行级上,大多数应用软件,比如网络支持程序,都会启动。
另一个Linux中常见的运行级是5。在这个运行级上系统会启动图形化的X Window系统,允许用
户通过图形化桌面窗口登录系统。

Linux系统可以通过调整启动运行级来控制整个系统的功能。通过将运行级从3调整成5,系
统就可以从基于控制台的系统变成更先进的图形化X Window系统。

在第4章,你将会学习如何使用ps命令查看当前运行在Linux系统上的进程。

3. 硬件设备管理

内核的另一职责是管理硬件设备。任何Linux系统需要与之通信的设备,都需要在内核代码
中加入其驱动程序代码。驱动程序代码相当于应用程序和硬件设备的中间人,允许内核与设备之
间交换数据。在Linux内核中有两种方法用于插入设备驱动代码:

  1. 编译进内核的设备驱动代码
  2. 可插入内核的设备驱动模块

以前,插入设备驱动代码的唯一途径是重新编译内核。每次给系统添加新设备,都要重新编
译一遍内核代码。随着Linux内核支持的硬件设备越来越多,这个过程变得越来越低效。不过好
在Linux开发人员设计出了一种更好的将驱动代码插入运行中的内核的方法。

开发人员提出了内核模块的概念。它允许将驱动代码插入到运行中的内核而无需重新编译内
核。同时,当设备不再使用时也可将内核模块从内核中移走。这种方式极大地简化和扩展了硬件
设备在Linux上的使用。

Linux系统将硬件设备当成特殊的文件,称为设备文件。设备文件有3种分类:

  1. 字符型设备文件
  2. 块设备文件
  3. 网络设备文件


字符型设备文件是指处理数据时每次只能处理一个字符的设备。大多数类型的调制解调器和
终端都是作为字符型设备文件创建的。块设备文件是指处理数据时每次能处理大块数据的设备,
比如硬盘。
网络设备文件**是指采用数据包发送和接收数据的设备,包括各种网卡和一个特殊的回环设
备。这个回环设备允许Linux系统使用常见的网络编程协议同自身通信。

Linux为系统上的每个设备都创建一种称为节点的特殊文件。与设备的所有通信都通过设
备节点完成。每个节点都有唯一的数值对供Linux内核标识它。数值对包括一个主设备号和一
个次设备号。类似的设备被划分到同样的主设备号下。次设备号用于标识主设备组下的某个特
定设备。

4. 文件系统管理

不同于其他一些操作系统,Linux内核支持通过不同类型的文件系统从硬盘中读写数据。除
了自有的诸多文件系统外,Linux还支持从其他操作系统(比如Microsoft Windows)采用的文件
系统中读写数据。内核必须在编译时就加入对所有可能用到的文件系统的支持。表1-1列出了
Linux系统用来读写数据的标准文件系统。

表1-1 Linux文件系统
文件系统 描 述
ext Linux扩展文件系统,最早的Linux文件系统
ext2 第二扩展文件系统,在ext的基础上提供了更多的功能
ext3 第三扩展文件系统,支持日志功能
ext4 第四扩展文件系统,支持高级日志功能
hpfs OS/2高性能文件系统
jfs IBM日志文件系统
iso9660 ISO 9660文件系统(CD-ROM)
minix MINIX文件系统
msdos 微软的FAT16
ncp Netware文件系统
nfs 网络文件系统
ntfs 支持Microsoft NT文件系统
proc 访问系统信息
ReiserFS 高级Linux文件系统,能提供更好的性能和硬盘恢复功能
smb 支持网络访问的Samba SMB文件系统
sysv 较早期的Unix文件系统
ufs BSD文件系统
umsdos 建立在msdos上的类Unix文件系统
vfat Windows 95文件系统(FAT32)
XFS 高性能64位日志文件系统

Linux服务器所访问的所有硬盘都必须格式化成表1-1所列文件系统类型中的一种。
Linux内核采用虚拟文件系统(Virtual File System,VFS)作为和每个文件系统交互的接口。
这为Linux内核同任何类型文件系统通信提供了一个标准接口。当每个文件系统都被挂载和使用
时,VFS将信息都缓存在内存中。