Linux内核剖析 之 历史和体系结构分析

Linux 内核剖析 之 历史和体系结构分析

      Linux 内核是一个庞大而复杂的操作系统的核心,不过尽管庞大,但是却采用子系统和分层的概念很好地进行了组织。在本文中,您将探索 Linux 内核的总体结构,并学习一些主要的子系统和核心接口。您还可以通过其他 IBM 文章的链接更深入地进行学习。

      由于本文的目标是对 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年开发了自己的名为Unix的操作系统。与这个操作系统一同诞生的是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 全球站点上的 英文原文
  • GNU 站点 介绍了 GNU GPL,它涵盖了 Linux 内核及其附带的大量有用的应用程序。另外还介绍了一个比 GPL 限制更少的许可 Lesser GPL (LGPL)。
  • UNIX
    MINIX
    Linux 在 Wikipedia 上都有介绍,另外还详细介绍了操作系统系列。
  • GNU C Library,即 glibc,是标准 C 库的实现。它用于 GNU/Linux 操作系统,也可用于GNU/Hurd
    微内核操作系统。
  • uClinux 是 Linux 内核的一个移植,它可以在一些缺少 MMU 的系统上执行。这允许 Linux 内核在很小的嵌入式平台上运行,例如 PalmPilot PalmPilot Personal Digital Assistants (PDAs) 上使用的 Motorola DragonBall 处理器。
  • 使用 Linux 系统调用的内核命令”(developerWorks,2007 年 3 月)对 SCI 进行了介绍,这是 Linux 内核中非常重要的一层,具有 glibc 的用户空间支持,可以在用户空间和内核之间启用函数调用。
  • Linux 调度器内幕”(developerWorks,2006 年 6 月)介绍了 Linux 2.6 中引入的新 O(1) 调度程序,这是一个非常高效的算法,可以扩展到很大数量的进程(线程),并且可以利用 SMP 系统。
  • 使用 /proc 文件系统来访问 Linux 内核的内容”(developerWorks,2006 年 3 月)介绍了 /proc 文件系统,这是一个虚拟文件系统,为用户空间的应用程序提供了一种全新的方法与内核进行通信。这篇文章展示了 /proc
    以及可加载内核模块。
  • 服务器诊所: 使虚拟文件系统工作”(developerWorks,2003 年 4 月)深入介绍了 VFS 层,它允许 Linux 通过一个通用接口支持各种不同的文件系统。这个相同的接口也可以用于其他类型的设备,例如 socket。
  • Linux 引导过程内幕”(developerWorks,2006 年 5 月)介绍了 Linux 的引导过程,该过程将启动一个 Linux 系统,并且不管是从硬盘、软盘、USB 内存条还是通过网络引导系统,该过程是相同的。
  • Linux 初始 RAM 磁盘(initrd)概述”(developerWorks,2006 年 7 月)介绍了初始 RAM 磁盘,它将引导过程与所引导的物理介质隔离开来。
  • 使用 SCTP 优化网络”(developerWorks,2006 年 2 月)介绍了一种非常有用的网络协议:流控制传输协议,它的操作与 TCP 类似,但是增加了很多有用的特性,例如消息传递、 多宿主和多流。如果您对网络协议感兴趣,那么 Linux 与
    BSD 一样,都是一种非常好的操作系统。
  • Linux slab 分配器详解” (developerWorks,2007 年 5 月)介绍了 Linux 内存管理中最有用的一个工具:slab 分配器。这种机制源自于 SunOS,不过它在 Linux 内核中找到了合适的位置。
  • 虚拟 Linux”(developerWorks,2006 年 12 月)介绍了 Linux 是如何充分利用具有虚拟化能力的处理器。
  • Linux 和对称多处理”(developerWorks,2007 年 3 月)讨论了 Linux 怎样利用提供芯片级多处理能力的芯片。
  • 探索 Linux 内核虚拟机”(developerWorks,2007 年 4 月)介绍了最近引入内核的虚拟化技术,它可以将 Linux 内核转换成其他虚拟化的操作系统的系统管理程序。
  • 有关在用户空间对 Linux 进行编程的更多信息,请参考 Tim 撰写的 GNU/Linux Application Programming 一书。
  • developerWorks Linux 专区 中可找到适合 Linux 开发人员的更多资源,包括Linux 教程 以及上月
    读者最喜欢的 Linux 文章和教程
  • 随时关注 developerWorks 技术活动和网络广播

获得产品和支持

  • 利用可直接从 developerWorks 下载的 IBM 试用软件 在 Linux 上构建您的下一个开发项目。

讨论

转载地址:http://www.ibm.com/developerworks/cn/linux/l-linux-kernel/

时间: 2024-09-30 18:47:27

Linux内核剖析 之 历史和体系结构分析的相关文章

为arm内核构建源码树----Linux内核剖析(四)

前面说到要做linux底层开发或者编写Linux的驱动,必须建立内核源码树,之前我们提到过在本机上构建源码树--Linux内核剖析(三),其建立的源码树是针对i686平台的,但是我么嵌入式系统用的是arm平台,这就需要我们为arm板交叉构建一份板子可用的内核源码树. 首先下载与你嵌入式系统平台版本号一致的linux内核,我的版本为2.6.35,当然如果你使用的是之前做好的板子,那么内核源码可能已经有了 我们解压缩我们的内核源码,并进入到内核源码的根目录 tar -jxvf linux-2.6.3

