1.1.1 UNIX操作系统的诞生 1
1.1.2 MINIX操作系统 1
目录 1
序 1
第1章 概述 1
1.1 Linux的诞生和发展 1
1.1.4 POSIX标准 2
1.1.3 GNU计划 2
1.1.5 Linux操作系统的诞生 3
1.1.6 Linux操作系统版本的变迁 5
1.1.8 早期Linux系统开发的主要贡献者 7
1.1.7 Linux名称的由来 7
1.2 内容综述 8
2.1 微型计算机组成原理 13
第2章 微型计算机组成结构 13
2.2.1 I/O端口和寻址 15
2.2 I/O端口寻址和访问控制方式 15
2.3.1 主存储器 17
2.3 主存储器、BIOS和CMOS存储器 17
2.2.2 接口访问控制 17
2.3.2 基本输入/输出程序BIOS 18
2.4.1 中断控制器 19
2.4 控制器和控制卡 19
2.3.3 CMOS存储器 19
2.4.4 键盘控制器 21
2.4.3 定时/计数器 21
2.4.2 DMA控制器 21
2.4.5 串行控制卡 23
2.4.6 显示控制 24
2.4.7 软盘和硬盘控制器 26
3.1 as86汇编器 28
第3章 内核编程语言和环境 28
3.1.1 as86汇编语言语法 29
3.1.2 as86汇编语言程序 30
3.1.3 as86汇编语言程序的编译和链接 32
3.2 GNU as汇编 34
3.1.4 as86和ld86使用方法和选项 34
3.2.1 编译as汇编语言程序 35
3.2.2 as汇编语法 36
3.2.3 指令语句、操作数和寻址 38
3.2.4 区与重定位 40
3.2.5 符号 42
3.2.6 as汇编命令 43
3.3.1 C程序编译和链接 45
3.3 C语言程序 45
3.2.7 编写16位代码 45
3.2.8 as汇编器命令行选项 45
3.3.2 嵌入汇编 46
3.3.4 寄存器变量 50
3.3.3 圆括号中的组合语句 50
3.3.5 内联函数 51
3.4.1 C函数调用机制 53
3.4 C与汇编程序的相互调用 53
3.4.2 在汇编程序中调用C函数 58
3.4.3 在C程序中调用汇编函数 60
3.5.1 目标文件格式 62
3.5 Linux 0.11目标文件格式 62
3.5.2 Linux 0.11中的目标文件格式 65
3.5.3 链接程序输出 67
3.5.4 链接程序预定义变量 68
3.5.5 System.map文件 70
3.6 Make程序和Makefile文件 71
4.1.1 标志寄存器 74
4.1 80x86系统寄存器和系统指令 74
第4章 80x86保护模式及其编程 74
4.1.2 内存管理寄存器 75
4.1.3 控制寄存器 76
4.1.4 系统指令 79
4.2.2 地址变换 80
4.2.1 内存寻址 80
4.2 保护模式内存管理 80
4.2.3 保护 83
4.3.1 段的定义 84
4.3 分段机制 84
4.3.2 段描述符表 86
4.3.3 段选择符 88
4.3.4 段描述符 90
4.3.5 代码和数据段描述符类型 93
4.3.6 系统描述符类型 94
4.4 分页机制 95
4.4.1 页表结构 96
4.4.3 虚拟存储 98
4.4.2 页表项格式 98
4.5.1 段级保护 99
4.5 保护 99
4.5.2 访问数据段时的特权级检查 102
4.5.3 代码段之间转移控制时的特权级检查 103
4.5.4 页级保护 108
4.5.5 组合页级和段级保护 109
4.6.2 中断源和异常源 110
4.6.1 异常和中断向量 110
4.6 中断和异常处理 110
4.6.3 异常分类 111
4.6.6 异常和中断的优先级 112
4.6.5 开启和禁止中断 112
4.6.4 程序或任务的重新执行 112
4.6.7 中断描述符表 113
4.6.8 IDT描述符 114
4.6.9 异常与中断处理 115
4.6.10 中断处理任务 117
4.6.11 错误码 118
4.7.1 任务的结构和状态 119
4.7 任务管理 119
4.7.3 任务管理数据结构 120
4.7.2 任务的执行 120
4.7.4 任务切换 123
4.7.5 任务链 125
4.7.6 任务地址空间 126
4.8.1 进入保护模式时的初始化操作 127
4.8 保护模式编程初始化 127
4.8.2 模式切换 129
4.9 一个简单的多任务内核实例 130
4.9.1 多任务程序结构和工作原理 131
4.9.2 引导启动程序boot.s 134
4.9.3 多任务内核程序head.s 135
5.1 Linux内核模式 141
第5章 Linux内核体系结构 141
5.2 Linux内核系统体系结构 142
5.3.1 物理内存 143
5.3 Linux内核对内存的管理和使用 143
5.3.2 内存地址空间概念 144
5.3.3 内存分段机制 145
5.3.4 内存分页管理 147
5.3.6 虚拟地址、线性地址和物理地址之间的关系 150
5.3.5 CPU多任务和保护方式 150
5.3.7 用户申请内存的动态分配 154
5.4.1 中断操作原理 155
5.4 Linux系统的中断机制 155
5.4.2 80x86微机的中断子系统 156
5.4.4 Linux内核的中断处理 157
5.4.3 中断向量表 157
5.5.1 系统调用接口 159
5.5 Linux的系统调用 159
5.4.5 标志寄存器的中断标志 159
5.5.2 系统调用处理过程 160
5.6.1 系统时间 161
5.6 系统时间和定时 161
5.5.3 Linux系统调用的参数传递方式 161
5.7 Linux进程控制 162
5.6.2 系统定时 162
5.7.1 任务数据结构 163
5.7.2 进程运行状态 167
5.7.3 进程初始化 168
5.7.4 创建新进程 169
5.7.5 进程调度 170
5.7.6 终止进程 171
5.8.1 初始化阶段 172
5.8 Linux系统中堆栈的使用方法 172
5.8.2 任务的堆栈 173
5.8.3 任务内核态堆栈与用户态堆栈之间的切换 175
5.10 Linux内核源代码的目录结构 176
5.9 Linux 0.11采用的文件系统 176
5.10.3 文件系统目录fs 177
5.10.2 引导启动程序目录boot 177
5.10.1 内核主目录linux 177
5.10.4 头文件主目录incllude 179
5.10.6 内核程序主目录kernel 180
5.10.5 内核初始化程序目录init 180
5.11 内核系统与应用程序的关系 183
5.10.9 编译内核工具程序目录tools 183
5.10.7 内核库函数目录lib 183
5.10.8 内存管理程序目录mm 183
5.12.1 功能描述 184
5.12 linux/Makefile文件 184
5.12.2 代码注释 185
6.1 总体功能 190
第6章 引导启动程序 190
6.2.2 代码注释 192
6.2.1 功能描述 192
6.2 botsect.s程序 192
6.2.3 其他信息 200
6.3.1 功能描述 201
6.3 setup.s程序 201
6.3.2 代码注释 203
6.3.3 其他信息 210
6.4.1 功能描述 219
6.4 head.s程序 219
6.4.2 代码注释 221
6.4.3 其他信息 228
7.1.1 功能描述 232
7.1 main.c程序 232
第7章 初始化程序 232
7.1.2 代码注释 235
7.1.3 其他信息 242
7.2 环境初始化工作 244
8.1 总体功能 246
第8章 内核代码 246
8.1.1 中断处理程序 247
8.1.3 其他通用类程序 248
8.1.2 系统调用处理相关程序 248
8.2.2 文件注释 249
8.2.1 功能简介 249
8.2 Makefile文件 249
8.3.1 功能描述 251
8.3 asm.s程序 251
8.3.2 代码注释 252
8.3.3 Intel保留中断向量的定义 256
8.4 traps.c程序 257
8.4.1 功能描述 257
8.4.2 代码注释 257
8.5 system_call.s程序 262
8.5.1 功能描述 262
8.5.2 代码注释 264
8.5.3 其他信息 272
8.6 mktime.c程序 274
8.6.1 功能描述 274
8.6.2 代码注释 274
8.6.3 闰年的计算方法 276
8.7 sched.c程序 276
8.7.1 功能描述 276
8.7.2 代码注释 278
8.7.3 其他信息 290
8.8 signal.c程序 295
8.8.1 功能描述 295
8.8.2 代码注释 301
8.8.3 进程信号说明 305
8.9 exit.c程序 306
8.9.1 功能描述 306
8.9.2 代码注释 307
8.10 fork.c程序 312
8.10.1 功能描述 312
8.10.2 代码注释 314
8.10.3 任务状态段(TSS)信息 318
8.11 sys.c程序 320
8.11.1 功能描述 320
8.11.2 代码注释 321
8.12 vsprintf.c程序 326
8.12.1 功能描述 326
8.12.2 代码注释 327
8.12.3 vsprintf()的格式字符串 332
8.13 printk.c程序 334
8.13.1 功能描述 334
8.12.4 与当前版本的区别 334
8.13.2 代码注释 335
8.14.1 功能描述 336
8.14.2 代码注释 336
8.14 panic.c程序 336
第9章 块设备驱动程序 338
9.1 总体功能 339
9.1.1 块设备请求项和请求队列 339
9.1.2 块设备操作方式 341
9.2.1 功能描述 342
9.2.2 代码注释 342
9.2 Makefile文件 342
9.3 blk.h文件 344
9.3.1 功能描述 344
9.3.2 代码注释 345
9.4 hd.c程序 348
9.4.1 功能描述 348
9.4.2 代码注释 351
9.4.3 其他信息 362
9.5.1 功能描述 371
9.5.2 代码注释 371
9.5 ll_rw_blk.c程序 371
9.6 ramdisk.c程序 376
9.6.1 功能描述 376
9.6.2 代码注释 378
9.7.1 功能描述 382
9.7.2 代码注释 382
9.7 floppy.c程序 382
9.7.3 其他信息 396
10.1 总体功能 409
10.1.1 终端驱动程序基本原理 409
第10章 字符设备驱动程序 409
10.1.2 Linux支持的终端设备类型 410
10.1.3 终端基本数据结构 412
10.1.4 规范模式和非规范模式 415
10.1.5 控制台终端和串行终端设备 416
10.2.1 功能描述 419
10.2 Makefile文件 419
10.2.2 代码注释 419
10.1.6 终端驱动程序接口 419
10.3.1 功能描述 422
10.3.2 代码注释 422
10.3 keyboard.S程序 422
10.3.3 其他信息 436
10.4.1 功能描述 440
10.4.2 代码注释 440
10.4 console.c程序 440
10.4.3 其他信息 459
10.5.1 功能描述 466
10.5.2 代码注释 466
10.5 serial.c程序 466
10.5.3 异步串行通信控制器UART 468
10.6.1 功能描述 474
10.6.2 代码注释 474
10.6 rs_io.s程序 474
10.7 tty_io.c程序 478
10.7.1 功能描述 478
10.7.2 代码注释 479
10.8 tty_ioctl.c程序 489
10.8.1 功能描述 489
10.8.2 代码注释 490
10.8.3 波特率与波特率因子 495
11.1.1 功能描述 497
11.1 Makefile文件 497
11.1.2 代码注释 497
第11章 数学协处理器 497
11.2.1 功能描述 499
11.2.2 代码注释 499
11.2 math_emulate.c程序 499
第12章 文件系统 501
12.1 总体功能 502
12.1.1 MINIX文件系统 502
12.1.2 文件类型、属性和目录项 506
12.1.3 高速缓冲区 510
12.1.4 文体系统底层函数 511
12.1.5 文件中数据的访问操作 511
12.1.6 文件和目录管理系统调用 513
12.1.7 360 KB软盘中文件系统实例分析 513
12.2.2 代码注释 517
12.2.1 功能描述 517
12.2 Makefile文件 517
12.3 buffer.c程序 519
12.3.1 功能描述 520
12.3.2 代码注释 525
12.4.1 功能描述 536
12.4 bitmap.c程序 536
12.4.2 代码注释 537
12.5.1 功能描述 542
12.5 truncte.c程序 542
12.5.2 代码注释 543
12.6.1 功能描述 544
12.6 inode.c程序 544
12.6.2 代码注释 546
12.7.1 功能描述 556
12.7 super.c程序 556
12.7.2 代码注释 557
12.8.1 功能描述 565
12.8 namei.c程序 565
12.8.2 代码注释 566
12.9.2 代码注释 588
12.9.1 功能描述 588
12.9 file_table.c程序 588
12.10.1 功能描述 589
12.10 block_dev.c程序 589
12.10.2 代码注释 590
12.11.2 代码注释 592
12.11.1 功能描述 592
12.11 file_dev.c程序 592
12.12.1 功能描述 595
12.12 pipe.c程序 595
12.12.2 代码注释 596
12.13.2 代码注释 599
12.13.1 功能描述 599
12.13 char_dev.c程序 599
12.14.2 代码注释 602
12.14.1 功能描述 602
12.14 read_write.c程序 602
12.14.3 用户程序读写操作过程 605
12.15.2 代码注释 608
12.15.1 功能描述 608
12.15 open.c程序 608
12.16.1 功能描述 614
12.16 exec.c程序 614
12.16.2 代码注释 617
12.17.2 代码注释 629
12.17.1 功能描述 629
12.17 stat.c程序 629
12.18.1 功能描述 631
12.18 fcntl.c程序 631
12.18.2 代码注释 632
12.19.2 代码注释 634
12.19.1 功能描述 634
12.19 ioctl.c程序 634
13.1.1 内存分页管理机制 636
13.1 总体功能 636
第13章 内存管理 636
13.1.2 Linux中物理内存的管理和分配 639
13.1.5 写时复制(copy on write)机制 640
13.1.4 页面出错异常处理 640
13.1.3 Linux内核对线性地址空间的使用分配 640
13.1.6 需求加载(Load on demand)机制 641
13.2.2 代码注释 642
13.2.1 功能描述 642
13.2 Makefile文件 642
13.3.1 功能描述 643
13.3 memory.c程序 643
13.3.2 代码注释 645
13.4.1 功能描述 661
13.4 page.s程序 661
13.4.2 代码注释 662
13.4.3 页出错异常处理 663
14.1 include/目录下的文件 664
第14章 头文件 664
14.2.1 功能描述 666
14.2 a.out.h文件 666
14.2.2 代码注释 667
14.2.3 a.out执行文件格式 672
14.3.2 代码注释 676
14.3.1 功能描述 676
14.3 const.h文件 676
14.4.2 代码注释 677
14.4.1 功能描述 677
14.4 ctype.h文件 677
14.5.2 代码注释 678
14.5.1 功能描述 678
14.5 errno.h文件 678
14.6.2 代码注释 680
14.6.1 功能描述 680
14.6 fcntl.h文件 680
14.7.2 文件注释 682
14.7.1 功能描述 682
14.7 signal.h文件 682
14.8.2 代码注释 684
14.8.1 功能描述 684
14.8 stdarg.h文件 684
14.9.1 功能描述 685
14.9 stddef.h文件 685
14.9.2 代码注释 686
14.10.2 代码注释 687
14.10.1 功能描述 687
14.10 string.h文件 687
14.11.1 功能描述 696
14.11 termios.h文件 696
14.11.2 代码注释 697
14.11.3 控制字符TIME、MIN 702
14.12.1 功能描述 703
14.12 time.h文件 703
14.12.2 代码注释 704
14.13.2 代码注释 705
14.13.1 功能描述 705
14.13 unistd.h文件 705
14.16.1 功能描述 711
14.16 io.h文件 711
14.14 utime.h文件 711
14.14.1 功能描述 711
14.14.2 代码注释 711
14.15 include/asm/目录下的文件 711
14.17.1 功能描述 712
14.17 memory.h文件 712
14.16.2 代码注释 712
14.18.2 代码注释 713
14.18.1 功能描述 713
14.17.2 代码注释 713
14.18 segment.h文件 713
14.19.1 功能描述 715
14.19 system.h文件 715
14.19.2 代码注释 717
14.20 include/linux/目录下的文件 719
14.21.2 代码注释 720
14.21.1 功能描述 720
14.21 config.h文件 720
14.22.1 功能描述 722
14.22 fdreg.h头文件 722
14.22.2 文件注释 723
14.23.2 代码注释 725
14.23.1 功能描述 725
14.23 fs.h文件 725
14.24.2 代码注释 730
14.24.1 功能描述 730
14.24 hdreg.h文件 730
14.24.3 硬盘分区表 732
14.26.2 代码注释 733
14.26.1 功能描述 733
14.25 head.h文件 733
14.25.1 功能描述 733
14.25.2 代码注释 733
14.26 kernel.h文件 733
14.27.2 代码注释 734
14.27.1 功能描述 734
14.27 mm.h文件 734
14.28.1 功能描述 735
14.28 sched.h文件 735
14.28.2 代码注释 736
14.29.2 代码注释 742
14.29.1 功能描述 742
14.29 sys.h文件 742
14.30.2 代码注释 744
14.30.1 功能描述 744
14.30 tty.h文件 744
14.31 include/sys/目录中的文件 746
14.32.2 代码注释 747
14.32.1 功能描述 747
14.32 stat.h文件 747
14.33.1 功能描述 748
14.33 times.h文件 748
14.34.2 代码注释 749
14.34.1 功能描述 749
14.33.2 代码注释 749
14.34 types.h文件 749
14.35.2 代码注释 750
14.35.1 功能描述 750
14.35 utsname.h文件 750
14.36.2 代码注释 751
14.36.1 功能描述 751
14.36 wait.h文件 751
第15章 库文件 753
15.1.2 代码注释 754
15.1.1 功能描述 754
15.1 Makefile文件 754
15.2.3 相关信息 756
15.2.2 代码注释 756
15.2 _exit.c程序 756
15.2.1 功能描述 756
15.4.2 代码注释 757
15.4.1 功能描述 757
15.3 close.c程序 757
15.3.1 功能描述 757
15.3.2 代码注释 757
15.4 ctype.c程序 757
15.5.2 代码注释 758
15.5.1 功能描述 758
15.5 dup.c程序 758
15.7.2 代码注释 759
15.7.1 功能描述 759
15.6 errno.c程序 759
15.6.1 功能描述 759
15.6.2 代码注释 759
15.7 execve.c程序 759
15.8.1 功能描述 760
15.8 malloc.c程序 760
15.8.2 代码注释 762
15.9 open.c程序 768
15.9.1 功能描述 768
15.9.2 代码注释 769
15.10 setsid.c程序 769
15.10.1 功能描述 769
15.10.2 代码注释 770
15.11 string.c程序 770
15.11.1 功能描述 770
15.11.2 代码注释 770
15.12 wait.c程序 771
15.12.1 功能描述 771
15.12.2 代码注释 771
15.13 write.c程序 772
15.13.1 功能描述 772
15.13.2 代码注释 772
16.1 build.c程序 773
16.1.1 功能概述 773
第16章 建造工具 773
16.1.2 代码注释 774
16.2 MINIX可执行文件头部数据结构 778
第17章 实验环境设置与使用方法 780
17.1 Bochs仿真软件系统 781
17.1.1 设置Bochs系统 781
17.1.2 配置文件*.bxrc 782
17.2 在Bochs中运行Linux 0.1x系统 785
17.2.1 软件包中文件说明 785
17.2.2 运行Linux 0.1x系统 787
17.3 访问磁盘映像文件中的信息 791
17.3.1 使用WinImage工具软件 791
17.3.2 利用现有Linux系统 792
17.4 编译运行简单内核示例程序 793
17.5 利用Bochs调试内核 795
17.5.1 运行Bochs调试程序 796
17.5.2 定位内核中的变量或数据结构 801
17.6 创建磁盘映像文件 802
17.6.1 利用Bochs软件自带的Image生成工具 803
17.6.2 在Linux系统下使用dd命令创建Image文件 804
17.6.3 利用WinImage创建DOS格式的软盘Image文件 804
17.7 制作根文件系统 805
17.7.1 根文件系统和根文件设备 805
17.7.2 创建文件系统 806
17.7.3 Linux-0.11的Bochs配置文件 808
17.7.4 在hdc.img上建立根文件系统 810
17.7.5 使用硬盘Image上的根文件系统 811
17.8 在Linux 0.11系统中编译0.11内核 812
17.9 在Redhat Linux 9系统中编译Linux 0.11内核 813
17.9.1 修改makefile文件 814
17.9.2 修改汇编程序中的注释 814
17.9.5 C程序变量在汇编语句中的引用表示 815
17.9.4 修改嵌入宏汇编程序 815
17.9.6 保护模式下调试显示函数 815
17.9.3 内存位置对齐语句align值的修改 815
17.10 内核引导启动+根文件系统组成的集成盘 816
17.10.1 集成盘制作原理 817
17.10.2 集成盘的制作过程 818
17.10.3 运行集成盘系统 821
17.11 从硬盘启动:利用shoelace引导软件 821
17.11.2 设置过程 822
17.11.3 问题和解决方法 822
17.11.1 shoelace程序设置路径 822
17.12 利用GDB和Bochs调试内核源代码 824
17.12.1 编译带gdbstub的Bochs系统 824
17.12.2 编译带调试信息的Linux 0.11内核 825
17.12.3 调试方法和步骤 826
附录 830
附录A 内核数据结构 830
附录B ASCII码表 838
附录C 常用C0、C1控制字符表 840
附录D 常用转义序列和控制序列 841
附录E 第1套键盘扫描码集 843
索引 845
参考文献 881