没有合适的资源?快使用搜索试试~ 我知道了~
首页Linux 0.11内核详解:源代码注释与深度解析
Linux 0.11内核详解:源代码注释与深度解析
需积分: 0 0 下载量 155 浏览量
更新于2024-10-08
1
收藏 2.49MB PDF 举报
《Linux内核0.11详细注释》是一本深入剖析早期Linux内核(v0.95)源代码的详细指南。作者赵炯针对Linux 0.11这个版本,通过讲述Linux系统的诞生和发展历程,强调了选择这个版本研究的原因,即尽管版本较低,但其核心原理已经具备,对于理解操作系统内核工作原理具有重要意义。 本书首先概述了Linux源代码的历史变迁,包括不同版本间的改进和关键区别,帮助读者了解内核演进的大致脉络。接着,作者详细介绍了内核的组织结构,包括Makefile文件的作用,以及引导启动程序(boot)、初始化程序(init)、内核代码(kernel)、块设备驱动程序(block driver)等组成部分。在讲解过程中,每一部分都涵盖了程序的功能、代码注释、可能遇到的难点及其解决方法,以及与后续版本的对比。 例如,引导启动程序涉及bootsect.s、setup.s、head.s等关键文件,这些文件共同负责引导过程中的初始化和加载工作。初始化程序如main.c负责内核的启动流程,而内核代码中的asm.s、system_call.s、traps.c等文件则展示了系统调用和异常处理的核心机制。驱动程序部分如hd.c和floppy.c则是硬盘和软盘驱动的具体实现。 版权方面,作者明确指出,虽然本书为草稿,欢迎读者传播和提供反馈,但需注明来源。书中还强调了阅读早期内核源代码的价值,即使技术发展,理解基础原理始终是关键。 通过阅读这本书,读者可以对Linux内核有深入的理解,为后续的学习和研究打下坚实基础。尽管书中提到的版本较旧,但对于初学者和想深入了解Linux底层的人来说,仍然是宝贵的学习资源。
资源详情
资源推荐
概述 linux/
2
个版本在使用: 1.5 版和 2.0 版,当时该操作系统在大学使用是免费的,但其它用途不是,当然目前都已
经是免费的,可以从许多 FTP 上下载。
对于 Linux 系统,他表示对其开发者 Linus 的称赞。但他认为 Linux 的发展有很大原因是因为他为了
保持 minix 的小型化,能让学生在一个学期内就能学完,而没有接纳全世界许多人对 Minix 的扩展要求。
因此这激发了 Linus 编写 Linux。Linus 正好抓住了这个好时机。
作为一个操作系统,MINIX 并不是优秀者,但它同时提供了用 C 语言和汇编语言写的系统源代码。这
是第一次使得有抱负的程序员或 hacker 能够阅读操作系统的源代码,在当时这种源代码是软件商一直小
心地守护着的。
1.1.3 GNU 计划
GNU 计划和自由软件基金会(the Free Software Foundation – FSF)是由 Richard M. Stallman 于
1984 年一手创办的。旨在开发一个类似 Unix、并且是自由软件的完整操作系统:GNU 系统。(GNU 是"GNU's
Not Unix"的递归缩写,它的发音为"guh-NEW"。)各种使用 linux 作为核心的 GNU 操作系统正在被广泛的
使用。虽然这些系统通常被称作"Linux",但是严格地说,它们应该被称为 GNU/Linux 系统。
到上世纪 90 年代初,GNU 项目已经开发出许多高质量的免费软件,其中包括有名的 emacs 编辑系统、
bash shell 程序、gcc 系列编译程序、gdb 调试程序等等。这些软件为 Linux 操作系统的开发创造了一个
合适的环境,是 Linux 能够诞生的基础之一。以至于目前许多人都将 Linux 操作系统称为“GNU/Linux”
操作系统。
1.1.4 POSIX 标准
POSIX(Portable Operating System Interface for Computing Systems)是由 IEEE 和 ISO/IEC 开发
的一簇标准。该标准是基于现有的 UNIX 实践和经验,描述了操作系统的调用服务接口,用于保证编制的
应用程序可以在源代码一级上在多种操作系统上移植运行。它是在 1980 年早期一个 UNIX 用户组
(usr/group)的早期工作的基础上取得的。该 UNIX 用户组原来试图将 AT&T 的系统 V 和 Berkeley CSRG 的
BSD 系统的调用接口之间的区别重新调和集成,从而于 1984 年产生了/usr/group 标准。1985 年,IEEE 操
作系统技术委员会标准小组委员会(TCOS-SS)开始在 ANSI 的支持下责成 IEEE 标准委员会制定有关程序
源代码可移植性操作系统服务接口正式标准。到了 1986 年 4 月,IEEE 就制定出了试用标准。第一个正式
标准是在 1988 年 9 月份批准的(IEEE 1003.1-1988),也既以后经常提到的 POSIX.1 标准。
1989 年 POSIX 的工作被转移至 ISO/IEC 社团,并由 15 工作组继续将其制定成 ISO 标准。到 1990 年,
POSIX.1 与已经通过的 C 语言标准联合,正式批准为 IEEE 1003.1-1990(也是 ANSI 标准)和 ISO/IEC
9945-1:1990 标准。
POSIX.1 仅规定了系统服务应用程序编程接口(API),仅概括了基本的系统服务标准,因此期望对系
统的其它功能也制定出标准。这样 IEEE POSIX 的工作就开始展开了。在 1990 年,刚开始有十个批准的计
划在进行,有近 300 多人参加每季度为期一周的会议。着手的工作有命令与工具标准(POSIX.2)、测试方
法标准(POSIX.3)、实时 API(POSIX.4)等。到了 1990 年上半年已经有 25 个计划在进行,并且有 16 个
工作组参与了进来。与此同时,还有一些组织也在制定类似的标准,如 X/Open,AT&T,OSF 等。
在 90 年代初,POSIX 标准的制定正处在最后投票敲定的时候,那是 1991-1993 年间。此时正是 Linux
刚刚起步的时候,这个 UNIX 标准为 Linux 提供了极为重要的信息,使得 Linux 的能够在标准的指导下进
行开发,能够与绝大多数 UNIX 系统兼容。在最初的 Linux 内核代码中(0.01 版、0.11 版)就已经为 Linux
与 POSIX 标准的兼容做好了准备工作。在 0.01 版的内核/include/unistd.h 文件中就已经定义了几个有关
POSXI 标准要求的常数符号,并且在注释中就写到“ok,这也许是个玩笑,但我正在着手研究它呢”。
1991 年 7 月 3 日在 comp.os.minix 上发布的 post 上就已经提到了正在搜集 POSIX 的资料。(当然此时
还不存在 Linux 这个名称,当时 Linus 的脑子里想的可能是 FREAX
☺,FREAX 的英文含义是怪诞的、怪物、
异想天开等)。其中透露了他正在进行 Linux 系统的开发,并且在 Linux 最初的时候已经想到要实现与 POSIX
概述 linux/
3
(UNIX 的国际标准)的兼容问题了。
1.1.5 Linux 操作系统的诞生
1981 年 IBM 公司推出享誉全球的微型计算机 IBM PC。在 1981-1991 年间,MS-DOS 操作系统一直是微
型计算机上操作系统的主宰。此时计算机硬件价格虽然逐年下降,但软件价格仍然是居高不下。当时 Apple
的 MACs 操作系统可以说是性能最好的,但是其天价没人能够轻易靠近。
当时的另一个计算机技术阵营是 Unix 世界。但是 Unix 操作系统就不仅是价格贵的问题了。为了寻求
高利率,Unix 经销商将价格抬得极高,PC 小用户就根本不能靠近它。曾经一度受到 Bell Labs 的许可而
可以在大学中用于教学的 UNIX 源代码一直被小心地守卫着不需公开。对于广大的 PC 用户,软件行业的大
型供应商始终没有给出有效的解决该问题的手段。
正在此时,出现了 MINIX 操作系统,并有一本详细的书本描述它的设计实现原理。由于 AST 的书写的
非常详细,并且叙述有条有理,几乎全世界的计算机爱好者都在看这本书以理解操作系统的工作原理。其
中也包括 Linux 系统的创始者 Linus Benedict Torvalds。
当时(1991 年),Linus Benedict Torvalds 是赫尔辛基大学计算机科学系的二年级学生,也是一个自
学 hacker。这个 21 岁的芬兰年轻人喜欢鼓捣计算机,测试计算机的能力和限制。但当时缺乏的是一个专
业级的操作系统。MINIX 虽然很好,但只是一个用于教学目的简单操作系统,而不是一个强有力的实用操
作系统。
到 1991 年,GNU 计划已经开发出了许多工具软件。最受期盼的 Gnu C 编译器已经出现,但还没有开发
出免费的 GNU 操作系统。即使是 MINIX 也开始有了版权,需要购买才能得到源代码。而 GNU 的操作系统 HURD
一直在开发之中,但并不能在几年内完成。
对于 Linus 来说,已经不能等待了。从 1991 年 4 月份起,他开始酝酿并着手编制自己的操作系统。
刚开始,他的目的很简单,只是为了学习 Intel 386 体系结构保护模式运行方式下的编程技术。但后来 Linux
的发展却完全改变了初衷。
1991 年初,Linux 开始在一台 386sx 兼容微机上学习 minix 操作系统。通过学习,他逐渐不能满足 minix
系统的现有性能,并开始酝酿开发一个新的免费操作系统。根据 Linus 在 comp.os.minix 新闻组上发布的
消息,我们可以知道他逐步从学习 minix 系统到开发自己的 Linux 的过程。
Linus 第 1 次向 comp.os.minix 投递消息是在 1991 年 3 月 29 日。题目是“gcc on minix-386 doesn’t
optimize”,是有关 gcc 编译器在 minix-386 上运行的优化问题,由此可知,Linus 在 1991 年的初期已经
开始深入研究了 minix 系统,并在这段时间有了改进 minix 操作系统的思想,而且在进一步学习 minix 系
统中,逐步演变为想自己重新设计一个基于 Intel 80386 体系结构的新操作系统。
他在回答有人提出 minix 上的一个问题时,所说的第一句话是“阅读源代码”(“RTFSC (Read the
F**ing Source Code :-)”)。他认为答案就在源程序中。这也说明了对于学习系统软件来说,你不光需
要懂得系统的工作基本原理,还需要结合实际系统,学习实际系统的实现方法。因为理论毕竟是理论,其
中省略了许多枝节,而这些枝节问题虽然没有太多的理论含量,但却是一个系统必要的组成部分,就向麻
雀身上的一根羽毛。
从 1991 年的 4 月份开始,Linus 几乎花了全部时间研究 386-minix 系统(hack the kernel),并且尝
试着移植 GNU 的软件到该系统上(GNU gcc、bash、gdb 等)。并于 4 月 13 日在 comp.os.minix 上发布说自
己已经成功地将 bash 移植到了 minix 上,而且已经爱不释手、不能离开这个 shell 软件了。
第一个与 Linux 有关的消息是在 1991 年 7 月 3 日在 comp.os.minix 上发布的(当然此时还不存在 Linux
这个名称,当时 Linus 的脑子里想的可能是 FREAX
☺,FREAX 的英文含义是怪诞的、怪物、异想天开等)。
其中透露了他正在进行 Linux 系统的开发,并且在 Linux 最初的时候已经想到要实现与 POSIX(UNIX 的国
际标准)的兼容问题了。
在 Linus 的下一发布的消息中(1991 年 8 月 25 日 comp.os.minix),他向所有 minix 用户询问“What
would you like to see in minix?”(“你最想在 minix 中见到什么?”),在该消息中他首次透露出正
概述 linux/
4
在开发一个(免费的)386(486)操作系统,并且说只是兴趣而已,代码不会很大,也不会象 GNU 的那样专业。
开发免费操作系统这个想法从 4 月份就开始酝酿了,希望大家反馈一些对于 minix 系统中喜欢那些特色不
喜欢什么等信息,由于实际的和其它一些原因,新开发的系统刚开始与 minix 很象(并且使用了 minix 的
文件系统)。并且已经成功地将 bash(1.08 版)和 gcc(1.40 版)移植到了新系统上,而且在过几个月就可以
实用了。
最后,Linus 申明他开发的操作系统没有使用一行 minix 的源代码;而且由于使用了 386 的任务切换
特性,所以该操作系统不好移植(没有可移植性),并且只能使用 AT 硬盘。对于 Linux 的移植性问题,Linus
当时并没有考虑。但是目前 Linux 几乎可以运行在任何一种硬件体系结构上。
到了 1991 年的 10 月 5 日,Linus 在 comp.os.minix 新闻组上发布消息,正式向外宣布 Linux 内核系
统的诞生(Free minix-like kernel sources for 386-AT)。这段消息可以称为 Linux 的诞生宣言,并且
一直广为流传。因此 10 月 5 日对 Linux 社区来说是一个特殊的日子,许多后来 Linux 的新版本发布时都
选择了这个日子。所以 RedHat 公司选择这个日子发布它的新系统也不是偶然的。
1.1.6 Linux 操作系统版本的变迁
0.00 (1991.2-4?) 两个进程分别显示 AAA BBB
0.01 (1991.9?)第一个正式向外公布的 Linux 内核版本。
0.02 (1991.10.5)该版本以及 0.03 版是内部版本,目前已经无法找到。
0.03 (1991.10.5)
0.10 (1991.10)由 Ted Ts’o 发布的 Linux 内核版本。
0.11 (1991.12.8)基本可以正常运行的内核版本(也是本书着重注释的版本)。
0.12 (1992.1.15)主要加入对数学协处理器的软件模拟程序。
2. .
95(0.13) (1992.3.8) 开始加入虚拟文件系统思想的内核版本。
0.96 (1992.5.12)开始加入网络支持和虚拟文件系统 VFS。
0.97 (1992.8.1)
0.98 (1992.9.29)
0.99 (1992.12.13)
2.4.
(1994.3.14)
1.20 (1995.3.7)
2.0 (1996.2.9)
2.20 (1999.1.26)
2.40 (2001.1.4)
到现在为止,最新版是
内核版本号 发布日期
代码总字节数
2.4.20 2002.11.29
26,200,000
2.5.52 2002.12.16
30,000,000
将 Linux 系统 0.13 版内核直接改称 0.95 版,Linus 的意思是让大家不要觉得离 1.0 版还很遥远。同
时,从 0.95 版开始,对内核的许多改进之处(补丁程序的提供)均以其他人为主了,而 Linus 的主要任务
开始变成对内核的维护和决定是否采用某个补丁程序。
1.1.7 Linux 名称的来由
Linux 操作系统刚开始时并没有被称作 Linux,Linus 给他的操作系统取名为 FREAX,其英文含义是怪
诞的、怪物、异想天开等意思。在他将新的操作系统上载到 ftp.funet.fi 服务器上时,管理员 Ari Lemke
概述 linux/
5
很不喜欢这个名称。他认为既然是 Linus 的操作系统就取其谐音 Linux 作为该操作系统的目录吧,于是
Linux 这个名称就开始流传下来。
在 Linus 的自传《Just for Fun》一书中,Linus 解释说:
“坦白地说,我从来没有想到过要用 Linux 这个名称发布这个操作系统,因为这个名字有些太自负了。
而我为最终发布版准备的是什么名字呢?Freax。实际上,内核代码中某些早期的 Makefile - 用于描述如
何编译源代码的文件 - 文件中就已经包含有“Freax”这个名字了,大约存在了半年左右。但其实这也没
什么关系,在当时还不需要一个名字,因为我还没有向任何人发布过内核代码。”
“而 Ari Lemke,他坚持要用自己的方式将内核代码放到 ftp 站点上,并且非常不喜欢 Freax 这个名
字。他坚持要用现在这个名字(Linux),我承认当时我并没有跟他多争论。但这都是他取的名字。所以我
可以光明正大地说我并不自负,或者部分坦白地说我并没有本位主义思想。但我想好吧,这也是个好名字,
而且以后为这事我总能说服别人,就象我现在做的这样。”
-- Linus Torvalds《Just for fun》第 84-88 页。
1.1.8 早期 Linux 系统开发的主要贡献者
从 Linux 的早期源代码中可知,Linux 系统的早期主要开发人员除了 Linus 本人以外,最著名的人员之一
就是 Theodore Ts'o (Ted Ts'o)。他 1990 年毕业于 MIT 计算机科学专业。在大学时代他就积极参加学校
中举办的各种学生活动。他喜欢烹饪、骑自行车,当然还有就是 hacking on Linux,后来他开始喜欢起业
余无线电报运动。目前他在 IBM 工作从事系统编程及其它重要事务。他还是国际网络设计、操作、销售和
研究者开放团体 IETF 成员。
Linux 在世界范围内的流行也有他很大的功劳。早在 Linux 操作系统刚问世时,他就怀着极大的热情为
linux 的发展提供了 maillist,几乎是在 Linux 刚开始发布起(1991 年开始)就一直为 Linux 做出贡献的人,
也是最早向 Linux 内核添加程序的人(Linux 内核 0.10 版中的虚拟盘驱动程序 ramdisk.c 和内核内存分配
程序 kmalloc.c)。直到目前仍然从事着与 Linux 有关的工作。他当时在北美洲地区最早设立了 linux 的
ftp 站点(tsx-11.mit.edu),而且至今仍然为广大 linux 用户提供服务。他对 linux 作出的最大贡献之一
是提出并实现了 ext2 文件系统。该文件系统已成为 linux 世界中事实上的文件系统标准。最近他又推出
了 ext3 文件系统,大大提高了文件系统的稳定性和访问效率。作为对他的推崇,第 97 期(2002 年 5 月)
的 linuxjournal 期刊将他作为了封面人物,并对他进行了采访。目前,他为 IBM linux 技术中心工作,
并从事着有关 LSB(Linux Standard Base)等方面的工作。
Linux 社区中另一位著名人物是 Alan Cox。他原工作于英国威尔士斯旺西大学(Swansea University
College)。刚开始他特别喜欢玩电脑游戏,尤其是 MUD(Multi-User Dungeon or Dimension,多用户网络
游戏)。在 90 年代早期 games.mud 新闻组的 posts 中你可以找到他发表的大量 posts。他甚至为此还写了
一偏 MUD 的发展史(rec.games.mud 新闻组,1992 年 3 月 9 日,A history of MUD)。由于 MUD 游戏与网络
密切相关,慢慢的他对计算机网络开始感兴趣。为了玩游戏并提高电脑运行游戏的速度以及网络传输的速
度,他开始接触各种类型的操作系统,为他的游戏选择一个最为满意的平台。由于没钱,即使 Minix 他都
买不起,当 Linux 0.11 和 386BSD 发布时,他考虑良久总算买了一台 386SX 电脑。由于 386BSD 需要数学
协处理器的支持,而 386SX 中是不带的,所以他安装了 Linux 系统。于是他开始学习带有免费源代码的
Linux。开始对 Linux 产生了兴趣,尤其是有关网络方面的实现。在关于 Linux 的单用户运行模式问题的
讨论中,他甚至赞叹 Linux 实现的巧妙(beautifully)。
Linux 0.95 版发布之后,他开始为 Linux 系统编写补丁程序(修改程序)(记得他最早的两个补丁程序,
都没有被 Linus 采纳),成为 Linux 上 TCP/IP 网络代码的最早使用人之一。后逐渐加入 Linux 的开发队伍,
并开始成为维护 Linux 内核源代码的主要负责人之一,也可以说成为 Linux 社团中在 Linus 之后最为重要
的人物。以后 Microsoft 公司曾经邀请他加盟,但他却干脆地拒绝了。从 2001 年开始他负责维护 Linux
内核 2.4.x 的代码(Linus 主要负责开发最新开发版内核的研制(奇数版,比如 2.5.x 版)。
《内核骇客手册》一书的作者 Michael K. Johnson 也是最早接触 Linux 操作系统的人之一(从 0.97 版)。
概述 linux/
6
他还是著名 Linux 文档计划(Linux Document Project - LDP)的发起者之一。曾经在 Linux Journel 工
作,现在 RedHat 公司工作。
Linux 系统并不是仅有这些中坚力量就能发展成今天这个样子的,还有许多计算机高手对 Linux 做出了极
大的贡献,这里就不一一列举了。主要贡献者的具体名单可参见 Linux 内核中的 CREDITS 文件,其中以字
母顺序列出了对 Linux 做出较大贡献的近 400 人的名单列表,包括他们的 email 地址和通信地址、主页以
及主要贡献事迹等信息。
通过上述说明,我们可以对上述 Linux 的五大支柱归纳如下:
UNIX 操作系统 -- UNIX 于 1969 年诞生在 Bell 实验室。Linux 就是 UNIX 的一种克隆系统。UNIX
的重要性就不用多说了。
MINIX 操作系统 -- Minix 操作系统也是 UNIX 的一种克隆系统,它于 1987 年由著名计算机教授
Andrew S. Tanenbaum 开发完成。由于 MINIX 系统的出现并且提供源代码(只能免费用于大学内)
在全世界的大学中刮起了学习 UNIX 系统旋风。Linux 刚开始就是参照 Minix 系统于 1991 年才开
始开发。
GNU 计划-- 开发 Linux 操作系统,以及 Linux 上所用大多数软件基本上都出自 GNU 计划。Linux
只是操作系统的一个内核,没有 GNU 软件环境(比如说 bash shell),则 Linux 将寸步难行。
POSIX 标准 -- 该标准在推动 Linux 操作系统以后朝着正规路上发展起着重要的作用。是 Linux
前进的灯塔。
INTERNET -- 如果没有 Intenet 网,没有遍布全世界的无数计算机骇客的无私奉献,那么 Linux
最多只能发展到 0.13(0.95)版的水平。
1.2 内容综述
本文将主要对 Linux 的早期内核 0.11 版进行详细描述和注释。Linux-0.11 版本是在 1991 年 12 月 8
日发布的。在发布时包括以下文件:
bootimage.Z - 具有美国键盘代码的压缩启动映像文件;
rootimage.Z - 以 1200kB 压缩的根文件系统映像文件;
linux-0.11.tar.Z- 内核源代码文件;
as86.tar.Z - linux bruce evans'二进制执行文件;
是 16 位的汇编程序和装入程序;
INSTALL-0.11 - 更新过的安装信息文件。
目前除了原来的 rootimage.Z 文件,其它四个文件均能找到。
本文主要详细分析 linux-0.11 内核中的所有源代码程序,对每个源程序文件都进行了详细注释,包
括对 Makefile 文件的注释。分析过程主要是按照计算机启动过程进行的。因此分析的连贯性到初始化结
束内核开始调用 shell 程序为止。其余的各个程序均针对其自身进行分析,没有连贯性,因此可以根据自
己的需要进行阅读。但在分析时还是提供了一些应用实例。
所有的程序在分析过程中如果遇到作者认为是较难理解的语句时,将给出相关知识的详细介绍。比如,
在阅读代码头一次遇到 C 语言内嵌汇编码时,将对 gnu C 语言的内嵌汇编语言进行较为详细的介绍;在遇
到对中断控制器进行输入/输出操作时,将对 Intel 中断控制器(8259A)芯片给出详细的说明,并列出使
用的命令和方法。这样做有助于加深对代码的理解,又能更好的了解所用硬件的使用方法,作者认为这种
剩余486页未读,继续阅读
zdcwireless
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- JDK 17 Linux版本压缩包解压与安装指南
- C++/Qt飞行模拟器教员控制台系统源码发布
- TensorFlow深度学习实践:CNN在MNIST数据集上的应用
- 鸿蒙驱动HCIA资料整理-培训教材与开发者指南
- 凯撒Java版SaaS OA协同办公软件v2.0特性解析
- AutoCAD二次开发中文指南下载 - C#编程深入解析
- C语言冒泡排序算法实现详解
- Pointofix截屏:轻松实现高效截图体验
- Matlab实现SVM数据分类与预测教程
- 基于JSP+SQL的网站流量统计管理系统设计与实现
- C语言实现删除字符中重复项的方法与技巧
- e-sqlcipher.dll动态链接库的作用与应用
- 浙江工业大学自考网站开发与继续教育官网模板设计
- STM32 103C8T6 OLED 显示程序实现指南
- 高效压缩技术:删除重复字符压缩包
- JSP+SQL智能交通管理系统:违章处理与交通效率提升
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功