Linux 核心(一)

Linux 核心(一)
 
 www.ibmtc.pku.edu.cn/crs/kernel/kernel.htm
 
 (此文作者允许用于学术目的.)
 
 第二部分
 
 Linux 奥秘
 
 Linux 以及许多在 GNU 通用公共许可证条款的保护下发行的软件,经常被人们误认为是“免费”软件,但是,GNU GPL 条款中所谓“free”的原意实际是“自由”,也就是说,用户享有自由发行软件,修改源代码并重新发行的权利,但要求用户同样遵循这一 GPL 条款,并应赋予其他用户以相同的权利。
 
 Linux 的迅速成长与用户享有修改并发行程序新版本的“自由”权利是分不开的。现在,中国用户也可以自由获取 Linux 以及许多应用程序或程序库的源代码,但如何才能最大程度地利用 Linux 呢?显然,冲击世界 Linux 的热浪,并不仅仅因为其低廉的成本和高的性能,而主要在于其真正开放的结构和所遵循的标准,以及 Linux 爱好者和开发者所奉行的信念。由于许多原因,使 Linux 在国内的推广比国外晚了好几年,所幸的是,去年以来有更多的软件爱好者开始了 Linux 的学习。但是,仅仅了解和掌握 Linux 的使用还远远不够,要真正利用 Linux 并发挥其最大潜力,需要深刻理解 Linux 系统及其内核结构。
 
 这一部分通过对 Linux 内核的介绍,论述有关内存管理、进程、进程间通讯等方面的内容。在介绍内核组件的同时,介绍相应的系统工具。另外,也介绍了有关引导、登录以及安全性等方面的内容。各章的内容相对独立。通过这部分的学习,读者可以对 Linux 有比较深刻的理解,可为系统管理、应用开发和软件开发打下坚实的基础。
 
 阅读这部分内容,首先要求读者掌握基本的 Linux 命令,并具有一定的上机操作经验,也需要读者具备一定的 PC 硬件和软件知识,尤其是 C 语言和数据结构。初学者可参阅本书第一部分。另外,Linux 内核在不断发展,这一部分描述的内容是基于2.0.xx 版本的。本书写作的时候,流行的 Linux 发行版本所采用的 Linux 内核版本最高为 2.0.36,而最高的稳定版本是 2.2.3。
 
  第九章
 
 Linux 系统概述
 
 在详细了解 Linux 奥秘之前,本章首先向读者简单介绍 Linux 的组成部分以及作为操作系统,Linux 为用户提供的主要服务。
 
 9.1 操作系统的概念和组成部分
 
 从程序员的角度来讲,操作系统提供了一个与计算机硬件等价的扩展或虚拟的计算平台。它抽象了许多硬件细节,程序可以以某种统一的方式进行数据处理,而程序员则可以避开许多硬件细节。从另一个角度讲,普通用户则把操作系统看成是一个资源管理者,在它的帮助下,用户可以以某种易于理解的方式组织自己的数据,完成自己的工作并和其他人共享资源。
 
 实际上,操作系统一般由内核和一些系统程序组成,同时,还有一些应用程序帮助用户完成特定任务。内核是操作系统的灵魂,它负责管理磁盘上的文件、内存,负责启动并运行程序,负责从网络上接收和发送数据包等等。总而言之,操作系统实际是抽象的资源操作到具体硬件操作细节之间的接口。对 Linux 这样的多用户操作系统来说,它还需要避免用户对硬件的直接访问,并防止用户之间的互相干扰。
 
 系统程序以及其他所有的程序在内核之上运行,程序和内核之间的接口由操作系统提供的一组“抽象指令”定义,这些抽象指令称为“系统调用”。所有运行在内核之上的程序可分为系统程序和用户程序两大类,但它们统统运行在“用户模式”之下。系统程序和用户程序之间的界限是模糊的。系统程序一般指运行系统所不可缺少的程序,例如 Linux 中的 shell;而用户程序则是给用户提供特定功能的程序,例如字处理程序或游戏程序。实际的操作系统中往往还包含一些工具程序(如编译器)以及一些联机文档。
 
 9.2 Linux 内核的重要组成部分
 
 Linux 内核由如下几部分组成:内存管理、进程管理、设备驱动程序、文件系统和网络管理等。下面分别简要介绍内核的主要组成部分。
 
 9.2.1 内存管理
 
 对任何一台计算机而言,其内存以及其他资源都是有限的。为了让有限的物理内存满足应用程序对内存的大需求量,Linux 采用了称为“虚拟内存”的内存管理方式。Linux 将内存划分为容易处理的“内存页”,在系统运行过程中,应用程序对内存的需求大于物理内存时,Linux 可将暂时不用的内存页交换到硬盘上,这样,空闲的内存页可以满足应用程序的内存需求,而应用程序却不会注意到内存交换的发生。
 
 有关内存管理的详细内容在第十章中讲述。
 
 9.2.2 进程
 
 进程实际是某特定应用程序的一个运行实体。在 Linux 系统中,能够同时运行多个进程,Linux 通过在短的时间间隔内轮流运行这些进程而实现“多任务”。这一短的时间间隔称为“时间片”,让进程轮流运行的方法称为“调度”,完成调度的程序称为调度程序。通过多任务机制,每个进程可认为只有自己独占计算机,从而简化程序的编写。每个进程有自己单独的地址空间,并且只能由这一进程访问,这样,操作系统避免了进程之间的互相干扰以及“坏”程序对系统可能造成的危害。
 
 为了完成某特定任务,有时需要综合两个程序的功能,例如一个程序输出文本,而另一个程序对文本进行排序。为此,操作系统还提供进程间的通讯机制来帮助完成这样的任务。Linux 中常见的进程间通讯机制有信号、管道、共享内存、信号量和套接字等。
 
 有关进程以及进程间通讯的详细内容在第十一章中讲述。
 
 9.2.3 设备驱动程序
 
 设备驱动程序是 Linux 内核的主要部分。和操作系统的其他部分类似,设备驱动程序运行在高特权级的处理器环境中,从而可以直接对硬件进行操作,但正因为如此,任何一个设备驱动程序的错误都可能导致操作系统的崩溃。设备驱动程序实际控制操作系统和硬件设备之间的交互。设备驱动程序提供一组操作系统可理解的抽象接口完成和操作系统之间的交互,而与硬件相关的具体操作细节由设备驱动程序完成。一般而言,设备驱动程序和设备的控制芯片有关,例如,如果计算机硬盘是 SCSI 硬盘,则需要使用 SCSI 驱动程序,而不是 IDE 驱动程序。
 
 有关硬件以及设备驱动程序的详细内容在第十二章中讲述。
 
 9.2.4 文件系统
 
 和 DOS 等操作系统不同,Linux 操作系统中单独的文件系统并不是由驱动器号或驱动器名称(如 A: 或 C: 等)来标识的。相反,和 UNIX 操作系统一样,Linux 操作系统将独立的文件系统组合成了一个层次化的树形结构,并且由一个单独的实体代表这一文件系统。Linux 将新的文件系统通过一个称为“挂装”或“挂上”的操作将其挂装到某个目录上,从而让不同的文件系统结合成为一个整体。Linux 操作系统的一个重要特点是它支持许多不同类型的文件系统。Linux 中最普遍使用的文件系统是 Ext2,它也是 Linux 土生土长的文件系统。但 Linux 也能够支持 FAT、VFAT、FAT32、MINIX 等不同类型的文件系统,从而可以方便地和其他操作系统交换数据。由于 Linux 支持许多不同的文件系统,并且将它们组织成了一个统一的虚拟文件系统,因此,用户和进程不需要知道文件所在的文件系统类型,而只需要象使用 Ext2 文件系统中的文件一样使用它们。
 
 实际上,Linux 利用虚拟文件系统,把文件系统操作和不同文件系统的具体实现细节分离了开来。
 
 有关文件系统的详细内容在第十三章中讲述。
 
 9.2.5 网络
 
 Linux 和网络几乎就是同义语。Linux 实际就是 Internet 和 WWW 的产物。Linux 的开发者使用网络和 Web 进行信息交换,而 Linux 本身又用于各种组织的网络支持。众所周知,TCP/IP 协议是 Internet 的标准协议,同时也是事实上的工业标准。Linux 的网络实现支持 BSD 套接字,支持全部的 TCP/IP 协议。Linux 内核的网络部分由 BSD 套接字、网络协议层和网络设备驱动程序组成。
 
 有关网络的基本概念在第十四章中讲述。
 
 9.2.6 其他
 
 除上述主要组成部分之外,内核还包含一些一般性的任务和机制,这些任务和机制可使 Linux 内核的各个部分有效地组合在一起,它们是上述主要部分高效工作的必要保证。
 
 从结构上来讲,操作系统有微内核结构和单块结构之分,Windows NT 和 MINIX 是典型的微内核操作系统,而 Linux 则是单块结构的操作系统。微内核结构可方便地在内核中添加新的组件,而单块结构却不容易做到这一点。为此,Linux 支持可动态装载和卸载的模块。利用模块,可方便地在内核中添加新的组件或卸载不再需要的内核组件。
 
 第十五章讲述上述内核机制和模块的概念。
 
 图 9-1 说明了上述 Linux 内核的重要组成部分及其相互关系。
 
 9.3 Linux 系统的主要服务
 
 本节描述的主要服务也是 UNIX 系统所提供的主要服务,以后的各章节将详细描述这些服务。
 
 9.3.1 init
 
 init 作为每个 UNIX 系统的第一个进程而启动,同时也是引导过程中内核的最后一项工作。init 启动之后,它将继续引导过程,包括检查并加载文件系统,以及启动守护进程等。
 
 和 init 相关的概念有“单用户模式”和“多用户模式”。在“单用户模式”中,只有 root 才能登录到系统中。这两个概念常引申为“运行级别”,上述两种模式分别对应init 的两个运行级别,但 init 的运行级别有 6 个之多,其他运行级别可由应用程序使用。
 
 系统关机时,init 负责“杀掉”所有的进程,卸挂所有文件系统并终止处理器的指令执行。
 
 有关引导和关机以及 init 的详细内容将在第十六章中讲述。
 
 9.3.2 终端登录
 
 通过串行线路的终端登录和以及控制台登录(不运行 X Window时)由 getty 程序提供。init 为每个终端启动一个单独的 getty 实例。getty 读取用户名并启动 login 程序,如果用户名和口令是正确的,login 则会启动 shell 程序。如果用户注销,或由于不正确的用户名和口令而导致 login 终止,init 就会启动一个新的 getty。用户的登录完全由系统程序完成,内核不参与登录过程。
 
  
 
 图9-1 Linux 内核的重要组成部分
 
 有关登录和注销的详细内容将在这一部分第十七章中讲述。
 
 9.3.3 Syslog
 
 内核和系统程序经常会产生一些错误、警告或其他类型的消息。这些消息通常对系统管理非常重要,因此有必要记录这些消息以备将来查看。这一工作由 syslog 程序完成。syslog 可按照产生消息的程序以及消息的重要性对消息进行整理,以方便查看。
 
 9.3.4 周期命令执行:cron 和 at
 
 系统管理员或用户经常要让一些周期性的任务自动完成,以便减少日常工作量,例如,每周定时清除 /tmp 目录中的文件等。
 
 cron 是一个守护进程,它可以完成类似的工作。每个用户有一个 crontab 文件,用户可在这个文件中列出要执行的命令以及执行的时间,cron 则按照指定的时间和命令完成相应的工作。
 
 at 和 cron 类似,但是由 at 执行的命令只能执行一次而不会重复执行。
 
 9.3.5 图形用户界面
 
 Linux 并没有直接将用户界面结合到操作系统内核中,相反,用户界面由用户级的程序实现。用户界面包括字符用户界面和图形用户界面。Linux 主要使用 X Window 系统(简称为 X)作为它的图形环境,但是,X 只是一个窗口系统,它仅仅管理窗口的建立、销毁以及窗口中的图形输出,而实际的窗口管理程序则需要单独实现。窗口管理程序的不同意味着不同的图形用户界面风格,这种多样化的界面风格虽然有很大的灵活性,但是它使得用户界面的学习变得有些困难。Linux 中,常见基于 X 的用户界面风格有 Xwmf、Xwmf2、Motif以及 AfterStep 等。
 
 9.3.6 网络
 
 如前所述,Linux 支持完整的 TCP/IP 协议,许多基本的操作系统服务,例如文件系统、打印、备份等均可以通过网络实现,这使得网络的中心化管理成为可能。
 
 9.3.7 网络登录
 
 网络登录和通常的登录有一些不同。由于受到物理线路数量的限制,通过串行线路的登录数目是有限的,但是,每个网络登录可由一个单独的虚拟网络连接来代表,因此,网络登录的数量几乎不受限制。由于这一原因,不可能象终端登录一样为每个可能的网络登录运行单独的 getty。同时,网络登录的方式也是多样的,例如可使用 telnet 登录,也可使用 rlogin 登录。
 
 为此,对于所有的网络登录方式,系统运行一个守护进程(inetd),这一守护进程监听所有的网络登录。当某个用户试图登录时,守护进程会启动一个新的自身实例处理登录,而原有的进程则继续监听。新进程接下来的工作和 getty 类似。
 
 9.3.8 网络文件系统
 
 通过网络服务可实现文件的共享,通常使用由 Sun Microsystem 开发的网络文件系统,即 NFS。在网络文件系统的帮助下,程序可象处理本地文件一样处理其他计算机上的文件,这样,信息的共享非常简单,因为它不需要对程序进行额外修改。
 
 9.3.9 其他
 
 电子邮件是计算机间常见的信息交换方式,系统提供了许多程序来收发电子邮件。
 
 打印机是比较特殊的一种设备,因为同一时刻只能有一个用户使用打印机。系统通过打印队列协调多个用户对打印机的使用。当打印机正在打印时,其他的打印作业在打印队列中排队,上一个打印作业完毕后,下一个打印作业自动开始。打印队列的管理软件可将程序的打印输出假脱机到磁盘上,这样,输出打印的程序不需要等待打印结束就可以继续运行。
 
 9.4 目录树的标准布局
 
 对大多数 Linux 发行版本而言,文件系统的目录树布局遵循 FSSTND 标准。遵循这一标准有利于编写或移植软件,同时也有利于进行系统管理和维护。虽然并不强制执行 FSSTND 标准,但遵循这一标准会给日常工作带来许多好处。本节简要描述基于 FSSTND 标准的 Linux 目录树布局,有关详细内容可参阅 FSSTND 文档。
 
 完整的目录树可划分为小的部分,这些小部分又可以单独存放在自己的磁盘或分区上。这样,相对稳定的部分和经常变化的部分可单独存放在不同的分区中,从而方便备份或系统管理。目录树的主要部分有 root、/usr、/var、/home 等(图9-2)。这样的布局可方便在 Linux 计算机之间共享文件系统的某些部分。
 
  
 
 图9-2 Linux 目录树的不同部分
 
 目录树的不同部分在 Linux 系统中所扮演的角色由表 9-1 给出。
 
 表 9-1 目录树的不同部分在 Linux 系统中所扮演的角色
 
 名称
 
 角色
 
  
 
 root
 
 root 文件系统中包含和特定计算机相关的内容,因此,root 文件系统一般保存在计算机的本地硬盘中,但也可以保存在 ramdisk 或网络驱动器中。root 文件系统中的内容包括:引导系统的必备文件,文件系统的挂装信息以及系统修复工具和备份工具等。
 
  
 
 /usr
 
 /usr 文件系统中包含通常操作中不需要进行修改的命令程序文件、程序库、手册和其他文档等。由于 /usr 中的文件并不和特定的计算机相关,也不会在通常的使用中修改,因此可通过网络共享这些文件。这样,当 root 安装了新的软件之后,所有共享这一文件系统的计算机均可以使用新的软件。
 
  
 
 /var
 
 /var 文件系统中包含经常变化的文件,例如打印机、邮件、新闻等的假脱机目录、日志文件、格式化后的手册页以及临时文件等。按传统习惯,/var 的文件通常包含在在 /usr 中,但这样就无法将 /usr 文件系统挂装为只读文件系统。
 
  
 
 /home
 
 /home 中包含用户的主目录,用户的数据保存在其主目录中,如果有必要,也可将 /home 划分为不同的文件系统,例如 /home/students 和 /home/teachers 等。将 /home 放置在单独的文件系统中便于进行用户数据的备份。
 
  
 
 /proc
 
 /proc 文件系统并不保存在磁盘上,相反,操作系统在内存中创建这一文件系统。其中包含一些和系统相关的信息,例如 CPU、DMA 通道以及中断的使用信息等。
 
  
 
 上表中,目录树的不同部分又称为文件系统,但它们不必保存在单独的文件系统中。
 
 9.4.1 root 文件系统
 
 root 文件系统中包含一些关键文件,同时其内容也比较小。如果 root 文件系统被破坏,操作系统就无法正确引导。root 文件系统中包含的文件和目录见表 9-2。
 
 表 9-2 root 文件系统中的文件和目录
 
 /vmlinuz
 
 文件。系统的标准引导映象,通常以压缩形式出现。
 
  
 
 /bin
 
 包含引导过程必需的命令,也可由普通用户使用。
 
  
 
 /sbin
 
 和 /bin 类似,尽管其中的命令可由普通用户使用,但由于这些命令属于系统级命令,因此无特殊需求不使用其中的命令。
 
  
 
 /etc
 
 包含与特定计算机相关的配置文件。
 
  
 
 /root
 
 root 用户的主目录。
 
  
 
 /lib
 
 root 文件系统中的程序要使用的共享库保存在该目录中。
 
  
 
 /lib/modules
 
 包含可装载的内核模块。
 
  
 
 /dev
 
 包含设备文件。
 
  
 
 /tmp
 
 包含临时文件。引导后运行的程序应当在 /var/tmp 中保存文件,因为其中的可用空间大一些。
 
  
 
 /boot
 
 包含引导装载程序要使用的文件。内核映象通常保存在这个目录中。因为多个内核映象会占用很多磁盘空间,因此可将该目录放置在单独的文件系统中。
 
  
 
 /mnt
 
 临时文件系统的挂装点。
 
  
 
 /usr, /var, 
 
 /home, /proc
 
 其他文件系统的挂装点。
 
  
 
 9.4.2 /usr 文件系统
 
 /usr 文件系统中包含所有的程序文件以及联机文档,因此其内容通常很大。/usr 文件系统中包含的文件和目录见表 9-3。
 
 表 9-3 /usr 文件系统中的目录
 
 /usr/X11R6
 
 包含 X 窗口系统的所有文件。
 
  
 
 /usr/X386
 
 和 /usr/X11R6 类似,但包含 X11 的 Release 5。
 
  
 
 /usr/bin
 
 绝大多数用户命令。其他命令包含在 /bin 和 /usr/local/bin中。
 
  
 
 /usr/sbin
 
 root 文件系统中不需要的系统管理命令。
 
  
 
 /usr/man, /usr/info,
 
 /usr/doc
 
 分别包含手册页、GNU Info 文档以及其他杂项文档。
 
  
 
 /usr/include
 
 C 语言的头文件。
 
  
 
 /usr/lib
 
 程序和子系统所使用的不变的数据文件。
 
  
 
 /usr/local
 
 本地挂装的软件和其他文件的存放位置。
 
  
 
 9.4.3 /var 文件系统
 
 /var 通常包含系统运行过程中经常发生变化的文件。/var 文件系统中包含的目录见表 9-4。
 
 表 9-4 /var 文件系统中的目录
 
 /var/catman
 
 格式化手册页的高速缓存。
 
  
 
 /var/lib
 
 包含系统运行时经常改变的文件。
 
  
 
 /var/local
 
 安装 /usr/local 中的程序的可变数据。
 
  
 
 /var/lock
 
 包含锁文件。
 
  
 
 /var/log
 
 包含程序产生的日志文件。
 
  
 
 /var/run
 
 该目录包含在下次引导之前有效和系统相关的信息。
 
  
 
 /var/spool
 
 排队任务的假脱机目录。
 
  
 
 /var/tmp
 
 包含大的临时文件,或者保存时间较长的临时文件。
 
  
 
 9.4.4 /proc 文件系统
 
 /proc 文件系统并不保存在磁盘上,相反,操作系统在内存中创建这一文件系统。/proc 文件系统中包含的文件和目录见表 9-5。
 
 表 9-5 /proc 文件系统中的文件和目录
 
 /proc/1
 
 该目录中包含进程号为 1 的进程信息。每个进程在 /proc 目录下有一个以自己的进程号为名称的目录。
 
  
 
 /proc/cpuinfo
 
 有关 CPU 名称、型号、性能和类型的信息。
 
  
 
 /proc/devices
 
 当前内核中的设备驱动程序列表。
 
  
 
 /proc/dma
 
 当前使用的 DMA 通道。
 
  
 
 /proc/filesystems
 
 内核支持的文件系统。
 
  
 
 /proc/interrupts
 
 当前使用的中断信息。
 
  
 
 /proc/ioports
 
 当前使用的 I/O 端口。
 
  
 
 /proc/kcore
 
 系统物理内存的映象。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值