第 1 章 嵌入式系统开发入门
1.5 L INUX 内核介绍
Linux 内核是 Linux 系统的心脏,它实现了操作系统五大主要功能模块:进程管理、内 存管理、文件系统、设备控制和网络。Linux 内核的功能模块如图 1.17 所示[1]:
图 1.17 Linux 内核的功能模块划分
进程管理模块可以说是 Linux 内核的心脏模块,它负责创建和终止进程,并且处理它们 和外部世界的联系(输入和输出)。对整个系统功能来讲,不同进程之间的通信(通过信号,
管道,进程间通信原语)是基本的,这也是由内核来处理的。另外,调度器应该是整个操作 系统中最关键的例程,是进程管理中的一部分。更广义的说,内核的进程管理活动实现了在 一个 CPU 上多个进程的抽象概念。内存管理模块的作用是用于确保所有进程能够安全地共 享计算机主内存区,此外,内存管理模块还支持虚拟内存管理方式,使得 Linux 支持进程使 用比实际内存空间更多的内存容量,并可以利用文件系统把暂时不用的内存数据块交换到外 部存储设备中去,等需要时再交换回来,这样大大提高了内存使用效率,节省了内存空间。
文件系统模块用于支持对外部设备的驱动和存储,虚拟文件系统通过向所有的外部存储设备
提供一个通用的文件系统接口,从而隐藏了各种硬件设备的不同细节。网络模块提供对多种 网络通信标准的访问,并支持许多网络硬件设备[1]。
总之,本书不是讲述操作系统内核原理的书籍,读者可以参考相关的书籍来学习它。但 是对于本书中所介绍的内容常常是需要跟内核打交道,所以希望读者对操作系统内核原理有 所了解。
1.5.1 Linux 内核目录结构
在解压后的 Linux 内核(这里以 Linux 2.6.10 内核为例)根目录下输入如下 tree 命令,将会 显示如下目录信息,其中 tree 命令是由 tree 工具实现的,用来显示文件目录信息,它的下载 站点是ftp://mama.indstate.edu/linux/tree/。
# tree –L 1 .
|-- COPYING
|-- CREDITS
|-- Documentation
|-- MAINTAINERS
|-- Makefile
|-- README
|-- REPORTING-BUGS
|-- arch
|-- crypto
|-- drivers
|-- fs
|-- include
|-- init
|-- ipc
|-- kernel
|-- lib
|-- mm
|-- net
|-- scripts
|-- security
|-- sound
`-- usr
16 directories, 6 files
内核根目录下的主要目录和文件的意义介绍如下:
COPYING:该文件主要是对 Linux 内核代码的版权声名。
CREDITS:该文件是对该版本和之前版本 Linux 内核所做贡献的所有成员列表。
Documentation:该目录存放所有内核相关的技术文档,是学习内核原理的很好参考资料。
MAINTAINERS:该文件记录所有维护内核人员列表以及讲述如何提交一个内核的改变。
Makefile:该文件是编译内核的最上层 Makefile 文件,也是编译内核的入口文件。
README:该文件是编译内核的帮助文件,编译前一定要阅读该文件,该文件对于编译内 核很有帮助。
REPORTING-BUGS:该文件是有关提交内核 Bug 的一些要求和建议。
Arch:该目录包括了所有和体系结构相关的核心代码。它下面的每一个子目录都代表一种 Linux 支持的体系结构,例如 i386 就是 Intel CPU 及与之相兼容体系结构的子目录。arm 就 代表是 ARM 体系结构相关的代码。
Drivers:该目录包含内核中所有硬件相关的驱动实现代码,它又进一步划分成几类设备驱动,
比如 char 目录为字符设备,block 目录为块设备等。
Fs:该目录存放 Linux 支持的文件系统代码。不同的文件系统有不同的子目录对应,如 ext3 文件系统对应的就是 ext3 子目录。
Include : 该 目 录 包 括 编 译 内 核 所 需 要 的 大 部 分 头 文 件 , 例 如 与 平 台 无 关 的 头 文 件 在 include/linux 子目录下。
Init:该目录包含内核的初始化代码(不是系统的引导代码)。这是研究内核如何工作的好起 点。
Ipc:该目录包含了内核进程间的通信代码。
Kernel:该目录包含内核管理的核心代码。同时与处理器结构相关代码都放在 arch/*/kernel 目录下。
Lib:该目录包含了内核的库代码,与处理器结构相关的库代码被放在 arch/*/lib/目录下。
Mm:该目录包含了所有的内存管理代码。与具体硬件体系结构相关的内存管理代码位于 arch/*/mm 目录下。
Net:该目录里是内核的网络部分代码,其每个子目录对应于网络的一个方面。
Scripts:该目录包含用于配置核心的脚本文件。
1.5.2 如何阅读 Linux 内核源代码
Linux 0.01 版在是在 1991 年出生的,是 Linux 内核的第一版,该内核的大小是 158K 字 节,6975 行代码。Linux 内核在全球热衷于开源项目的计算机高手努力下已经发展为一个庞 大成熟的操作系统,到目前为止,最新的内核版本是 2.6.18,其大小超过 200M 字节,代码 行超过 400 万行,如此庞大的源代码如果没有合适的工具或方法去阅读它,那么想在短时间 学习它基本上是不可能的。技术的发展总会使人类不断简化所作的工作,同样现在可以利用 有效的工具来辅助我们去阅读和研究如此庞大的系统。目前最流行的阅读内核源代码工具有 两个,UltraEdit 和 SourceInsight,这两个工具在实际工作中应用非常广泛。下面简单介绍一 下这两个重要工具。
UltraEdit:它是一套功能强大的文本编辑器,可以编辑文本、十六进制、ASCII 码,可 以取代记事本,内建英文单字检查、C、C++ 及 VB 指令突显,可同时编辑多个文件,而 且即使开启很大的文件速度也是相当的快。软件附有 C/C++ 标签颜色显示、搜寻替换以及 无限制的还原功能,一般大家喜欢用其来修改 EXE、DLL 和源文件等。比如用 UE(UltraEdit 简称)打开 Linux 2.6.10 内核的一个名为 cpu.c 的源文件,如图 1.18 所示。用 UE 阅读源代 码可以高亮显示源代码的关键字,查找方便,尤其是可以方便编辑。关于 UE 的具体使用请 参考其帮助文档。
图 1.18:UltraEdit 查看源代码文件
SourceInsight:它实质上是一个支持多种开发语言(java,c ,c++等等)的编辑器,只不过 由于其查找、定位、彩色显示等功能的强大,而被我们当成源代码阅读工具使用。它和 UltraEdit 相比较增加了许多功能,比如提供了代码之间调用关系的显示,以及文件之间的关 系查找。比如用 SourceInsight 建立一个 Linux 2.6.10 内核代码的项目工程,如图 1.19 所示。
关于 SourceInsight 的具体使用方法请参考其帮助文档。
图 1.19:用 SourceInsight 建立的 Linux 2.6.10 内核代码工程
注意:UltraEdit 和 SourceInsight 这两个工具通常使用在 Windows 操作系统下使用。