本书对早期Linux内核(v0.12)全部代码文件进行了详细、全面的注释和说明,旨在帮助读者用较短的时间对Linux的工作机理获得全面而深刻的理解,为进一步学习和研究Linux打下坚实的基础。虽然选择的版本较低,但该内核已能够正常编译运行,并且其中已包括了Linux工作原理的精髓。书中首先以Linux源代码版本的变迁为主线,介绍了Linux的历史,同时着重说明了各个内核版本的主要区别和改进,给出了选择0.12版内核源代码作为研究对象的原因。在正式描述内核源代码之前,概要介绍了运行Linux的PC的硬件组成结构、编制内核使用的汇编语言和C语言扩展部分,并且重点说明了80x86处理器在保护模式下运行的编程方法。接着详细介绍了Linux内核源代码目录树组织结构,并依据该结构对所有内核程序和文件进行了注释和详细说明。有关代码注释的章节安排基本上都分为具体研究对象的概述、每个文件的功能介绍、代码内注释、代码中难点及相关资料介绍等部分。为了加深读者对内核工作原理的理解,书中最后一章给出了围绕Linux 0.12系统的多个试验。试验中所使用的相关程序均可从本书配套网站(www.oldlinux.org)上下载。.\r\n
本书适合Linux爱好者作为学习内核工作原理的自学参考书籍,也适合作为高校计算机专业学生学习操作系统课程的辅助和实践教材,还可供一般技术人员作为开发嵌入式系统的参考书使用。...
序.
第1章 概述 1
1.1 Linux的诞生和发展 1
1.1.1 UNIX操作系统的诞生 1
1.1.2 MINIX操作系统 1
1.1.3 GNU计划 2
1.1.4 POSIX标准 2
1.1.5 Linux操作系统的诞生 3
1.1.6 Linux操作系统版本的变迁 4
1.1.7 Linux名称的由来 6
1.1.8 早期Linux系统开发的主要贡献者 7
1.2 内容综述 8
1.3 本章小结 12
第2章 微型计算机组成结构 13
2.1 微型计算机组成原理 13
2.2 I/O端口寻址和访问控制方式 15
2.2.1 I/O端口和寻址 15
2.2.2 接口访问控制 17
2.3 主存储器、BIOS和CMOS存储器 17
2.3.1 主存储器 17
2.3.2 基本输入/输出程序BIOS 18
2.3.3 CMOS存储器 19
2.4 控制器和控制卡 19
2.4.1 中断控制器 19
2.4.2 DMA控制器 20
2.4.3 定时/计数器 21
2.4.4 键盘控制器 21
2.4.5 串行控制卡 22
2.4.6 显示控制 24
2.4.7 软盘和硬盘控制器 25
2.5 本章小结 28
第3章 内核编程语言和环境 29
3.1 as86汇编器 29
3.1.1 as86汇编语言语法 30
3.1.2 as86汇编语言程序 31
3.1.3 as86汇编语言程序的编译和链接 33
3.1.4 as86和ld86使用方法和选项 34
3.2 GNU as汇编 35
3.2.1 编译as汇编语言程序 36
3.2.2 as汇编语法 37
3.2.3 指令语句、操作数和寻址 38
3.2.4 区与重定位 41
3.2.5 符号 43
3.2.6 as汇编命令 44
3.2.7 编写16位代码 46
3.2.8 AS汇编器命令行选项 46
3.3 C语言程序 46
3.3.1 C程序编译和链接 46
3.3.2 嵌入汇编 47
3.3.3 圆括号中的组合语句 51
3.3.4 寄存器变量 52
3.3.5 内联函数 52
3.4 C与汇编程序的相互调用 54
3.4.1 C函数调用机制 54
3.4.2 在汇编程序中调用C函数 59
3.4.3 在C程序中调用汇编函数 61
3.5 Linux 0.12目标文件格式 63
3.5.1 目标文件格式 63
3.5.2 Linux 0.12中的目标文件格式 66
3.5.3 链接程序输出 68
3.5.4 链接程序预定义变量 69
3.5.5 System.map文件 70
3.6 Make程序和Makefile文件 72
3.6.1 Makefile文件内容 72
3.6.2 Makefile文件中的规则 73
3.6.3 Makefile文件示例 73
3.6.4 make处理Makefile文件的方式 75
3.6.5 Makefile中的变量 76
3.6.6 让make自动推断命令 76
3.6.7 隐含规则中的自动变量 77
3.7 本章小结 78
第4章 80x86保护模式及其编程 79
4.1 80x86 系统寄存器和系统指令 79
4.1.1 标志寄存器 79
4.1.2 内存管理寄存器 80
4.1.3 控制寄存器 81
4.1.4 系统指令 84
4.2 保护模式内存管理 85
4.2.1 内存寻址 85
4.2.2 地址变换 86
4.2.3 保护 88
4.3 分段机制 89
4.3.1 段的定义 89
4.3.2 段描述符表 91
4.3.3 段选择符 93
4.3.4 段描述符 95
4.3.5 代码和数据段描述符类型 98
4.3.6 系统描述符类型 99
4.4 分页机制 100
4.4.1 页表结构 102
4.4.2 页表项格式 103
4.4.3 虚拟存储 104
4.5 保护 104
4.5.1 段级保护 105
4.5.2 访问数据段时的特权级检查 107
4.5.3 代码段之间转移控制时的特权级检查 108
4.5.4 页级保护 113
4.5.5 组合页级和段级保护 115
4.6 中断和异常处理 115
4.6.1 异常和中断向量 115
4.6.2 中断源和异常源 116
4.6.3 异常分类 117
4.6.4 程序或任务的重新执行 117
4.6.5 开启和禁止中断 118
4.6.6 异常和中断的优先级 118
4.6.7 中断描述符表 119
4.6.8 IDT描述符 119
4.6.9 异常与中断处理 120
4.6.10 中断处理任务 123
4.6.11 错误码 123
4.7 任务管理 124
4.7.1 任务的结构和状态 125
4.7.2 任务的执行 126
4.7.3 任务管理数据结构 126
4.7.4 任务切换 129
4.7.5 任务链 131
4.7.6 任务地址空间 132
4.8 保护模式编程初始化 133
4.8.1 进入保护模式时的初始化操作 134
4.8.2 模式切换 135
4.9 一个简单的多任务内核实例 137
4.9.1 多任务程序结构和工作原理 137
4.9.2 引导启动程序boot.s 140
4.9.3 多任务内核程序head.s 142
第5章 Linux内核体系结构 147
5.1 Linux内核模式 147
5.2 Linux内核系统体系结构 148
5.3 Linux内核对内存的管理和使用 150
5.3.1 物理内存 150
5.3.2 内存地址空间概念 150
5.3.3 内存分段机制 151
5.3.4 内存分页管理 154
5.3.5 CPU多任务和保护方式 157
5.3.6 虚拟地址、线性地址和物理地址之间的关系 157
5.3.7 用户申请内存的动态分配 161
5.4 中断机制 162
5.4.1 中断操作原理 162
5.4.2 80x86微机的中断子系统 163
5.4.3 中断向量表 164
5.4.4 Linux内核的中断处理 164
5.4.5 标志寄存器的中断标志 166
5.5 Linux的系统调用 166
5.5.1 系统调用接口 166
5.5.2 系统调用处理过程 167
5.5.3 Linux系统调用的参数传递方式 168
5.6 系统时间和定时 168
5.6.1 系统时间 168
5.6.2 系统定时 169
5.7 Linux进程控制 170
5.7.1 任务数据结构 170
5.7.2 进程运行状态 175
5.7.3 进程初始化 176
5.7.4 创建新进程 177
5.7.5 进程调度 178
5.7.6 终止进程 179
5.8 Linux系统中堆栈的使用方法 179
5.8.1 初始化阶段 180
5.8.2 任务的堆栈 181
5.8.3 任务内核态堆栈与用户态堆栈之间的切换 183
5.9 Linux 0.12采用的文件系统 184
5.10 Linux内核源代码的目录结构 184
5.10.1 内核主目录linux 185
5.10.2 引导启动程序目录boot 185
5.10.3 文件系统目录fs 186
5.10.4 头文件主目录include 187
5.10.5 内核初始化程序目录init 188
5.10.6 内核程序主目录kernel 188
5.10.7 内核库函数目录lib 191
5.10.8 内存管理程序目录mm 191
5.10.9 编译内核工具程序目录tools 192
5.11 内核系统与应用程序的
关系 192
5.12 linux/Makefile文件 192
5.12.1 功能描述 193
5.12.2 代码注释 194
5.13 本章小结 198
第6章 引导启动程序 199
6.1 总体功能 199
6.2 bootsect.S程序 201
6.2.1 功能描述 201
6.2.2 代码注释 202
6.2.3 其他信息 213
6.3 setup.S程序 214
6.3.1 功能描述 214
6.3.2 代码注释 216
6.3.3 其他信息 232
6.4 head.s程序 242
6.4.1 功能描述 242
6.4.2 代码注释 243
6.4.3 其他信息 251
6.5 本章小结 253
第7章 初始化程序 255
7.1 main.c程序 255
7.1.1 功能描述 255
7.1.2 代码注释 258
7.1.3 其他信息 265
7.2 环境初始化工作 268
7.3 本章小结 269
第8章 内核代码 271
8.1 总体功能 271
8.1.1 中断处理程序 271
8.1.2 系统调用处理相关程序 272
8.1.3 其他通用类程序 273
8.2 asm.s程序 273
8.2.1 功能描述 273
8.2.2 代码注释 275
8.2.3 Intel保留中断向量的定义 279
8.3 traps.c程序 279
8.3.1 功能描述 279
8.3.2 代码注释 279
8.4 sys_call.s程序 284
8.4.1 功能描述 284
8.4.2 代码注释 286
8.4.3 其他信息 294
8.5 mktime.c程序 296
8.5.1 功能描述 296
8.5.2 代码注释 297
8.5.3 闰年的计算方法 298
8.6 sched.c程序 298
8.6.1 功能描述 298
8.6.2 代码注释 300
8.6.3 其他信息 312
8.7 signal.c程序 317
8.7.1 功能描述 317
8.7.2 代码注释 325
8.7.3 进程信号说明 331
8.8 exit.c程序 332
8.8.1 功能描述 332
8.8.2 代码注释 333
8.9 fork.c程序 345
8.9.1 功能描述 345
8.9.2 代码注释 346
8.9.3 任务状态段信息 351
8.10 sys.c程序 352
8.10.1 功能描述 352
8.10.2 代码注释 353
8.11 vsprintf.c程序 366
8.11.1 功能描述 366
8.11.2 代码注释 367
8.11.3 vsprintf()的格式字符串 372
8.11.4 与当前版本的区别.. 374
8.12 printk.c程序 374
8.12.1 功能描述 374
8.12.2 代码注释 375
8.13 panic.c程序 375
8.13.1 功能描述 375
8.13.2 代码注释 376
8.14 本章小结 376
第9章 块设备驱动程序 377
9.1 总体功能 378
9.1.1 块设备请求项和请求队列 378
9.1.2 块设备访问调度处理 380
9.1.3 块设备操作方式 380
9.2 blk.h文件 381
9.2.1 功能描述 381
9.2.2 代码注释 382
9.3 hd.c程序 386
9.3.1 功能描述 386
9.3.2 代码注释 388
9.3.3 其他信息 400
9.4 ll_rw_blk.c程序 409
9.4.1 功能描述 409
9.4.2 代码注释 409
9.5 ramdisk.c程序 415
9.5.1 功能描述 415
9.5.2 代码注释 417
9.6 floppy.c程序 421
9.6.1 功能描述 421
9.6.2 代码注释 422
9.6.3 其他信息 435
第10章 字符设备驱动程序 449
10.1 总体功能 449
10.1.1 终端驱动程序基本原理 449
10.1.2 Linux支持的终端设备类型 450
10.1.3 终端基本数据结构 451
10.1.4 规范模式和非规范模式 455
10.1.5 控制台终端和串行终端设备 456
10.1.6 终端驱动程序接口 459
10.2 keyboard.S程序 459
10.2.1 功能描述 459
10.2.2 代码注释 459
10.2.3 其他信息 473
10.3 console.c程序 477
10.3.1 功能描述 477
10.3.2 代码注释 477
10.3.3 其他信息 503
10.4 serial.c程序 510
10.4.1 功能描述 510
10.4.2 代码注释 510
10.4.3 异步串行通信控制器UART 512
10.5 rs_io.s程序 517
10.5.1 功能描述 517
10.5.2 代码注释 518
10.6 tty_io.c程序 522
10.6.1 功能描述 522
10.6.2 代码注释 523
10.6.3 控制字符VTIME、VMIN 536
10.7 tty_ioctl.c程序 536
10.7.1 功能描述 536
10.7.2 代码注释 537
10.7.3 波特率与波特率因子 543
第11章 数学协处理器 545
11.1 总体功能描述 545
11.1.1 浮点数据类型 546
11.1.2 数学协处理器功能和结构 550
11.2 math_emulate.c程序 553
11.2.1 功能描述 553
11.2.2 代码注释 555
11.3 error.c程序 565
11.3.1 功能描述 565
11.3.2 代码注释 566
11.4 ea.c程序 566
11.4.1 功能描述 566
11.4.2 代码注释 567
11.5 convert.c程序 570
11.5.1 功能描述 570
11.5.2 代码注释 570
11.6 add.c程序 574
11.6.1 功能描述 574
11.6.2 代码注释 575
11.7 compare.c程序 577
11.7.1 功能描述 577
11.7.2 代码注释 577
11.8 get_put.c程序 579
11.8.1 功能描述 579
11.8.2 代码注释 579
11.9 mul.c程序 585
11.9.1 功能描述 585
11.9.2 代码注释 585
11.10 div.c程序 586
11.10.1 功能描述 586
11.10.2 代码注释 587
第12章 文件系统 589
12.1 总体功能 589
12.1.1 MINIX文件系统 590
12.1.2 文件类型、属性和目录项 594
12.1.3 高速缓冲区 598
12.1.4 文件系统底层函数 599
12.1.5 文件中数据的访问操作 599
12.1.6 文件和目录管理系统调用 601
12.1.7 360KB软盘中文件系统实例分析 602
12.2 buffer.c程序 605
12.2.1 功能描述 605
12.2.2 代码注释 611
12.3 bitmap.c程序 621
12.3.1 功能描述 622
12.3.2 代码注释 622
12.4 truncate.c程序 627
12.4.1 功能描述 627
12.4.2 代码注释 627
12.5 inode.c程序 630
12.5.1 功能描述 630
12.5.2 代码注释 632
12.6 super.c程序 641
12.6.1 功能描述 641
12.6.2 代码注释 642
12.7 namei.c程序 650
12.7.1 功能描述 650
12.7.2 代码注释 651
12.8 file_table.c程序 675
12.8.1 功能描述 675
12.8.2 代码注释 675
12.9 block_dev.c程序 676
12.9.1 功能描述 676
12.9.2 代码注释 677
12.10 file_dev.c程序 680
12.10.1 功能描述 680
12.10.2 代码注释 680
12.11 pipe.c程序 682
12.11.1 功能描述 682
12.11.2 代码注释 683
12.12 char_dev.c程序 687
12.12.1 功能描述 687
12.12.2 代码注释 687
12.13 read_write.c程序 690
12.13.1 功能描述 690
12.13.2 代码注释 690
12.13.3 用户程序读写操作过程 693
12.14 open.c程序 695
12.14.1 功能描述 696
12.14.2 代码注释 696
12.15 exec.c程序 703
12.15.1 功能描述 703
12.15.2 代码注释 706
12.15.3 其他信息 718
12.16 stat.c程序 722
12.16.1 功能描述 722
12.16.2 代码注释 722
12.17 fcntl.c程序 724
12.17.1 功能描述 724
12.17.2 代码注释 725
12.18 ioctl.c程序 727
12.18.1 功能描述 727
12.18.2 代码注释 728
12.19 select.c程序 729
12.19.1 功能描述 729
12.19.2 代码注释 733
第13章 内存管理 741
13.1 总体功能 741
13.1.1 内存分页管理机制 741
13.1.2 Linux中物理内存的管理和分配 744
13.1.3 Linux内核对线性地址空间的使用分配 745
13.1.4 页面出错异常处理 745
13.1.5 写时复制机制 746
13.1.6 需求加载机制 746
13.2 memory.c程序 747
13.2.1 功能描述 747
13.2.2 代码注释 749
13.3 page.s程序 765
13.3.1 功能描述 765
13.3.2 代码注释 765
13.3.3 页出错异常处理 766
13.4 swap.c程序 767
13.4.1 功能描述 767
13.4.2 代码注释 767
第14章 头文件 775
14.1 include/目录下的文件 775
14.2 a.out.h文件 776
14.2.1 功能描述 776
14.2.2 代码注释 777
14.2.3 a.out执行文件格式 783
14.3 const.h文件 786
14.3.1 功能描述 786
14.3.2 代码注释 786
14.4 ctype.h文件 787
14.4.1 功能描述 787
14.4.2 代码注释 787
14.5 errno.h文件 788
14.5.1 功能描述 788
14.5.2 代码注释 789
14.6 fcntl.h文件 790
14.6.1 功能描述 790
14.6.2 代码注释 790
14.7 signal.h文件 792
14.7.1 功能描述 792
14.7.2 文件注释 792
14.8 stdarg.h文件 795
14.8.1 功能描述 795
14.8.2 代码注释 795
14.9 stddef.h文件 796
14.9.1 功能描述 796
14.9.2 代码注释 796
14.10 string.h文件 797
14.10.1 功能描述 797
14.10.2 代码注释 797
14.11 termios.h文件 806
14.11.1 功能描述 806
14.11.2 代码注释 807
14.11.3 控制字符TIME和MIN 812
14.12 time.h文件 813
14.12.1 功能描述 813
14.12.2 代码注释 813
14.13 unistd.h文件 815
14.13.1 功能描述 815
14.13.2 代码注释 815
14.14 utime.h文件 821
14.14.1 功能描述 821
14.14.2 代码注释 821
14.15 include/asm/目录下的文件 821
14.16 io.h文件 821
14.16.1 功能描述 821
14.16.2 代码注释 822
14.17 memory.h文件 822
14.17.1 功能描述 822
14.17.2 代码注释 822
14.18 segment.h文件 823
14.18.1 功能描述 823
14.18.2 代码注释 823
14.19 system.h文件 825
14.19.1 功能描述 825
14.19.2 代码注释 827
14.20 include/linux/目录下的文件 829
14.21 config.h文件 829
14.21.1 功能描述 829
14.21.2 代码注释 829
14.22 fdreg.h头文件 831
14.22.1 功能描述 831
14.22.2 文件注释 832
14.23 fs.h文件 834
14.23.1 功能描述 834
14.23.2 代码注释 834
14.24 hdreg.h文件 839
14.24.1 功能描述 839
14.24.2 代码注释 840
14.24.3 硬盘分区表 841
14.25 head.h文件 842
14.25.1 功能描述 842
14.25.2 代码注释 842
14.26 kernel.h文件 843
14.26.1 功能描述 843
14.26.2 代码注释 843
14.27 mm.h文件 844
14.27.1 功能描述 844
14.27.2 代码注释 844
14.28 sched.h文件 845
14.28.1 功能描述 845
14.28.2 代码注释 846
14.29 sys.h文件 853
14.29.1 功能描述 853
14.29.2 代码注释 854
14.30 tty.h文件 856
14.30.1 功能描述 856
14.30.2 代码注释 856
14.31 include/sys/目录中的文件 859
14.32 param.h文件 859
14.32.1 功能描述 859
14.32.2 代码注释 859
14.33 resource.h文件 859
14.33.1 功能描述 859
14.33.2 代码注释 860
14.34 stat.h文件 862
14.34.1 功能描述 862
14.34.2 代码注释 862
14.35 time.h文件 863
14.35.1 功能描述 863
14.35.2 代码注释 863
14.36 times.h文件 865
14.36.1 功能描述 865
14.36.2 代码注释 865
14.37 types.h文件 865
14.37.1 功能描述 865
14.37.2 代码注释 865
14.38 utsname.h文件 866
14.38.1 功能描述 866
14.38.2 代码注释 867
14.39 wait.h文件 867
14.39.1 功能描述 867
14.39.2 代码注释 867
第15章 库文件 869
15.1 _exit.c程序 869
15.1.1 功能描述 869
15.1.2 代码注释 870
15.1.3 相关信息 870
15.2 close.c程序 870
15.2.1 功能描述 870
15.2.2 代码注释 870
15.3 ctype.c程序 871
15.3.1 功能描述 871
15.3.2 代码注释 871
15.4 dup.c程序 872
15.4.1 功能描述 872
15.4.2 代码注释 872
15.5 errno.c程序 872
15.5.1 功能描述 872
15.5.2 代码注释 872
15.6 execve.c程序 873
15.6.1 功能描述 873
15.6.2 代码注释 873
15.7 malloc.c程序 873
15.7.1 功能描述 873
15.7.2 代码注释 875
15.8 open.c程序 882
15.8.1 功能描述 882
15.8.2 代码注释 882
15.9 setsid.c程序 883
15.9.1 功能描述 883
15.9.2 代码注释 883
15.10 string.c程序 884
15.10.1 功能描述 884
15.10.2 代码注释 884
15.11 wait.c程序 884
15.11.1 功能描述 884
15.11.2 代码注释 885
15.12 write.c程序 885
15.12.1 功能描述 885
15.12.2 代码注释 885
第16章 建造工具 887
16.1 build.c程序 887
16.1.1 功能描述 887
16.1.2 代码注释 888
16.2 MINIX可执行文件头部数据结构 893
第17章 实验环境设置与使用方法 895
17.1 Bochs仿真软件系统 895
17.1.1 设置Bochs系统 896
17.1.2 配置文件 *.bxrc 897
17.2 在Bochs中运行Linux 0.1x系统 900
17.2.1 软件包中文件说明 900
17.2.2 安装Bochs模拟系统 902
17.2.3 运行Linux 0.1x系统 902
17.3 访问磁盘映像文件中的信息 904
17.3.1 使用WinImage工具软件 904
17.3.2 利用现有Linux系统 905
17.4 编译运行简单内核示例程序 906
17.5 利用Bochs调试内核 908
17.5.1 运行Bochs调试程序 908
17.5.2 定位内核中的变量或数据结构 914
17.6 创建磁盘映像文件 915
17.6.1 利用Bochs软件自带的Image生成工具 916
17.6.2 在Linux系统下使用dd命令创建Image文件 917
17.6.3 利用WinImage创建DOS格式的软盘Image文件 917
17.7 制作根文件系统 918
17.7.1 根文件系统和根文件设备 918
17.7.2 创建文件系统 919
17.7.3 Linux-0.12的Bochs配置文件 921
17.7.4 在hdc.img上建立根文件系统 922
17.7.5 使用硬盘Image上的根文件系统 924
17.8 在Linux 0.12系统中编译0.12内核 925
17.9 在Fedora系统中编译Linux 0.1x内核 926
17.9.1 修改Makefile文件 926
17.9.2 修改汇编程序中的注释 927
17.9.3 内存位置对齐语句align值的修改 927
17.9.4 修改嵌入宏汇编程序 927
17.9.5 C程序变量在汇编语句中的引用表示 928
17.9.6 保护模式下调试显示函数 928
17.10 内核引导启动+根文件系统组成的集成盘 929
17.10.1 集成盘制作原理 929
17.10.2 集成盘的制作过程 931
17.10.3 运行集成盘系统 933
17.11 利用GDB和Bochs调试内核源代码 933
17.11.1 编译带gdbstub的Bochs系统 933
17.11.2 编译带调试信息的Linux 0.1x内核 934
17.11.3 调试方法和步骤 935
附录 939
附录A ASCII码表 939
附录B 常用C0、C1控制字符表 940
附录C 常用转义序列和控制
序列 941
附录D 第1套键盘扫描码集 943
参考文献... 944
赵炯
无封面