[Linux.0.01内核分析与操作系统设计创造你自己的操作系统].卢军.扫描版.pdf
内容简介
本书巧妙地结合了Linux内核源代码分析操作系统设计原理和操作系统设计实践三个方面的内
容,在对Linuκ0.01内核源代码进行深人分析的基础上,讲解了操作系统设计的基本原理和方法技巧。
同时,还向读者提供了大量的操作系统实践方面的实例。通过对本书的学习,读者可以对操作系统的内
核有深人的了解,掌握基本的硬件操作和控制能力,具有对操作系统的理解和实践能力。本书中的所有
例子,都可以使用GNU编译器来编译,所有的工具软件也都可以应用到GNU的自由软件中。
本书内容丰富、通俗易懂、可操作性强,既可作为大学高年级本科和研究生学习操作系统设计的辅
导教材,也可作为计算机爱好者学习和分析Iinuⅸ内核的教材。同时,也是软件工程师进行各类操作系
统设计的最佳参考用书。
版权所有,翻印必究。举报电话010-627829891390110429713801310933
本书封面贴有清华大学出版社激光防伪标签,无标签者不得销售。
图书在版编目(CIP)数据
Linuⅹ0.01内核分析与操作系统设计/卢军编著.北京:清华大学出版社,2004.10
ISBN7-302-09407-1
Ⅰ.L…Ⅱ.卢…Ⅲ.linu操作系统.TP1689
中国版本图书馆CIP数据核字(2004)第090617号
出版者:清华大学出版社
地址:北京清华大学学研大厦
http://www.tup.com.cn
邮编:100084
杜总机:01062770175
客户服务:010-62776969
责任编辑:宋韬
封面设计:付剑飞
印装者:北京市清华园胶印厂
发行者:新华书店总唐北京发行所
开本:185×260
印张:20.5
宇数:469千字
版次:2004年10月第1版2004年10月第1次印刷
书号:ISBN7302094071/TP·6565
印数:1~4000
定价:32.00元(附光盘1张)
本书如存在文字不清漏印以及缺页倒页、脱页等印装质量问题,请与清华大学出版社出版部联系
调换。联系电话:(010)62770175-3103或(010)62795704
前言
操作系统是一个非常复杂的软件,设计和实现一个操作系统需要具有精深的理论知
识和高超的实践能力。传统的操作系统设计课程,过于偏重理论的学习,缺乏对实践的指
导。如果希望深入地学习操作系统的设计,最好的方法就是找一个操作系统来自已实践
在实践中学习,可以创造出奇迹
Linux的诞生,为我们接触到世界上最优秀的操作系统内核提供了机会。Linux具有
诸多优点,因此越来越多的计算机爱妤者投入到学习Iiⅸx的行列中来。对于软件工程师
而言,liⅸ作为一个功能强大,源码开放的操作系统,是学习操作系统设计的最好教材。
现在有许多书籍介绍Iinuⅸ的内核,然而这些书籍大多侧重于最新的内核,例如
2.x.x的内核。Linuⅸ核心源代码的文件數量和代码的行数随着版本的增长而飞速地增
加。对于Linux0.01而言,文件数量是76个,所有源代码只有8413行。而Linux2.4.22
核心有文件1万个,源代码行数有468万行之多。目前,Lnu内核的最新版本是2.6.0,
Linux26.0的内核是一个完善的操作系统内核,具有丰富的功能。但是Linux2.6.0内
核的源代码数量也是惊人的,有数百万行代码。即便是Linuκ1.0的源代码,也有高达16
万行的代码量。作者认为普通的读者去学习几十万行和几百万行代码的Linux核心是很
困难的。因为,Linux核心的功能已经扩展得非常复杂,许多经典的理论和实现都被大量
的细节所掩盖,使读者难以掌握操作系統设计的精髓。
而Linux0.01虽然是Linux的第一个发行版本,但是却基本具备了操作系统中最重
要的組成部分,同时Linux0.01只有8500行左右的代码,对于初学者而言,学习起来就
非常简单和轻松了。因此,本书以Lnux0.01核心为背景,来介绍操作系统的设计。
操作系统是运行在计算机硬件上的第一层软件,因此开发一个操作系统与开发一个
普通的应用程序有很大的不同。本书以Linux0.01为基础,带领读者在学习操作系统基
本的设计理论和实践技巧的基础上,使用Linux0.01的源代码,去修改、编译、试验自己
感兴趣的东西。
本书提供的Linux0.01源代码,都可以在Redhatlinux7.x/8.x上编译。同时,本
书还提供了大量可以使用GNU編译器編译的例子程序,这些例子程序都可以轻松地移
植到Linux0.01的代码中,为Linux0.01拓展功能。
学习完本书,相信读者会对操作系统的内核有深入的了解,掌握基本的硬件操作和控
制能力,具有对操作系统的理解和实践能力。本书中的所有例子,都可以使用GNU编译
器来編译,所有的工具软件也都可以使用到GNU的自由软件中。
本书巧妙地结合了Iinuκ内核源代码分析、操作系统设计原理和操作系统设计实践
个方面的内容,在基于对Linux0.01内核源代码进行深入分析的基础上,讲解了操作
系统设计的基本原理,同时还向读者提供了大量的操作系统实践方面的实倒。
通过本书的学习,读者可以掌握操作系统设计的基本原理和技术,可以学习到经典的
Linuκ0.01内核的源代码。同时,本书给读者安排了大量的基于Linuκ0.01内核的搡作
系统设计实例。这些实例都是精心设计的,它们大多数都可以直接使用在操作系统的设
计实现中,从而帮助读者快速地掌握操作系统设计的基本技能。
本书的背景是Linux0.01内核,这是一个经典、简单、易懂的内核,是读者学习操作
Linux0.01内核分析与操作系统设计
系统设计的最佳切入点。本书对操作系统设计中设计的一些较为复杂的软件和硬件知识
都力图通过具体的实例来进行演示和分析,强调边学习,边实践。
本书自带的光盘,包含了可以編译运行的Linux0.01核心源代码和本书中所有实例
的源代码,这些源代码都可以在读者的计算机上自由通畅地运行。光盘中还包括了进行
操作系统设计所需要的所有的GNU开发工具,通过这些工具,读者可以迅速地进行各类
操作系统的设计。
在本书配套光盘中包含了如下内容:
/386ntel目录
/j包含了80386的详细技术手册
/doc目录
/j包含了可引导光盘技术手册
example
∥本书各章中的例程源代码
/kernel目录
∥/包含了Linux0.01版本的核心源代码
/Linux.tar.gz
/gz压縮格式源代码
/inu∞o.0Comment,zip//Linux0.0l核心源代码的注释
Linux0.01.zip
ZP压缩格式源代码
∥/编译、测试Iinx0.01和本书中例子需要使用到的工具软件
/as86andld86
∥/l-s86汇编器和li86链接器
ochs
∥/开放源代码的虚拟机软件
/disk
∥磁胜盘映像文件生成工具集
Djgpp
/OXs下的GNU编译器
nasn
rasm汇编器
/mtools
∥生成bochs使用的碰盘文件的工具
nasim
nasm汇编器
注意,本书的Linuκ0.01源代码推荐在Redhat7.x8.x中編译。
本配套光盘中的所有文件都可以直接复制到本地磁盘中加以使用。
本书由卢军担任主要编写工作。同时,参与本书编排的人员还有:王安贵、陈郭宜、程
小英、谭小丽、卢丽娟、刘育忐、吴淬砺、赵明星、贺洪俊、李小平、史利、张燕秋、周林英、黄
茂英、李力、李小琼、李修华、田茂敏、苏萍、巫文斌、邹勤、粟徳容、童芳、李中全、蒋敏、刘华
菊、袁媛、李建康等,在此一并感谢
由于編写时间仓促,书中疏漏之处在所难免,欢迎广大读者和同行批评指正。
延伸服务:如果读者愿意参加“Linux0.01内核分析与操作系统设计-一创造你自己
的操作系统”的学习培训,或是在学习过程中发现问题,或有更好的建议,欢迎致函。同
时,我们也非常愿意随时同操作系统爱好者保持经常的联系,我们的E-mai:boia@bo
J1a.net网址http://www.bojia.net我们将认真、负责地对待每位读者的来信。
作者
2004年7月
目录
第I章GNU和Linux简介………,…
1.1自由的天地:GNU和Linux
1.1.1热爱和享受自由
1.2神奇的Linux………………………………
11236
1.2在乐趣中获得成功
1.2.111岁开始编程序
12.2一种操作系统的诞生………
1.3GNU的开发工具
66788
1.3.1编译器家族GCC…………………………………………
13.2和操作系统开发有关的工具…
1.4本章小结
12
第2章操作系统设计入门……………………………………………13
2.1操作系统介绍………………………………………………………13
2.1.1早期的操作系统…
14
2.1.2DOs操作系统…
………………………………s……………14
2.1.3Unx和Windows操作系统两大阵营………………………………5
2.1.4自由时代的宠儿Linux………………
2.2操作系统的基本功能…
4非喜1.
…*…16
2.3编写操作系统的建议
………:…17
2.3.1编程语言选择……………………………………………………………18
2.3.2编译器和链接器
18
2.3.3运行时函数库……
…………19
234使用汇编语言完成底层操作·
21
2.3.5关于C++的使用……21
2.4x86虚拟机Bohs使用简介
…·21
2.4.1Bochs简介
2
2.4.2下载bochs软件……………………………………………………23
24.3如何安装Boch
23
2.5使用Bochs运行一个操作系统…
26
2.5.1制作一个软盘镜像文件…
2.5.2使用Bochs运行操作系统…
26操作系统设计的基本准则…
2.6.1简单就是优美…
31
2.6.2利用已有的基础…
自·自非「··自·着自非「
31
2.6.3良好的设计……
··B如,·丰如,,着电审
…………………31
2.6.4单内核操作系统和微内核操作系统……………………………32
2.7本章小结………………………………………………………………………32
PDG
Ⅳ
Linuκ0.01内核分析与操作系统设计
第3章操作系统设计基础
33
3.1使用D]GPP……………………………………………………………33
3.1.1DJGPP和RHDE的安装与使用……
………………33
3.1.2make的使用
3.1.3ld的使用…………………………………………………36
3.1.4nasm的使用
36
3.2保护模式汇编语言…
翻+量量鲁曾量1番普音音吾·晋晋量量番
3.2.1一个简单的实模式的汇编语言的例子…………………………………37
3.2.2Linux汇编程序设计
38
3.3实例:一些简单的例子程序
3.31识别CPU类型…………………………………………………………40
3.3.2直接向视频缓冲区输出
…………46
3.3.3检测显示器类型…
3.3.4移动光标……………………………………………………49
3.4本章小结…
垂电和由垂
………49
第4章Linux0.01内核简介……
51
4.1Linux0.01内核简介…
4.1.ILinux0.01内核背景…
52
4.1.2Linux0.01内核的技术特色
52
4.1.3存储管理…
4.1.4文件系统…
4.1.5硬件平台移植和应用程序
54
4.2Linux0.01核心代码目录
54
4.3核心源代码的目录分布………………………55
4.3.1boot目录
,“;55
4.3.2fs目录
…→……→…“…………·······*:·:··::::::·+·++·*+·“
57
4.3.3include目录
…………58
4.3.4init目录
……58
4.3.5kernel目录…
4.3.6lib目录………
::·++#+·++++‘..·44····:·“4··::::··
4.3.7mm目录
··中·备
日由aa画看dd番
4.3.8tols目录
·*=··4·.····a··甲,·早
61
4.4Linux0.01的main.C分析
a·;·*和ad吾壬吾量晋晋晋···丰·+·吾面看“看晋“看日·.1·.
4.5编译和运行Linux0.01系统
+·+++..
……………65
4.6本章小结…
66
第5章操作系统引导………………………………………68
5.1操作系统引导的基本知识…
r=---+-·4:··.·········
册吾吾吾晋
68
5.1.1系统引导设备
中甲鲁带鲁中中自·普:「··甲··『m
5.1.2启动过程简介…………………………………………73
目录
V
5.1.3硬盘主引导扇区简介
75
5.1.4软盘主引导扇区………………………………………………………78
5.1.5Linux0.01引导代码分析…………………
量甲晋吾,量面番十
81
5.2引导扇区和引导代码实例分析…………………………………………93
5.2.1引导扇区的内容
93
52,2使用debug建立自己的第一张启动盘
95
5.2.3使用BIOS增强“操作系统”功能…………………………………97
5.3使用nasm生成引导代码……
5.3.1引导代码基础……
……99
5.3.2最简单的引导程序…
自·翻中,自浦翻自鲁鲁缩自自自面自。自着自由非申。·非自曲非着非虐
5.3.3如何设置段寄存器……………………………………………………………100
5.3.4在引导程序中装入程序(基于扇区)…
………………101
5.4本章小结
105
第6章存储管理分析
106
6.1操作系统内存管理策略简述…
106
6.1.1连续分配存储管理方式…
………………:106
6.1.2虚存组织
翻自自非看申
……………………………………………107
6.1.3非连续存储管理机制………………………………………………109
6.2物理存储管理
110
6.2.1技术细节………………111
6.2.2物理存储管理器的组织
112
6.2.3物理存储管理器的初始化
…114
6.2.4页面分配……14
6.2.5页面回收
…………………………115
6.2.6映射
…………………………………115
6.2.7内存映射………16
6.3虚拟存储管理……
l17
6.3.1技术细节……
…118
6.3.2malloc()和free(
118
6.3.3缺页处理
“·
119
6.3.4虚拟存储管理的页面分配
……………………………120
6.3.5可执行程序
:;a+;;a;F日.:·…····.···甲················
……121
6.36交换……
121
6.3.7处理流程……
…………………………122
6.4存储管理系统代码实例…
……………………………………123
6.4.1实例1:探测计算机的物理内存容量………………………123
2实例2:malloc()和free()的实现
138
6.5Linuⅹ0.01存储管理代码分析
由鲁
·.,.中丰·.丰:::
138
65.1nemory.c分析
…………………………………139
Ⅵ
Linux0.01内核分析与操作系统设计
6.5.2page.s分析……
139
6.6本章小结…………………………………………………140
第T章进程管理和调度…………………………………………………………141
7.1进程介绍……………
……141
7.1.1进程的基本功能
141
7.1.2进程的调度(chedule()函数)
145
7.1.3线程
量·量维量量雪量量维世世
………………147
7.2多任务实现基础
……148
7.3进程调度的性能分析…………………………………………………152
7.4Linw进程调度源代码分析………………………………………………153
7.5实例:实现协作式多任务…………………………………
154
7.6本章小结…………………………………………………………158
第8章设备管理和调度……………59
8.1Linux设备管理概述…………………………………………
………159
8.1.1设备管理的基本要求………………………………159
8.1.2驱动程序(Drivers)……
.“.““‘““.·“4““4““+4+“““
160
8.1.3接口(Interfaces)
………160
8.L.4异步IO(AsynchronousI/O)
162
8.2Linux0.01中断处理………………………………………………………164
8.2.1中断处理的基本过程
…………164
82.2traps.c文件分析
…………165
8.2.3/kernel/asm.s文件分析………………………………………168
8.3如何编写中断服务程序ISR…………………………………………172
8.4设备驱动程序实例
………………………174
84.1利用BOS的探测系统设备
174
8.4.2块设备驱动…………………………………177
8.4.3键盘驱动
178
8.4.4访问8042芯片各端口
画香番吾面垂曹面音干晋平噩吾,!善吾中平吾平寻。果香曹善·甲吾平.中·平平1
180
84.5发给8042的命令
182
8.4.6发给8048的命令…
185
8.4.78048到8042的数据…………………………………………………186
8.4.8键盘源代码………………………187
8.4.9探测软盘驱动器
……187
8.5Linux0.01设备驱动程序源代码分析………………19
8.5.1终端控制代码:console.c
8.5.2rs323驱动代码:serl.c和rs_io.s
203
86本章小结…………………………………………………208
第9章磁盘文件系统
曹理曾由追血虚量重售出鲁里塑量曾量晋量,
20Q
9,1硬盘驱动器结构简介
209
目录
Ⅶ
9.1.1硬盘参数解释
209
9.1.2基本INT13h调用简介……………………………………210
9.1.3现代硬盘结构简介
……210
9.1.4扩展INT13h简介
…………210
9.2Unx文件系统………………………………………………………………210
9.2.1磁盘的基础特性…
…,211
9.2.2现代磁盘的寻道延迟特性…
212
9.2.3Unix文件系统分析………
由甘面由a音a非和4非丰中q··“1·聊
213
93VirtualFileSystem(VFS)简介
……………………214
9.3.1VFS的体系结构……
215
93.2文件的表示……………………………………………216
93.3磁盘布局(Disklayout)……………………………………216
94文件系统设计步骤
…217
94.1磁盘函数库(Disklibrary)…………………………………217
94.2文件系统(Filesystem)
++·“-+++·
218
9.4.3容错性(Robustness
审4垂·垂垂
………220
9.5自己编写的简单文件系统
220
9.6Linux0.01文件系统源代码分析………………………………226
9.7本章小结
227
第10章she编程技术和实例……
…228
10.1shll的基本概念…………………………………………………………228
10.2实例:最简单的shll程序
…230
10.3管道和ⅣO重定向…………
235
10.3.1使用dup()重定向IO
235
10.3.2使用pipe()和dup()
236
10.3.3使用dup2()的例子
237
10.4t-shel实现代码分析…239
10.4.Ishell总体结构(不支持管道)
:非··
240
10.4.2shel总体结构(支持管道)
240
10.4.3main()函数…………………………………………………………241
10.4.4initialization()函数………………………………………………242
10.4.5getline(函数
·前‘和量出,和由面备面音晋面t
…………243
10.46prse()函数……………………………………244
10.4.7command()函数……………………………………245
10.4.8execute()函数
247
10.4.9forkexec()函数…249
10.4.10check()函数
251
10.4.11getname()函数…
251
10.4.12t-she运行效果
鲁曲翻看。鲁。1看q。鲁面翻。鲁垂电翻看·垂。。中斗意
……252
用户评论