目录
第 1 章 计算机的组成 1
1.1 一颗计算机种子 1
1.2 百花齐放 2
1.2.1 冯·诺依曼架构 3
1.2.2 哈佛架构 4
1.3 e 进制 5
1.3.1 进制 5
1.3.2 二进制 6
1.3.3 三进制 6
1.3.4 e 进制 7
1.3.5 其他进制 8
1.4 逻辑门与运算单元 10
1.4.1 NMOS 与 PMOS 10
1.4.2 非门(NOT) 10
1.4.3 与门(AND) 11
1.4.4 与非门(NAND) 11
1.4.5 或门(OR) 11
1.4.6 解复用器(de-multiplexer,DEMUX) 12
1.4.7 复用器(multiplexer,MUX) 13
1.4.8 异或门(XOR) 14
1.4.9 多位组合电路 15
1.4.10 半加器(Half Adder) 17
1.4.11 全加器(Full Adder) 18
1.4.12 十六位负数判断(IsNeg) 18
1.4.13 十六位加法器(Adder16) 18
1.4.14 算术逻辑单元(ALU) 19
1.5 D 触发器与存储单元 20
1.5.1 RS 触发器 20
1.5.2 D 触发器 21
1.5.3 bit——一位存储器 22
1.5.4 十六位寄存器 22
1.5.5 高位寄存器内存组合 23
1.5.6 小结 24
1.6 振荡器与计时器 25
1.7 CPU 的组成 26
1.7.1 PC 计数器 26
1.7.2 寄存器 27
1.7.3 功能定义 27
1.7.4 CPU 实现 30
1.8 计算机的组成 32
1.8.1 内存 32
1.8.2 其他设备 33
1.8.3 计算机实现 34
1.9 网络服务的组成 35
1.9.1 单体网络服务 35
1.9.2 分布式服务 36
1.10 小结 37
第 2 章 汇编语言 39
2.1 指令集体系结构(ISA) 39
2.2 CISC 40
2.3 RISC 40
2.4 Intel 指令集 41
2.4.1 指令前缀 42
2.4.2 操作码 43
2.4.3 ModR/M与SIB 44
2.4.4 位移与立即数 45
2.5 通用汇编指令 45
2.5.1 MOV、ADD、SUB 45
2.5.2 MLU、DIV、SHL、SHR 45
2.5.3 PUSH、POP 46
2.5.4 JMP、JXX 47
2.6 汇编的内存结构 47
2.6.1 位宽 47
2.6.2 步长 47
2.7 汇编 器 48
2.7.1 简单汇编 48
2.7.2 汇编器 49
2.8 小结 54
第 3 章 如何设计一门语言 55
3.1 语言的目标 55
3.2 类型系统 55
3.3 抽象操作 56
3.3.1 汇编拓展 56
3.3.2 寄存器拓展 57
3.4 内存抽象 57
3.4.1 数组 58
3.4.2 结构体 58
3.5 进程内存结构 58
3.5.1 堆 59
3.5.2 栈 59
3.5.3 数据段 60
3.5.4 代码段 60
3.5.5 应用程序二进制接口 61
3.6 小结 61
第 4 章 编译器 63
4.1 编译原理 63
4.1.1 词法分析 64
4.1.2 语法分析 76
4.1.3 语义分析 115
4.2 GCC 编译器源码 131
4.3 其他编译器 152
4.4 小结 152
第 5 章 Intel 与汇编 154
5.1 Intel 历史 154
5.2 Intel 编码语法 156
5.3 基础寄存器 157
5.3.1 通用寄存器 157
5.3.2 段寄存器 159
5.3.3 状态寄存器 161
5.3.4 指令指针寄存器 161
5.4 Intel 内存分段 163
5.5 Intel 内存分页 168
5.6 保护模式 170
5.6.1 数据段的访问与检查 172
5.6.2 代码段的访问与检查 173
5.6.3 调用门 176
5.6.4 中断与异常 179
5.6.5 任务管理 187
5.7 其他 190
5.7.1 多核处理器 190
5.7.2 APIC 192
5.8 Intel 指令原理 193
5.8.1 PUSH 指令 193
5.8.2 MOV 指令 194
5.8.3 ADD、MUL、DIV、SUB 指令 195
5.8.4 LIDT/LGDT 196
5.9 小结 197
第 6 章 C 语言 198
6.1 C 标准历史(维基百科) 198
6.1.1 基于 B 语言的第一个 C 版本 199
6.1.2 结构体和 UNIX 内核重写 199
6.1.3 K&R C 199
6.1.4 ANSI C 和 ISO C 200
6.1.5 C99 201
6.1.6 C11 202
6.1.7 小结 202
6.2 宏定义 202
6.3 变量与常量 203
6.4 函数 206
6.5 数组与指针 209
6.6 结构体 214
6.6.1 位操作 216
6.6.2 其他 218
6.6.3 返回值 219
6.7 可变数组 222
6.8 其他特性 224
6.8.1 浮点型运算 224
6.8.2 联合体和枚举 225
6.8.3 标准库 227
6.8.4 extern/volatile 227
6.8.5 内联汇编 228
6.9 C 语言的编译 230
6.10 GAS 232
6.11 小结 234
第 7 章 ELF 与链接器 236
7.1 ELF 236
7.1.1 ELF 头结构 238
7.1.2 节的结构 239
7.1.3 字符串表 240
7.1.4 符号表 241
7.1.5 重定位表 242
7.1.6 程序加载 245
7.1.7 程序头结构 246
7.1.8 程序解释器 248
7.1.9 小结 257
7.2 动态链接器 257
7.2.1 Bash 执行流程 258
7.2.2 fork()原理 260
7.2.3 execve()原理 265
7.2.4 glibc 动态链接原理 281
7.3 库打桩 318
7.4 内存分配 319
7.4.1 glibc 320
7.4.2 内核 338
7.4.3 内核信号机制 360
7.5 小结 368
