由于本文的目标是对 Linux 内核进行介绍并探索其体系结构和主要组件,因此首先回顾一下 Linux 的简短历史,然后从较高的层次审视 Linux 内核的体系结构,最后介绍它的主要子系统。Linux 内核具有超过 600 万行的代码,因此本文不可能进行完整的介绍。请使用指向其他内容的链接进一步学习。
Linux 的简短历史
尽管 Linux 绝对是最流行的开源操作系统,但是相对于其他操作系统的漫长历史来说,Linux 的历史非常短暂。在计算机出现早期,程序员是使用硬件语言在裸硬件上进行开发的。缺少操作系统就意味着在某个时间只有一个应用程序(和一个用户)可以使用这些庞大而又昂贵的设备。早期的操作系统是在 20 世纪 50 年代开发的,用来提供简单的开发体验。包括为 IBM 701 开发的 General Motors Operating System(GMOS)和 North American Aviation 为 IBM 709 开发的 FORTRAN Monitor System(FMS)。
在 20 世纪 60 年代,MIT(Massachusetts Institute of Technology)和一些公司为 GE-645 开发了一个名为 Multics(Multiplexed
Information and Computing Service)的实验性的操作系统。这个操作系统的开发者之一 AT&T 后来退出了 Multics,并在 1970 年开发了自己的名为 Unics 的操作系统。与这个操作系统一同诞生的是 C 语言,C 语言就是为此而开发的,然后它们使用 C 语言对操作系统进行了重写,使操作系统开发具有可移植性。
二十年后,Andrew Tanenbaum 创建了一个微内核版本的 UNIX®,名为 MINIX(代表 minimal UNIX),它可以在小型的个人计算机上运行。这个开源操作系统在 20 世纪 90 年代激发了 Linus Torvalds 开发 Linux 的灵感(请参看图 1 所示)。
图 1. 主要 Linux 内核发行版简史
Linux 快速从一个个人项目进化成为一个全球数千人参与的开发项目。对于 Linux 来说,最为重要的决策之一是采用 GPL(GNU General Public License)。在 GPL 保护之下,Linux 内核可以防止商业使用,并且它还从 GNU 项目(Richard Stallman 开发,其源代码要比 Linux 内核大得多)的用户空间开发受益。这允许使用一些非常有用的应用程序,例如 GCC(GNU Compiler Collection)和各种 shell 支持。
Linux 内核简介
现在让我们从一个比较高的高度来审视一下 GNU/Linux 操作系统的体系结构。您可以从两个层次上来考虑操作系统,如图 2 所示。
图 2. GNU/Linux 操作系统的基本体系结构
最上面是用户(或应用程序)空间。这是用户应用程序执行的地方。用户空间之下是内核空间,Linux 内核正是位于这里。
GNU C Library (glibc)也在这里。它提供了连接内核的系统调用接口,还提供了在用户空间应用程序和内核之间进行转换的机制。这点非常重要,因为内核和用户空间的应用程序使用的是不同的保护地址空间。每个用户空间的进程都使用自己的虚拟地址空间,而内核则占用单独的地址空间。
更多信息,请参看 参考资料
一节中的链接。
Linux 内核可以进一步划分成 3 层。最上面是系统调用接口,它实现了一些基本的功能,例如
read
和 write
。系统调用接口之下是内核代码,可以更精确地定义为独立于体系结构的内核代码。这些代码是 Linux 所支持的所有处理器体系结构所通用的。在这些代码之下是依赖于体系结构的代码,构成了通常称为 BSP(Board
Support Package)的部分。这些代码用作给定体系结构的处理器和特定于平台的代码。
Linux 内核的属性
在讨论大型而复杂的系统的体系结构时,可以从很多角度来审视系统。体系结构分析的一个目标是提供一种方法更好地理解源代码,这正是本文的目的。
Linux 内核实现了很多重要的体系结构属性。在或高或低的层次上,内核被划分为多个子系统。Linux 也可以看作是一个整体,因为它会将所有这些基本服务都集成到内核中。这与微内核的体系结构不同,后者会提供一些基本的服务,例如通信、I/O、内存和进程管理,更具体的服务都是插入到微内核层中的。每种内核都有自己的优点,不过这里并不对此进行讨论。
随着时间的流逝,Linux 内核在内存和 CPU 使用方面具有较高的效率,并且非常稳定。但是对于 Linux 来说,最为有趣的是在这种大小和复杂性的前提下,依然具有良好的可移植性。Linux 编译后可在大量处理器和具有不同体系结构约束和需求的平台上运行。一个例子是 Linux 可以在一个具有内存管理单元(MMU)的处理器上运行,也可以在那些不提供 MMU 的处理器上运行。Linux 内核的 uClinux 移植提供了对非 MMU 的支持。更详细信息请参看
参考资料
一节的内容。
Linux 内核的主要子系统
现在使用图 3 中的分类说明 Linux 内核的主要组件。
图 3. Linux 内核的一个体系结构透视图
系统调用接口
SCI 层提供了某些机制执行从用户空间到内核的函数调用。正如前面讨论的一样,这个接口依赖于体系结构,甚至在相同的处理器家族内也是如此。SCI 实际上是一个非常有用的函数调用多路复用和多路分解服务。在 ./linux/kernel 中您可以找到 SCI 的实现,并在 ./linux/arch 中找到依赖于体系结构的部分。有关这个组件的更详细信息可以在 参考资料
一节中找到。
进程管理
进程管理的重点是进程的执行。在内核中,这些进程称为线程
,代表了单独的处理器虚拟化(线程代码、数据、堆栈和 CPU 寄存器)。在用户空间,通常使用进程
这个术语,不过 Linux 实现并没有区分这两个概念(进程和线程)。内核通过 SCI 提供了一个应用程序编程接口(API)来创建一个新进程(fork、exec 或 Portable Operating System Interface [POSIX] 函数),停止进程(kill、exit),并在它们之间进行通信和同步(signal 或者 POSIX 机制)。
进程管理还包括处理活动进程之间共享 CPU 的需求。内核实现了一种新型的调度算法,不管有多少个线程在竞争 CPU,这种算法都可以在固定时间内进行操作。这种算法就称为 O(1) 调度程序,这个名字就表示它调度多个线程所使用的时间和调度一个线程所使用的时间是相同的。 O(1) 调度程序也可以支持多处理器(称为对称多处理器或 SMP)。您可以在 ./linux/kernel 中找到进程管理的源代码,在 ./linux/arch 中可以找到依赖于体系结构的源代码。在 参考资料
一节中可以了解有关这个算法的更多内容。
内存管理
内核所管理的另外一个重要资源是内存。为了提高效率,如果由硬件管理虚拟内存,内存是按照所谓的内存页
方式进行管理的(对于大部分体系结构来说都是 4KB)。Linux 包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。
不过内存管理要管理的可不止 4KB 缓冲区。Linux 提供了对 4KB 缓冲区的抽象,例如 slab 分配器。这种内存管理模式使用 4KB 缓冲区为基数,然后从中分配结构,并跟踪内存页使用情况,比如哪些内存页是满的,哪些页面没有完全使用,哪些页面为空。这样就允许该模式根据系统需要来动态调整内存使用。
为了支持多个用户使用内存,有时会出现可用内存被消耗光的情况。由于这个原因,页面可以移出内存并放入磁盘中。这个过程称为交换
,因为页面会被从内存交换到硬盘上。内存管理的源代码可以在
./linux/mm 中找到。
虚拟文件系统
虚拟文件系统(VFS)是 Linux 内核中非常有用的一个方面,因为它为文件系统提供了一个通用的接口抽象。VFS 在 SCI 和内核所支持的文件系统之间提供了一个交换层(请参看图 4)。
图 4. VFS 在用户和文件系统之间提供了一个交换层
在 VFS 上面,是对诸如 open、close、read 和 write 之类的函数的一个通用 API 抽象。在 VFS 下面是文件系统抽象,它定义了上层函数的实现方式。它们是给定文件系统(超过 50 个)的插件。文件系统的源代码可以在 ./linux/fs 中找到。
文件系统层之下是缓冲区缓存,它为文件系统层提供了一个通用函数集(与具体文件系统无关)。这个缓存层通过将数据保留一段时间(或者随即预先读取数据以便在需要是就可用)优化了对物理设备的访问。缓冲区缓存之下是设备驱动程序,它实现了特定物理设备的接口。
网络堆栈
网络堆栈在设计上遵循模拟协议本身的分层体系结构。回想一下,Internet Protocol (IP) 是传输协议(通常称为传输控制协议或 TCP)下面的核心网络层协议。TCP 上面是 socket 层,它是通过 SCI 进行调用的。
socket 层是网络子系统的标准 API,它为各种网络协议提供了一个用户接口。从原始帧访问到 IP 协议数据单元(PDU),再到 TCP 和 User Datagram Protocol (UDP),socket 层提供了一种标准化的方法来管理连接,并在各个终点之间移动数据。内核中网络源代码可以在
./linux/net 中找到。
设备驱动程序
Linux 内核中有大量代码都在设备驱动程序中,它们能够运转特定的硬件设备。Linux 源码树提供了一个驱动程序子目录,这个目录又进一步划分为各种支持设备,例如 Bluetooth、I2C、serial 等。设备驱动程序的代码可以在 ./linux/drivers 中找到。
依赖体系结构的代码
尽管 Linux 很大程度上独立于所运行的体系结构,但是有些元素则必须考虑体系结构才能正常操作并实现更高效率。./linux/arch 子目录定义了内核源代码中依赖于体系结构的部分,其中包含了各种特定于体系结构的子目录(共同组成了 BSP)。对于一个典型的桌面系统来说,使用的是 i386 目录。每个体系结构子目录都包含了很多其他子目录,每个子目录都关注内核中的一个特定方面,例如引导、内核、内存管理等。这些依赖体系结构的代码可以在 ./linux/arch 中找到。
Linux 内核的一些有用特性
如果 Linux 内核的可移植性和效率还不够好,Linux 还提供了其他一些特性,它们无法划分到上面的分类中。
作为一个生产操作系统和开源软件,Linux 是测试新协议及其增强的良好平台。Linux 支持大量网络协议,包括典型的 TCP/IP,以及高速网络的扩展(大于 1 Gigabit Ethernet [GbE] 和 10 GbE)。Linux 也可以支持诸如流控制传输协议(SCTP)之类的协议,它提供了很多比 TCP 更高级的特性(是传输层协议的接替者)。
Linux 还是一个动态内核,支持动态添加或删除软件组件。被称为动态可加载内核模块,它们可以在引导时根据需要(当前特定设备需要这个模块)或在任何时候由用户插入。
Linux 最新的一个增强是可以用作其他操作系统的操作系统(称为系统管理程序)。最近,对内核进行了修改,称为基于内核的虚拟机(KVM)。这个修改为用户空间启用了一个新的接口,它可以允许其他操作系统在启用了 KVM 的内核之上运行。除了运行 Linux 的其他实例之外, Microsoft® Windows® 也可以进行虚拟化。惟一的限制是底层处理器必须支持新的虚拟化指令。更多信息请参看 参考资料
一节的内容。
结束语
本文对 Linux 内核体系结构及其特性和功能进行了简要介绍。有关内核的详细内容,可以参考每个 Linux 发行版中附带的 Documentation 目录。请一定查看本文末尾的 参考资料
一节,了解有关本文中所讨论主题的更详细信息。
本文转载于developerWorks,原文在这里
分享到:
相关推荐
### Linux内核分析知识点 #### 一、Linux与GNU通用公共许可证 - **知识点1:GNU通用公共许可证(GPL)** - **定义**:GNU通用公共许可证是一种开放源代码的授权方式,允许用户自由使用、复制、研究、更改及改进...
本书作者在整理自己多年研发笔记的基础上,以精心挑选的典型开发实例,向读者详细讲述了Linux内核源代码的各部分结构、原理及组成框架,主要分析了 Linux最新版本(2.6.11)的内核源代码,帮助读者深入理解Linux内核...
Linux内核分析 Linux操作系统的内核是整个系统的核心组件,它负责管理系统资源、提供系统服务和实现系统安全。 Linux内核分析是研究和分析Linux内核的架构、组件、数据结构和算法,了解内核的工作机制、性能优化和...
《Linux内核分析 0.11版内核完全注释》是一本深入解析Linux操作系统内核的专业书籍,由赵炯先生编著。该书详细注释了Linux 0.11版本的内核源码,是理解Linux内核工作原理、学习操作系统核心概念的重要参考资料。书中...
《疱丁解牛Linux内核分析》是由孟宁编著的一本深入解析Linux内核的专著,旨在帮助读者逐步掌握Linux操作系统的精髓,提升在Linux/Unix编程领域的专业技能。这本书出版于2018年10月,是自学者理解和掌握操作系统核心...
第四章,"进程管理分析",深入剖析了Linux内核中的进程管理机制。这一章将讲解进程的创建、调度、同步和通信等方面,包括fork、execve、waitpid等系统调用,信号处理,以及有名管道、套接字、共享内存等进程间通信...
《Linux内核分析》这本书由赵炯翻译,旨在帮助读者理解和探索Linux内核的源代码。作者Alessandro Rubini的这部作品对于有C语言基础和Unix概念的读者来说,是一份宝贵的资源,能引导他们深入理解Linux内核的设计与...
本文将依据提供的文件信息,详细阐述Linux内核分析的关键知识点。 首先,"Linux操作系统内核分析.pdf"很可能是对Linux内核功能、设计模式和主要组件的全面介绍。内核分析通常包括以下几个方面: 1. 进程管理:内核...
Linux内核分析与编程是IT领域中的一个深度话题,涵盖了操作系统的核心原理以及如何与之交互。Linux内核作为开源操作系统的基础,它的设计和实现对于理解系统级编程、设备驱动开发、系统性能优化等方面至关重要。以下...
### Linux内核分析方法谈 #### 一、引言 Linux作为一款开源操作系统,其内核源码的公开性吸引了无数计算机爱好者和技术人员的关注。深入分析Linux内核不仅能增进我们对计算机底层工作原理的理解,还能让我们学习到...
在"Linux内核分析及实际应用"中,我们可以探讨以下几个关键知识点: 1. **内核架构**:Linux内核采用微内核架构,主要包含进程管理、内存管理、文件系统、网络协议栈和设备驱动等模块。这些模块相互协作,确保系统...
linux内核分析资料合集,包括:linux内核完全剖析基于0.12内核、linux内核网络栈实现源代码分析、linux内核注释_v2.2.5、linux2.6内核启动分析--李枝果、怎样读linux内核源代码
《Linux内核分析与应用》课程是深入了解操作系统核心机制的重要学习资源,主要涵盖了Linux内核的多个关键领域。以下是对这些章节的详细解读: 1. **概述**:这部分通常会介绍Linux内核的历史、发展、版本管理和开源...
Linux内核分析与驱动编程是一个深入理解操作系统原理与实践的关键技术领域。本课程旨在从内核角度出发,对Linux系统的核心功能进行详细分析,并教授如何开发内核模块与驱动程序。 进程管理与调度是操作系统中非常...
本书旨在帮助读者理解操作系统的基本概念,并通过Linux内核的实例深入剖析其工作原理,为读者提供丰富的实践经验和理论知识。 在操作系统设计方面,本书涵盖了以下几个关键知识点: 1. **进程管理**:操作系统中的...
ARM Linux内核源码剖析.pdfARM Linux内核源码剖析.pdfARM Linux内核源码剖析.pdfARM Linux内核源码剖析.pdf 完整书签
Linux内核分析及编程(倪继利)PDF 1/3
Linux内核分析及常见问题解答
本书作者在整理自己多年研发笔记的基础上,以精心挑选的典型开发实例,向读者详细讲述了Linux内核源代码的各部分结构、原理及组成框架,主要分析了 Linux最新版本(2.6.11)的内核源代码,帮助读者深入理解Linux内核...