没有合适的资源?快使用搜索试试~ 我知道了~
首页Linux 0.11内核详注:入门开发者必读
《Linux内核完全注释:0.11版详解》是一本针对Linux新手和专业开发者的宝贵教程。它聚焦于Linux早期版本0.11 (0.95),由赵炯编写,适合想要深入理解操作系统内核工作机制的读者。这本书的特点在于其详尽的注释,作者不仅追溯了Linux内核版本的发展历史,解释了选择0.11版作为研究对象的原因,还揭示了内核源代码的组织结构及其内部逻辑。 书中首先从Linux内核版本的演变史出发,概述了不同版本间的改进和关键区别,让读者掌握内核演进的脉络。接着,作者深入剖析了内核源代码的构成,包括各个模块和文件的功能,提供了详细的代码解读和难点解析,帮助读者逐步理解内核的核心工作原理。 每一章都精心设计,包含对象概览、功能介绍、代码注释、难点讨论以及与后续版本的区别分析。这种结构使得学习过程既有系统性又具有实用性,便于读者在实践中掌握知识。最后,作者还总结了进一步研究Linux系统的方法和建议,为读者指明了后续学习的方向。 版权方面,作者赵炯明确保留了修改和出版的权利,鼓励读者分享书中的内容,但需注明来源,并对可能存在的错误和不完善之处表示欢迎读者提出反馈和建议。整个作品充满热情,引用了Linus Benedict Torvalds的名言"RTFSC – Read The Fking Source Code ☺!",强调直接阅读源代码的重要性。 《Linux内核完全注释:0.11版》不仅是一本技术指南,也是理解和掌握Linux内核基石的理想资源,对于想在Linux领域深入发展的读者来说,是不可多得的参考资料。
资源详情
资源推荐
1.2 内容综述
- 10 -
的命令和方法。这样做有助于加深对代码的理解,又能更好的了解所用硬件的使用方法,作者认为这种解
读方法要比单独列出一章内容来总体介绍硬件或其它知识要效率高得多。
拿 Linux 0.11 版内核来“开刀”是为了提高我们认识 Linux 运行机理的效率。Linux-0.11 版整个内核
源代码只有
325K 字节左右,其中包括的内容基本上都是 Linux 的精髓。而目前最新的 2.5.XX 版内核非常
大,将近有
188 兆字节,即使你花一生的经历来阅读也未必能全部都看完。也许你要问“既然要从简入手,
为什么不分析更小的
Linux 0.01 版内核源代码呢?它只有 240K 字节左右”主要原因是因为 0.01 版的内核
代码有太多的不足之处,甚至还没有包括对软盘的驱动程序,也没有很好地涉及数学协处理器的使用以及
对登陆程序的说明。并且其引导启动程序的结构也与目前的版本不太一样,而
0.11 版的引导启动程序结构
则与现在的基本上是一样的。另外一个原因是可以找到
0.11 版早期的已经编译制作好的内核映像文件
(bootimage),可以用来进行引导演示。如果再配上简单的根文件系统映像文件(rootimage),那么它就可以
进行正常的运行了。
拿 Linux 0.11 版进行学习也有不足之处,比如该内核版本中尚不包括有关进程等待队列、TCP/IP 网络
等方面的一些当前非常重要的代码,但好在
Linux 中的网络代码基本上是自成一体的,与内核机制关系不
是非常大,因此可以在了解了
Linux 工作的基本原理之后再去分析这些代码。
本文对 Linux 内核中所有的代码都进行了说明。为了保持结构的完整性,对代码的说明是以内核中源
代码的组成结构来进行的,基本上是以每个源代码中的目录为一章内容进行介绍。介绍的源程序文件的次
序可参见前面的文件列表索引。整个
Linux 内核源代码的目录结构如下列表 1.1 所示。所有目录结构均是
以
linux 为当前目录。
列表
1.1 Linux/目录
名称 大小 最后修改日期(GMT) 说明
boot/ 1991-12-05 22:48:49
fs/ 1991-12-08 14:08:27
include/ 1991-09-22 19:58:04
init/ 1991-12-05 19:59:04
kernel/ 1991-12-08 14:08:00
lib/ 1991-12-08 14:10:00
mm/ 1991-12-08 14:08:21
tools/ 1991-12-04 13:11:56
Makefile 2887 bytes 1991-12-06 03:12:46
本书内容可以分为三个部分。第 1 章至第 4 章是描述内核引导启动和 32 位运行方式的准备阶段,作
为学习内核的初学者应该全部进行阅读。第二部分从第
5 章到第 10 章是内核代码的主要部分。其中第 5
章内容可以作为阅读本部分后续章节的索引来进行。第 11 章到第 13 章是第三部分内容,可以作为阅读第
二部分代码的参考。
第 2 章概要地描述了 Linux 操作系统的体系结构,内核源代码文件放置的组织结构以及每个文件大致
功能。还介绍了
Linux 对物理内存的使用分配方式以及对虚拟线性地址的使用分配,以及如何在 RedHat 9
操作系统上编译本书所讨论的 linux 内核,对内核代码需要修改的地方。最后开始注释内核程序包中 Linux/
目录下的所看到的第一个文件,也即内核代码的总体 Makefile 文件的内容。该文件是所有内核源程序的编
译管理配置文件,供编译管理工具软件
make 使用。
第 3 章将详细注释 boot/目录下的三个汇编程序,其中包括磁盘引导程序 bootsect.s、获 取 BIOS 中参数
的
setup.s 汇编程序和 32 位运行启动代码程序 head.s。这三个汇编程序完成了内核从块设备上引导加载到
内存,对系统配置参数的进行探测,完成了进入
32 位保护模式运行之前的所有工作。为内核系统进一步
的初始化工作作好了准备。
1.2 内容综述
- 11 -
第 4 章主要介绍 init/目录中内核系统的初始化程序 main.c。它是内核完成所有初始化工作并进入正常
运行的关键地方。在完成了系统所有的初始化工作后,创建了用于
shell 的进程。在介绍该程序时将需要查
看其所调用的其它程序,因此对后续章节的阅读可以按照这里调用的顺序进行。由于内存管理程序的函数
在内核中被广泛使用,因此该章内容应该最先选读。当你能真正看懂直到
main.c 程序为止的所有程序时,
你应该已经对
Linux 内核有了一定的了解,可以说已经有一半入门了☺,但你还需要对文件系统、系统调
用、各种驱动程序等进行更深一步的阅读。
第 5 章主要介绍 kenel/目录中的所有程序。其中最重要的部分是进程调度函数 schedule()、sleep_on()
函数和有关系统调用的程序。此时你应该已经对其中的一些重要程序有所了解。
第 6 章对 kernel/dev_blk/目录中的块设备程序进行了注释说明。该章主要含有硬盘、软盘等块设备的
驱动程序,主要与文件系统和高速缓冲区打交道。因此,在阅读这章内容时需首先浏览一下文件系统的章
节。
第 7 章对 kernel/dev_chr/目录中的字符设备驱动程序进行注释说明。这一章中主要涉及到串行线路驱
动程序,键盘驱动程序和显示器驱动程序,因此含有较多与硬件有关的内容。在阅读时需要参考一下相关
硬件的书籍。
第 8 章介绍 kernel/math/目录中的数学协处理器的仿真程序。由于本书所注释的内核版本,还没有真正
开始支持协处理器,因此本章的内容较少,也比较简单。只需有一般性的了解即可。
第 9 章介绍内核源代码 fs/目录中的文件系统程序,在看这章内容时建议你能够暂停一下而去阅读
Andrew S. Tanenbaum 的《操作系统设计与实现》一书中有关 minix 文件系统的章节,因为最初的 Linux 系
统是只支持
minix 一种文件系统,Linux 0.11 版也不例外。
第 10 章解说 mm/目录中的内存管理程序。要透彻地理解这方面的内容,需要对 Intel 80X86 微处理器
的保护模式运行方式有足够的理解,因此本章在适当的地方包含有较为完整的有关
80X86 保护模式运行方
式的说明,这些知识基本上都可以参考
Intel 80386 程序员编程手册(Intel 80386 Programmer's Reference
Manual)
。但在此章中,以源代码中的运用实例为对象进行解说,应该可以更好地理解它的工作原理。
现有的 Linux 内核分析书籍都缺乏对内核头文件的描述,因此对于一个初学者来讲,在阅读内核程序
时会碰到许多障碍。本书的第
11 章对 include/目录中的所有头文件进行了详细说明,基本上对每一个定义、
每一个常量或数据结构都进行了详细注释。为了便于在阅读时参考查阅,本书在附录中还对一些经常要用
到的重要的数据结构和变量进行了归纳注释,但这些内容实际上都能在这一章中找到。虽然该章内容主要
是为阅读其它章节中的程序作参考使用的,但是若想彻底理解内核的运行机制,仍然需要了解这些头文件
中的许多细节。
第 12 章介绍了 Linux 0.11 版内核源代码 lib/目录中的所有文件。这些库函数文件主要向编译系统等系
统程序提供了接口函数,对以后理解系统软件会有较大的帮助。由于这个版本较低,所以这里的内容并不
是很多,可以很快地看完。这也是我们为什么选择
0.11 版的原因之一。
第 13 章介绍 tools/目录下的 build.c 程序。这个程序并不会包括在编译生成的内核映像(image)文件中,
它仅用于将内核中的磁盘引导程序块与其它主要内核模块连接成一个完整了内核映像(
kernel image)文件。
最后是附录和索引。附录中给出了 Linux 内核中的一些常数定义和基本数据结构定义,以及保护模式
运行机制的简明描述。
为了便于查阅,在本书的附录中还单独列出了内核中要用到的有关 PC 机硬件方面的信息。在参考文
献中,我们仅给出了在阅读源代码时可以参考的书籍、文章等信息,并没有包罗万象地给出一大堆的繁杂
凌乱的文献列表。比如在引用
Linux 文档项目 LDP(Linux Document Project)中的文件时,我们会明确地
列出具体需要参考哪一篇
HOWTO 文章,而并不是仅仅给出 LDP 的网站地址了事。
Linus
在最初开发 Linux 操作系统内核时,主要参考了 3 本书。一本是 M. J. Bach 著的《UNIX 操作系
统设计》(文献
[11]),该书描述了 UNIX 系统 V 内核的工作原理和数据结构。Linus 使用了该书中很多函数
的算法,
Linux 内核源代码中很多重要函数的名称都取自该书。因此,在阅读本书时,这是一本必不可少
的内核工作原理方面的参考书籍。另一本是
John H. Crawford等编著的《Programming the 80386》(文献[21]),
是讲解
80x86 下保护模式编程方法的好书。还有一本就是 Andrew S.Tanenbaum 著的《MINIX 操作系统设
计与实现》一书的第
1 版(文献[22])。Linus 主要使用了该书中描述的 MINIX 文件系统 1.0 版,而且在早
期的
Linux 内核中也仅支持该文件系统,所以在阅读本书有关文件系统一章内容时,文件系统的工作原理
方面的知识完全可以从
Tanenbaum 的书中获得。
在对每个程序进行解说时,我们首先简单说明程序的主要用途和目的、输入输出参数以及与其它程序
1.3 本章小结
- 12 -
的关系,然后列出程序的完整代码并在其中对代码进行详细注释,注释时对原程序代码或文字不作任何方
面的改动或删除,因为
C 语言是一种英语类语言,程序中原有的少量英文注释对常数符号、变量名等也提
供了不少有用的信息。在代码之后是对程序更为深入的解剖,并对代码中出现的一些语言或硬件方面的相
关知识进行说明。如果在看完这些信息后回头再浏览一遍程序,你会有更深一层的体会。
对于阅读本书所需要的一些基本概念知识的介绍都散布在各个章节相应的地方,这样做主要是为了能
够方便的找到,而且在结合源代码阅读时,对一些基本概念能有更深的理解。
最后要说明的是当你已经完全理解了本文说解说的一切时,并不代表你已经成为一个 Linux 行家了,
你只是刚刚踏上
Linux 的征途,具有了一定的成为一个 Linux GURU 的初步知识。这时你应该去阅读更多
的源代码,最好是循序渐进地从
1.0 版本开始直到最新的正在开发中的奇数编号的版本。在撰写这本书时
最新的
Linux 内核是 2.5.44 版。当你能快速理解这些开发中的最新版本甚至能提出自己的建议和补丁
(
patch)程序时,我也甘拜下风了☺。
1.3 本章小结
首先阐述了 Linux 诞生和发展不可缺少的五个支柱:UNIX 最初的开放原代码版本为 Linux 提供了实
现的基本原理和算法、
Rechard Stallman 的 GNU 计划为 Linux 系统提供了丰富且免费的各种实用工具、
POSIX 标准的出现为 Linux 提供了实现与标准兼容系统的参考指南、A.S.T 的 MINIX 操作系统为 Linux 的
诞生起到了不可忽缺的参考、
Internet 是 Linux 成长和壮大的必要环境。最后本章概述了书中的基本内容。
最后祝你征途愉快!
2.1 Linux 内核模式
- 13 -
第2章 linux 内核体系结构
本章首先概要介绍了早期 Linux 内核的编制模式和体系结构,然后详细描述了 linux 内核源代码目录
中组织形式以及子目录中各个代码文件的主要功能以及基本调用的层次关系。接下来就直接切入正题,从
内核源文件
linux/目录下的第一个文件 Makefile 开始,对每一行代码进行详细注释说明。
一个完整可用的操作系统主要由 4 部分组成:硬件、操作系统内核、操作系统服务和用户应用程序,
见图
2.1 所示。用户应用程序是指那些字处理程序、Internet 浏览器程序或用户自行编制的各种应用程序;
操作系统服务程序是指那些向用户所提供的服务被看作是操作系统的部分功能的程序。在
Linux 操作系统
上,这些程序包括
X 窗口系统、shell 命令解释系统以及那些内核编程接口等系统程序;操作系统内核程序
即是本书所感兴趣的部分,它主要用于对硬件资源的抽象和访问调度。
图2.1 操作系统组成部分。
Linux 内核的主要用途就是为了与计算机硬件进行交互,实现对硬件部件的编程控制和接口操作,调
度对硬件资源的访问,并为计算机上的用户程序提供一个高级的执行环境和对硬件的虚拟接口。
在本章内容中,我们首先基于 Linux 0.11 版的内核源代码,简明地描述 Linux 内核的基本体系结构、主要
构成模块。然后对源代码中出现的几个重要数据结构进行说明。最后描述了构建
Linux 0.11 内核编译实验
环境的方法。
2.1 Linux 内核模式
目前,操作系统内核的结构模式主要可分为整体式的单内核模式和层次式的微内核模式。而本书所注
释的
Linux 0.11 内核,则是采用了单内核模式。单内核模式的主要优点是内核代码结构紧凑、执行速度快,
不足之处主要是层次结构性不强。
在单内核模式的系统中,操作系统所提供服务的流程为:应用主程序使用指定的参数值执行系统调用
指令
(int x80),使 CPU 从用户态(User Mode)切换到核心态(Kernel Model),然后操作系统根据具体的
参数值调用特定的系统调用服务程序,而这些服务程序则根据需要再底层的一些支持函数以完成特定的功
能。在完成了应用程序所要求的服务后,操作系统又从核心态切换回用户态,返回到应用程序中继续执行
后面的指令。因此概要地讲,单内核模式的内核也可粗略地分为三个层次:调用服务的主程序层、执行系
统调用的服务层和支持系统调用的底层函数。见图
2.2 所示。
用户应用程序
操作系统服务
操作系统内核
硬件系统
2.2 Linux 内核系统体系结构
- 14 -
图2.2 单内核模式的简单结构模型
2.2 Linux 内核系统体系结构
Linux 内核主要由 5 个模块构成,它们分别是:进程调度模块、内存管理模块、文件系统模块、进程
间通信模块和网络接口模块。
进程调度模块用来负责控制进程对 CPU 资源的使用。所采取的调度策略是各进程能够公平合理地访
问
CPU,同时保证内核能及时地执行硬件操作。内存管理模块用于确保所有进程能够安全地共享机器主内
存区,同时,内存管理模块还支持虚拟内存管理方式,使得
Linux 支持进程使用比实际内存空间更多大的
内存容量。并可以利用文件系统把暂时不用的内存数据块会被交换到外部存储设备上去,当需要时再交换
回来。文件系统模块用于支持对外部设备的驱动和存储。虚拟文件系统模块通过向所有的外部存储设备提
供一个通用的文件接口,隐藏了各种硬件设备的不同细节。从而提供并支持与其它操作系统兼容的多种文
件系统格式。进程间通信模块子系统用于支持多种进程间的信息交换方式。网络接口模块提供对多种网络
通信标准的访问并支持许多网络硬件。
这几个模块之间的依赖关系见图 2.3 所示。其中的连线代表它们之间的依赖关系,虚线和虚框部分表
示
Linux 0.11 中还未实现的部分(从 Linux 0.95 版才开始逐步实现虚拟文件系统,而网络接口的支持到 0.96
版才有)。
图2.3 Linux 内核系统模块结构及相互依赖关系
由图可以看出,所有的模块都与进程调度模块存在依赖关系。因为它们都需要依靠进程调度程序来挂
起(暂停)或重新运行它们的进程。通常,一个模块会在等待硬件操作期间被挂起,而在操作完成后才可
继续运行。例如,当一个进程试图将一数据块写到软盘上去时,软盘驱动程序就可能在启动软盘旋转期间
主程序
系统服务
支持函数
进程调度 进程间通信
内存管理
虚拟文件系统
文件系统
网络接口
剩余553页未读,继续阅读
gnornehc0903
- 粉丝: 0
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 多功能HTML网站模板:手机电脑适配与前端源码
- echarts实战:构建多组与堆叠条形图可视化模板
- openEuler 22.03 LTS专用openssh rpm包安装指南
- H992响应式前端网页模板源码包
- Golang标准库深度解析与实践方案
- C语言版本gRPC框架支持多语言开发教程
- H397响应式前端网站模板源码下载
- 资产配置方案:优化资源与风险管理的关键计划
- PHP宾馆管理系统(毕设)完整项目源码下载
- 中小企业电子发票应用与管理解决方案
- 多设备自适应网页源码模板下载
- 移动端H5模板源码,自适应响应式网页设计
- 探索轻量级可定制软件框架及其Http服务器特性
- Python网站爬虫代码资源压缩包
- iOS App唯一标识符获取方案的策略与实施
- 百度地图SDK2.7开发的找厕所应用源代码分享
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功