Linux内核剖析 之 Linux源代码组成

Linux内核剖析 之 Linux源代码组成   ++++Linux:           ++COPYING:有关公共许可证制度GPL的具体说明.           ++README:Linux内核安装和使用的简要说明.           ++Makefile:重构Linux内核可执行代码的make文件.用来组织内核的各模块,记录了个模块间的联系和依托关系,编译时使用:仔细阅读各子目录下的Makefile文件对弄清各个文件这间的联系和依托关系很有帮助.           ++CREDIT

Linux的历史----Linux内核剖析(一)

Unix操作系统 Unix的由来 汤普逊和里奇最早是在贝尔实验室开发Unix的,此后的10年,Unix在学术机构和大型企业中得到了广泛的应用,当时的UNIX拥有者AT&T公司以低廉甚至免费的许可将Unix源码授权给学术机构做研究或教学之用,许多机构在此源码基础上加以扩充和改进,形成了所谓的"Unix变种",这些变种反过来也促进了Unix的发展,其中最著名的变种之一是由加州大学柏克莱分校开发的BSD产品. 后来AT&T意识到了Unix的商业价值,不再将Unix源码授权给学

Linux 内核剖析

    由于本文的目标是对 Linux 内核进行介绍并探索其体系结构和主要组件,因此首先回顾一下 Linux 的简短历史,然后从较高的层次审视 Linux 内核的体系结构,最后介绍它的主要子系统.Linux 内核具有超过 600 万行的代码,因此本文不可能进行完整的介绍.请使用指向其他内容的链接进一步学习. Linux 的简短历史     尽管 Linux 绝对是最流行的开源操作系统,但是相对于其他操作系统的漫长历史来说,Linux 的历史非常短暂.在计算机出现早期,程序员是使用硬件语言在裸硬件

Linux系统调用详解(实现机制分析)--linux内核剖析(六)

系统调用概述 计算机系统的各种硬件资源是有限的,在现代多任务操作系统上同时运行的多个进程都需要访问这些资源,为了更好的管理这些资源进程是不允许直接操作的,所有对这些资源的访问都必须有操作系统控制.也就是说操作系统是使用这些资源的唯一入口,而这个入口就是操作系统提供的系统调用(System Call).在linux中系统调用是用户空间访问内核的唯一手段,除异常和陷入外,他们是内核唯一的合法入口. 一般情况下应用程序通过应用编程接口API,而不是直接通过系统调用来编程.在Unix世界,最流行的API

Linux内核剖析 之 内核同步

主要内容     1.内核请求何时以交错(interleave)的方式执行以及交错程度如何.     2.内核所实现的基本同步机制.     3.通常情况下如何使用内核提供的同步机制. 内核如何为不同的请求服务     哪些服务?     ====>>>     为了更好地理解内核是如何执行的,我们把内核看做必须满足两种请求的侍者:一种请求来自顾客,另一种请求来自数量有限的几个不同的老板.对于不同的请求,侍者采用如下的策略:     1.老板提出请求时,如果侍者空闲,则侍者开始为老板服务

linux系统启动过程详解-开机加电后发生了什么 --linux内核剖析(零)

linux系统的启动流程 关于linux系统的启动流程我们可以按步进行划分为如下: BIOS POST自检 BIOS(Boot Sequence) 引导操作系统 加载对应引导上的MBR(bootloader) 主引导设置加载其BootLoader 加载操作系统 启动BIOS,准备实模式下的中断向量表和中断服务程序 电脑启动后,CPU逻辑电路被设计为只能运行内存中的程序,没有能力直接运行存在于软盘或硬盘中的操作系统,如果想要运行,必须要加载到内存(RAM)中. BIOS是如何启动的,CPU硬件逻辑

Linux内核剖析 之 进程简介

1.概念    1.1  什么是进程?     进程是程序执行的一个实例,可以看作充分描述程序已经执行到何种程度的数据结构的汇集.     从内核观点看,进程的目的就是担当分配系统资源(CPU时间,内存等)的实体.     我们熟悉的fork()库函数,它有两种用法:     (1).一个父进程希望复制自己,使父子进程执行不同的代码段,常用于网络服务程序.     (2).一个进程要执行一个不同的程序,fork()后立即exec(),如shell. 1.2  什么是线程?     有时候,一个进

Linux内核剖析 之 回收页框

一.页框回收算法 1.为何要有页框回收算法?     Linux在为用户态与内核分配动态内存时,检查得并不严谨.     例如:     (1).对单个用户创建的进程的RAM使用的总量并不作严格的检查(进程资源的限制只针对单个进程):     (2).对内核使用的许多磁盘高速缓存和内存高速缓存大小也同样不做限制. 2.为何要减少控制?     可以使内核以最好的可行方式使用可用的RAM:     (1).当系统负载较低时,RAM的大部分由磁盘高速缓存占用,较少的正在运行的进程可以获益: