科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Linux操作系统源代码详细分析(三) (6)

Linux操作系统源代码详细分析(三) (6)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

Linux支持的所有文件系统在fs目录下面都有一个对应的子目录。一个文件系统是存储设备和需要访问存储设备的进程之间的媒介。

作者:www.pcjx.com 来源:www.pcjx.com 2007年10月28日

关键字: 分析 详细 源代码 Linux

  • 评论
  • 分享微博
  • 分享邮件
 

4. fs

Linux支持的所有文件系统在fs目录下面都有一个对应的子目录。一个文件系统是存储设备和需要访问存储设备的进程之间的媒介。

文件系统可能是本地的物理上可访问的存储设备,例如硬盘或CD-ROM驱动器;在这两种情况下将分别使用ext2和isofs文件系统。文件系统也可能是可以通过网络访问的存储设备;这种情况下使用的文件系统是NFS。

还有一些伪文件系统,例如proc文件系统,可以以伪文件的形式提供其他信息(例如,在proc的情况下是提供内核的内部变量和数据结构)。虽然在底层并没有实际的存储设备与这些文件系统相对应,但是进程可以像有实际存储设备一样处理(NFS也可以作为伪文件系统来使用)。

5. include

这个目录包含了Linux源程序树中大部分的包含(.h)文件。这些文件按照下面的子目录进行分组:

* include/asm-*/—这样的子目录有多个,每一个都对应着一个arch的子目录,例如include/asm-alpha、include/asm-arm、include/asm-i386等等。每个目录下的文件中包含了支持给定体系结构所必须的预处理器宏和短小的内联函数。这些内联函数很多都是全部或部分地使用汇编语言实现的,而且在C或者汇编代码中都会应用到这些文件。

当编译内核时,系统将建立一个从include/asm到目标体系结构特有的目录的符号链接。结果是体系结构无关内核源程序代码可以使用如下形式的代码来实现所需功能:

#include

这样就能够将适当地体系结构特有的文件包含(#include)进来。

* include/linux/—内核和用户应用程序请求特定内核服务时所使用的常量和数据结构在头文件中定义,而该目录中就包含了这些头文件。这些文件大都是平台独立的。这个目录被全部复制(更多的情况是链接)到/usr/include/linux下。这样用户应用程序就可以使用#include包含这些头文件,而且能够保证所包含进来的头文件的内容和内核中的定义一致。第9章将会给出有关的一个样例。

* 对这些文件的移植只有对于内核来说才是必须的,对用户应用程序则没有必要。移植工作可以按照如下的方式封装处理:

* include/net/—这个目录供与网络子系统有关的头文件使用。

* include/scsi/—这个目录供与SCSI控制器和SCSI设备有关的头文件使用。

* include/video/—这个目录供与显卡和帧显示缓存有关的头文件使用。

6. init

这个目录下面的两个文件中比较重要的一个是main.c,它包含了大部分协调内核初始化的代码。第4章将详细介绍这部分代码。

7. ipc

这个目录下的文件实现了System V的进程间通讯(IPC)。在第9章中将会对它们进行详细介绍。

8. kernel

这个目录中包含了Linux中最重要的部分:实现平台独立的基本功能。这部分内容包括进程调度(kernel/sched.c)及创建和撤销进程的代码(kernel/fork.c和kernel/exit.c);以上所有内容将在第7章中有所涉及。但是我并不想给你留下这样的印象:需要了解的内容都在这个目录下。实际上在其他目录下也有很多重要的内容。但是,不管怎样说,最重要部分的代码是在这个目录下的。

9. lib

lib目录包含两部分的内容。lib/inflate.c中的函数能够在系统启动时展开经过压缩的内核(请参见第4章)。lib目录下剩余的其他文件实现一个标准C库的有用子集。这些实现的焦点集中在字符串和内存操作的函数(strlen,memcpy和其他类似的函数)及有关sprintf和atoi的系列函数上。

这些文件都是使用C语言编写的,因此在新的内核移植版本中可以立即使用这些文件。正如本章前面部分说明的那样,一些移植提供了它们独有的高速的函数版本,这些函数通常是经过手工调整过的汇编程序,在移植后的系统使用这些函数来代替原来的通用函数。

10. mm

该目录包含了体系结构无关的内存管理代码。正如我们前面说明的那样,为每个平台实现最底层的原语的体系结构特有的内存管理程序是存储在arch/platform/mm中的。大部分平台独立和x86特有的内存管理代码将在第8章中介绍。

11. net

这个目录包含了Linux应用的网络协议代码,例如AppleTalk、TCP/IP、IPX等等。

12. scripts

该目录下没有内核代码,它包含了用来配置内核的脚本。当运行make menuconfig或者make xconfig之类的命令配置内核时,用户就是和位于这个目录下的脚本进行交互的。

3.5.2 体系结构相关和体系结构无关的代码

现在我们来估计一下体系结构相关和体系结构无关代码的相对大小。我们首先给出一些数字。完整的2.2.5的内核总共有1 725 645行代码(顺便一提,请注意本书只包含了39 000行代码,但是我们仍然努力涵盖了相当部分的核心函数)。其中一共有392 844行代码在体系结构特有的目录之内,也就是arch/*和include/asm-*下面。我估计还有超过64 000行的代码是仅供一种体系结构专用的驱动程序。这意味着大约26%的代码是专用于体系结构相关代码的。

但是,对于单一一种体系结构,体系结构相关代码比例相对较小。不妨理想一点,如果某种单一体系结构所需要的特有代码约有50 000行,而体系结构无关代码则大约有1 250 000行,那么体系结构相关代码大概只占到4%。当然,在特定的一个内核中,并不是所有这些体系结构无关代码都会被用到,因此体系结构相关代码在特定内核中所占的比重与内核的配置有关。但是不管怎样,很显然大部分内核代码是平台独立的。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章