计算机体系结构精髓(原书第2版)
-
作 者:
[美]道格拉斯·科莫(Douglas Comer)著
- 译 者: 黄智濒 戴志涛 译
- 出版日期: 2019-05-22
- I S B N: 978-7-111-62658-9
- 定 价: ¥99.00元
内容简介
本书是计算机体系结构的入门教材,从程序员的视角展开讨论,重点介绍基础知识和概念,不深入底层技术的细节。这种视角旨在帮助程序员新手和计算机专业新生理解体系结构对编程的影响,书中浓缩的核心知识点涵盖了程序员需要掌握的所有硬件层面,从而有利于其更好地进行软件的设计、实现和运维。本书分为五个部分,包括数字逻辑、门和数据通路的基础知识,以及体系结构的三个主要方面——处理器、内存和I/O系统。此外,书中还涉及并行、流水线、能源和性能等高级主题,以及一个动手操作的实验。第2版共包含了三个全新的章节,并在整体上进行了与时俱进的修订。
作译者简介
-作者简介-
道格拉斯·科莫(Douglas Comer) 世界知名的计算机网络和TCP/IP专家,普渡大学计算机科学杰出教授,ACM会士,获得了包括USENIX终身成就奖在内的众多奖项。曾担任思科公司首席研究副总裁,CSNET技术委员会主席,DARPA分布式系统架构委员会主席,以及《Software—Practice And Experience》期刊主编。他撰写了一系列突破性的教科书,这些书被翻译成16种语言,在工业界和学术界影响甚广。
-译者简介-
黄智濒 北京邮电大学计算机学院讲师,计算机体系结构博士,主讲数字逻辑和计算机体系结构课程。主要研究方向包括GPU加速及大规模并行计算等。
戴志涛 北京邮电大学计算机学院教授,主讲计算机组成原理和嵌入式系统课程。主要研究方向包括嵌入式片上系统架构等。
图书目录
出版者的话
译者序
前言
关于作者
第1章 简介及概览 1
1.1 体系结构的重要性 1
1.2 学习基础知识 1
1.3 本书结构 1
1.4 一笔带过的内容 2
1.5 术语:体系结构和设计 2
1.6 小结 2
第一部分 基础知识
第2章 数字逻辑基础 4
2.1 引言 4
2.2 数字计算装置 4
2.3 电气术语:电压和电流 4
2.4 晶体管 5
2.5 逻辑门 5
2.6 使用晶体管实现的“与非”逻辑门电路 7
2.7 表示逻辑门的符号 8
2.8 逻辑门互连的例子 8
2.9 实现二进制加法的数字电路 10
2.10 多逻辑门的集成电路 10
2.11 不只需要组合逻辑电路 11
2.12 维持状态的电路 11
2.13 传播延迟 12
2.14 使用锁存器构建存储器 12
2.15 触发器和波形图 13
2.16 二进制计数器 14
2.17 时钟和时序 15
2.18 反馈的重要概念 17
2.19 启动序列 18
2.20 软件迭代与硬件复制 18
2.21 门和芯片的最简化 19
2.22 使用闲置门 19
2.23 配电和散热 20
2.24 时序和时钟域 20
2.25 无时钟逻辑 21
2.26 电路规模和摩尔定律 21
2.27 电路板和层 22
2.28 抽象层次 23
2.29 小结 23
习题 23
第3章 数据和程序的表示 25
3.1 引言 25
3.2 数字逻辑与抽象的重要性 25
3.3 位和字节的定义 25
3.4 字节大小和可能的值 25
3.5 二进制位权表示法 26
3.6 位序 27
3.7 十六进制记法 28
3.8 十六进制和二进制常数记法 29
3.9 字符集 29
3.10 Unicode 30
3.11 无符号整数、溢出和下溢 30
3.12 给位和字节编号 31
3.13 有符号二进制整数 31
3.14 一个补码数字的例子 32
3.15 符号扩展 33
3.16 浮点数 33
3.17 IEEE浮点值的范围 34
3.18 特殊值 35
3.19 二进制编码的十进制表示 35
3.20 有符号数、分数和压缩BCD表示法 36
3.21 数据聚合 36
3.22 程序的表示 37
3.23 小结 37
习题 37
第二部分 处理器
第4章 处理器和计算引擎的多样性 40
4.1 引言 40
4.2 两种基本的体系结构 40
4.3 哈佛与冯·诺依曼体系结构 40
4.4 处理器的定义 41
4.5 处理器的范围 41
4.6 分层结构和计算引擎 42
4.7 传统处理器的结构 43
4.8 处理器的分类和角色 44
4.9 处理器技术 44
4.10 存储程序 45
4.11 取指–执行周期 45
4.12 程序转换 46
4.13 时钟速率和指令速率 46
4.14 控制:启动和停止 47
4.15 启动取指–执行周期 47
4.16 小结 48
习题 48
第5章 处理器类型和指令集 49
5.1 引言 49
5.2 数学能力、便利性和成本 49
5.3 指令集架构 49
5.4 操作码、操作数和结果 50
5.5 典型的指令格式 50
5.6 可变长度指令与固定长度指令 50
5.7 通用寄存器 51
5.8 浮点寄存器和寄存器标识 51
5.9 使用寄存器编程 51
5.10 寄存器存储体 52
5.11 复杂指令集和精简指令集 53
5.12 RISC设计和执行流水线 53
5.13 流水线和指令延迟 54
5.14 引起流水线停顿的其他原因 55
5.15 对程序员的影响 56
5.16 编程、停顿和无操作指令 56
5.17 转发 56
5.18 操作类型 57
5.19 程序计数器、取指–执行以及分支 57
5.20 子程序调用、参数以及寄存器窗口 58
5.21 一个示例指令集 59
5.22 极简化的指令集 61
5.23 正交性原则 61
5.24 条件码和条件分支 62
5.25 小结 62
习题 62
第6章 数据通路和指令执行 64
6.1 引言 64
6.2 数据通路 64
6.3 示例指令集 64
6.4 内存中的指令 66
6.5 移到下一条指令 67
6.6 取指令 68
6.7 解码指令 69
6.8 连接到寄存器单元 69
6.9 控制和协调 70
6.10 算术运算和复用 70
6.11 涉及存储器中数据的操作 71
6.12 执行过程的示例 72
6.13 小结 73
习题 73
第7章 操作数寻址和指令表示 75
7.1 引言 75
7.2 零、一、二或三地址设计 75
7.3 每指令零操作数 75
7.4 每指令单操作数 76
7.5 每指令两操作数 76
7.6 每指令三操作数 77
7.7 操作数来源和立即数 77
7.8 冯·诺依曼体系结构的瓶颈 77
7.9 显式和隐式操作数编码 78
7.10 组合多个值的操作数 79
7.11 权衡操作数的选择 79
7.12 内存中的值和间接引用 80
7.13 操作数寻址模式的示例 80
7.14 小结 81
习题 81
第8章 CPU:微码、保护和处理器模式 83
8.1 引言 83
8.2 中央处理器 83
8.3 CPU的复杂性 83
8.4 执行模式 84
8.5 向后兼容性 84
8.6 改变模式 84
8.7 特权和保护 85
8.8 多级保护 85
8.9 微码指令 86
8.10 微码变体 87
8.11 微码的优势 87
8.12 FPGA和指令集的改变 88
8.13 垂直微码 88
8.14 水平微码 88
8.15 水平微码的例子 89
8.16 水平微码程序示例 91
8.17 需要多个周期的操作 91
8.18 水平微码和并行执行 92
8.19 前瞻性和高性能执行 92
8.20 并行和执行顺序 93
8.21 乱序指令执行 93
8.22 条件分支和分支预测 94
8.23 对程序员的影响 94
8.24 小结 94
习题 95
第9章 汇编语言和编程范式 96
9.1 引言 96
9.2 高级程序设计语言的特征 96
9.3 低级程序设计语言的特征 97
9.4 汇编语言 97
9.5 汇编语言的语法和操作码 98
9.6 操作数顺序 99
9.7 寄存器名称 100
9.8 操作数类型 100
9.9 汇编语言的编程范式和语言风格 101
9.10 用汇编语言实现if语句 101
9.11 用汇编语言实现if-then-else语句 102
9.12 用汇编语言实现for循环语句 102
9.13 用汇编语言实现while循环语句 103
9.14 用汇编语言实现子程序调用 103
9.15 用汇编语言实现带参数的子程序调用 103
9.16 对程序员的影响 104
9.17 函数调用的汇编语言实现代码 104
9.18 汇编语言与高级语言间的交互 105
9.19 变量和存储的汇编代码 105
9.20 汇编语言代码样例 106
9.21 两次扫描的汇编器 110
9.22 汇编语言的宏 111
9.23 小结 113
习题 113
第三部分 存储器
第10章 内存与存储器 116
10.1 引言 116
10.2 定义 116
10.3 内存的关键方面 116
10.4 内存技术的特点 116
10.5 内存层级的重要概念 117
10.6 指令和数据存储 118
10.7 提取–保存范式 118
10.8 小结 119
习题 119
第11章 物理内存和物理寻址 120
11.1 引言 120
11.2 计算机内存的特点 120
11.3 静态和动态RAM技术 120
11.4 内存技术的两个主要度量 121
11.5 密度 121
11.6 读写性能的分离 121
11.7 延迟和内存控制器 122
11.8 同步和多数据速率技术 122
11.9 内存组织 123
11.10 内存访问和内存总线 123
11.11 字、物理地址和内存传输 124
11.12 物理内存操作 124
11.13 内存字大小和数据类型 125
11.14 字节寻址和将字节映射到字 125
11.15 使用2的幂 126
11.16 字节对齐和编程 126
11.17 内存大小和地址空间 127
11.18 使用字寻址的编程 127
11.19 内存大小和2的幂 128
11.20 指针和数据结构 128
11.21 内存转储 129
11.22 间接寻址和间接操作数 129
11.23 带有独立控制器的多个内存 130
11.24 内存的存储体 130
11.25 交叉存取 131
11.26 内容可寻址存储器 132
11.27 三态内容可寻址存储器 133
11.28 小结 133
习题 133
第12章 缓存器和缓存 135
12.1 引言 135
12.2 在存储层级上的信息传播 135
12.3 缓存的定义 135
12.4 缓存器的特征 135
12.5 缓存术语 136
12.6 最好和最坏情况下的缓存性能 136
12.7 一个典型请求序列的缓存性能 137
12.8 缓存替换策略 138
12.9 最近最少使用替换策略 138
12.10 多级缓存层级结构 138
12.11 预加载缓存 139
12.12 和内存一块使用的缓存 139
12.13 物理内存缓存 140
12.14 写直通策略和写回策略 140
12.15 缓存一致性 141
12.16 L1、L2和L3缓存 141
12.17 L1、L2和L3缓存的大小 142
12.18 指令和数据缓存 142
12.19 改良的哈佛体系结构 143
12.20 内存缓存的实现 143
12.21 直接映射的内存缓存 144
12.22 使用2的幂提高效率 145
12.23 直接映射缓存的硬件实现 146
12.24 组相联的内存缓存 147
12.25 对程序员的影响 148
12.26 小结 148
习题 148
第13章 虚拟内存技术与虚拟寻址 150
13.1 引言 150
13.2 虚拟内存的定义 150
13.3 内存的管理单元和地址空间 150
13.4 多个物理内存系统的接口 150
13.5 地址转换或者地址映射 151
13.6 避免算术计算 152
13.7 不连续的地址空间 152
13.8 虚拟内存的动机 153
13.9 多虚拟地址空间和多道程序 154
13.10 动态地创建虚拟地址空间 155
13.11 基址–界限寄存器 155
13.12 改变虚拟地址空间 155
13.13 虚拟内存和保护 156
13.14 分段 156
13.15 请求分页 157
13.16 请求分页的硬件和软件 157
13.17 页替换 157
13.18 分页术语和数据结构 158
13.19 分页系统中的地址转换 158
13.20 使用2的幂 159
13.21 存在位、使用位和修改位 159
13.22 页表的存储 160
13.23 分页效率和转换后备缓冲区 160
13.24 对程序员的影响 161
13.25 虚拟内存和缓存间的关系 162
13.26 虚拟内存缓存和缓存刷新 162
13.27 小结 163
习题 164
第四部分 输入和输出
第14章 输入/输出的概念和术语 166
14.1 引言 166
14.2 输入和输出设备 166
14.3 外部设备的控制 166
14.4 数据传输 167
14.5 串行与并行数据传输 167
14.6 自同步数据 168
14.7 全双工和半双工交互 168
14.8 接口的吞吐率和延迟 168
14.9 多路复用的基本思想 169
14.10 每个接口支持多个设备 169
14.11 从处理器角度看I/O 170
14.12 小结 170
习题 170
第15章 总线及总线架构 171
15.1 引言 171
15.2 总线的定义 171
15.3 处理器、I/O设备以及总线 171
15.4 物理连接 172
15.5 总线接口 173
15.6 控制、地址和数据线 173
15.7 提取–保存范式 174
15.8 提取–保存和总线宽度 174
15.9 多路复用 175
15.10 总线的宽度和数据项的大小 176
15.11 总线地址空间 176
15.12 潜在错误 177
15.13 地址的配置和插槽 177
15.14 多总线的问题 178
15.15 对设备使用提取–保存 178
15.16 接口的操作 179
15.17 不对称赋值和总线错误 179
15.18 统一内存和设备寻址 180
15.19 总线地址空间中的“洞” 180
15.20 地址映射 180
15.21 总线的程序接口 181
15.22 总线之间的桥 182
15.23 主总线和辅助总线 182
15.24 对程序员的影响 183
15.25 总线的替代者——交换结构 183
15.26 小结 184
习题 185
第16章 可编程的I/O和中断驱动的I/O 186
16.1 引言 186
16.2 I/O范式 186
16.3 可编程的I/O 186
16.4 同步 186
16.5 轮询 187
16.6 轮询的代码 187
16.7 控制和状态寄存器 189
16.8 使用结构来定义CSR 190
16.9 处理器的使用和轮询 190
16.10 中断驱动的I/O 191
16.11 中断机制和取指–执行 191
16.12 处理中断 192
16.13 中断向量 192
16.14 中断初始化和禁用中断 193
16.15 中断一个中断处理程序 193
16.16 中断的配置 194
16.17 动态的总线连接和可插拔设备 194
16.18 中断、性能和智能设备 195
16.19 直接内存访问 195
16.20 用缓冲链扩展DMA 196
16.21 分散读操作和聚集写操作 196
16.22 操作链 197
16.23 小结 197
习题 198
第17章 程序员视角的设备、输入/输出和缓冲 199
17.1 引言 199
17.2 设备驱动程序的定义 199
17.3 设备的独立、封装和隐藏 199
17.4 设备驱动程序的概念 200
17.5 两类设备 200
17.6 设备驱动程序的示例流程 201
17.7 输出操作队列 202
17.8 强制设备发出中断 202
17.9 输入操作队列 203
17.10 异步设备驱动程序和互斥 203
17.11 从应用程序看I/O 204
17.12 库/操作系统二元论 205
17.13 操作系统支持的I/O操作 205
17.14 I/O操作的成本 205
17.15 减少系统调用的开销 206
17.16 缓冲的关键概念 206
17.17 缓冲输出的实现 207
17.18 清空缓冲区 208
17.19 缓冲输入 208
17.20 缓冲的效率 209
17.21 与缓存的关系 209
17.22 一个例子:C语言的标准I/O库 209
17.23 小结 209
习题 210
第五部分 高级主题
第18章 并行 212
18.1 引言 212
18.2 并行性和流水线架构 212
18.3 并行的特征 212
18.4 微观与宏观 212
18.5 微观并行的例子 213
18.6 宏观并行的例子 213
18.7 对称与非对称 214
18.8 细粒度并行与粗粒度并行 214
18.9 显式并行与隐式并行 214
18.10 并行体系结构的类型(弗林分类法) 214
18.11 单指令流单数据流 215
18.12 单指令流多数据流 215
18.13 多指令流多数据流 216
18.14 通信、协同和竞争 218
18.15 多处理器的性能 218
18.16 对程序员的影响 220
18.17 冗余并行体系结构 221
18.18 分布式集群计算机 222
18.19 现代超级计算机 222
18.20 小结 223
习题 223
第19章 数据流水线 225
19.1 引言 225
19.2 流水线的概念 225
19.3 软件流水线 226
19.4 软件流水线的性能和开销 227
19.5 硬件流水线 227
19.6 硬件流水线如何提升性能 228
19.7 何时使用流水线 229
19.8 处理过程的概念划分 230
19.9 流水线架构 231
19.10 流水线的建立、延迟以及排空时间 231
19.11 超流水线架构的定义 231
19.12 小结 232
习题 232
第20章 功率与能耗 233
20.1 引言 233
20.2 功率的定义 233
20.3 能耗的定义 233
20.4 数字电路的功耗 234
20.5 CMOS数字电路的切换功耗 234
20.6 冷却、功耗密度和功率墙 235
20.7 能耗使用 236
20.8 功率管理 236
20.9 能耗使用的软件控制 238
20.10 选择何时睡眠和何时唤醒 239
20.11 睡眠模式和网络设备 240
20.12 小结 240
习题 241
第21章 评估性能 242
21.1 引言 242
21.2 测量计算能力和性能 242
21.3 计算能力的测量 242
21.4 应用相关的指令数 243
21.5 指令混合 244
21.6 标准化测试程序 244
21.7 I/O和内存瓶颈 245
21.8 硬件与软件的权衡 245
21.9 选择拟优化的部件——阿姆达尔定律 246
21.10 阿姆达尔定律和并行系统 246
21.11 小结 246
习题 247
第22章 体系结构的例子和层次 248
22.1 引言 248
22.2 体系结构的层次 248
22.3 系统级架构——个人电子计算机 248
22.4 总线互连和桥接 249
22.5 控制器芯片和物理架构 249
22.6 虚拟总线 250
22.7 连接速率 251
22.8 桥接功能和虚拟总线 252
22.9 板级架构 252
22.10 芯片级架构 253
22.11 片上功能单元的结构 254
22.12 小结 254
习题 255
第23章 硬件模块化 256
23.1 引言 256
23.2 模块化的动机 256
23.3 软件模块化 256
23.4 子程序的参数化调用 257
23.5 硬件扩展和并行 257
23.6 基本块复制 257
23.7 示例设计(重启器) 257
23.8 重启器的高层次设计 258
23.9 适应各种尺寸的构建块 258
23.10 并行互连 258
23.11 互连的例子 259
23.12 模块选择 259
23.13 小结 260
习题 260
附录A 用于计算机体系结构课程的实验练习 261
附录B 布尔代数化简法则 272
附录C x86汇编语言快速入门 273
附录D ARM寄存器定义和调用序列 286
译者序
前言
关于作者
第1章 简介及概览 1
1.1 体系结构的重要性 1
1.2 学习基础知识 1
1.3 本书结构 1
1.4 一笔带过的内容 2
1.5 术语:体系结构和设计 2
1.6 小结 2
第一部分 基础知识
第2章 数字逻辑基础 4
2.1 引言 4
2.2 数字计算装置 4
2.3 电气术语:电压和电流 4
2.4 晶体管 5
2.5 逻辑门 5
2.6 使用晶体管实现的“与非”逻辑门电路 7
2.7 表示逻辑门的符号 8
2.8 逻辑门互连的例子 8
2.9 实现二进制加法的数字电路 10
2.10 多逻辑门的集成电路 10
2.11 不只需要组合逻辑电路 11
2.12 维持状态的电路 11
2.13 传播延迟 12
2.14 使用锁存器构建存储器 12
2.15 触发器和波形图 13
2.16 二进制计数器 14
2.17 时钟和时序 15
2.18 反馈的重要概念 17
2.19 启动序列 18
2.20 软件迭代与硬件复制 18
2.21 门和芯片的最简化 19
2.22 使用闲置门 19
2.23 配电和散热 20
2.24 时序和时钟域 20
2.25 无时钟逻辑 21
2.26 电路规模和摩尔定律 21
2.27 电路板和层 22
2.28 抽象层次 23
2.29 小结 23
习题 23
第3章 数据和程序的表示 25
3.1 引言 25
3.2 数字逻辑与抽象的重要性 25
3.3 位和字节的定义 25
3.4 字节大小和可能的值 25
3.5 二进制位权表示法 26
3.6 位序 27
3.7 十六进制记法 28
3.8 十六进制和二进制常数记法 29
3.9 字符集 29
3.10 Unicode 30
3.11 无符号整数、溢出和下溢 30
3.12 给位和字节编号 31
3.13 有符号二进制整数 31
3.14 一个补码数字的例子 32
3.15 符号扩展 33
3.16 浮点数 33
3.17 IEEE浮点值的范围 34
3.18 特殊值 35
3.19 二进制编码的十进制表示 35
3.20 有符号数、分数和压缩BCD表示法 36
3.21 数据聚合 36
3.22 程序的表示 37
3.23 小结 37
习题 37
第二部分 处理器
第4章 处理器和计算引擎的多样性 40
4.1 引言 40
4.2 两种基本的体系结构 40
4.3 哈佛与冯·诺依曼体系结构 40
4.4 处理器的定义 41
4.5 处理器的范围 41
4.6 分层结构和计算引擎 42
4.7 传统处理器的结构 43
4.8 处理器的分类和角色 44
4.9 处理器技术 44
4.10 存储程序 45
4.11 取指–执行周期 45
4.12 程序转换 46
4.13 时钟速率和指令速率 46
4.14 控制:启动和停止 47
4.15 启动取指–执行周期 47
4.16 小结 48
习题 48
第5章 处理器类型和指令集 49
5.1 引言 49
5.2 数学能力、便利性和成本 49
5.3 指令集架构 49
5.4 操作码、操作数和结果 50
5.5 典型的指令格式 50
5.6 可变长度指令与固定长度指令 50
5.7 通用寄存器 51
5.8 浮点寄存器和寄存器标识 51
5.9 使用寄存器编程 51
5.10 寄存器存储体 52
5.11 复杂指令集和精简指令集 53
5.12 RISC设计和执行流水线 53
5.13 流水线和指令延迟 54
5.14 引起流水线停顿的其他原因 55
5.15 对程序员的影响 56
5.16 编程、停顿和无操作指令 56
5.17 转发 56
5.18 操作类型 57
5.19 程序计数器、取指–执行以及分支 57
5.20 子程序调用、参数以及寄存器窗口 58
5.21 一个示例指令集 59
5.22 极简化的指令集 61
5.23 正交性原则 61
5.24 条件码和条件分支 62
5.25 小结 62
习题 62
第6章 数据通路和指令执行 64
6.1 引言 64
6.2 数据通路 64
6.3 示例指令集 64
6.4 内存中的指令 66
6.5 移到下一条指令 67
6.6 取指令 68
6.7 解码指令 69
6.8 连接到寄存器单元 69
6.9 控制和协调 70
6.10 算术运算和复用 70
6.11 涉及存储器中数据的操作 71
6.12 执行过程的示例 72
6.13 小结 73
习题 73
第7章 操作数寻址和指令表示 75
7.1 引言 75
7.2 零、一、二或三地址设计 75
7.3 每指令零操作数 75
7.4 每指令单操作数 76
7.5 每指令两操作数 76
7.6 每指令三操作数 77
7.7 操作数来源和立即数 77
7.8 冯·诺依曼体系结构的瓶颈 77
7.9 显式和隐式操作数编码 78
7.10 组合多个值的操作数 79
7.11 权衡操作数的选择 79
7.12 内存中的值和间接引用 80
7.13 操作数寻址模式的示例 80
7.14 小结 81
习题 81
第8章 CPU:微码、保护和处理器模式 83
8.1 引言 83
8.2 中央处理器 83
8.3 CPU的复杂性 83
8.4 执行模式 84
8.5 向后兼容性 84
8.6 改变模式 84
8.7 特权和保护 85
8.8 多级保护 85
8.9 微码指令 86
8.10 微码变体 87
8.11 微码的优势 87
8.12 FPGA和指令集的改变 88
8.13 垂直微码 88
8.14 水平微码 88
8.15 水平微码的例子 89
8.16 水平微码程序示例 91
8.17 需要多个周期的操作 91
8.18 水平微码和并行执行 92
8.19 前瞻性和高性能执行 92
8.20 并行和执行顺序 93
8.21 乱序指令执行 93
8.22 条件分支和分支预测 94
8.23 对程序员的影响 94
8.24 小结 94
习题 95
第9章 汇编语言和编程范式 96
9.1 引言 96
9.2 高级程序设计语言的特征 96
9.3 低级程序设计语言的特征 97
9.4 汇编语言 97
9.5 汇编语言的语法和操作码 98
9.6 操作数顺序 99
9.7 寄存器名称 100
9.8 操作数类型 100
9.9 汇编语言的编程范式和语言风格 101
9.10 用汇编语言实现if语句 101
9.11 用汇编语言实现if-then-else语句 102
9.12 用汇编语言实现for循环语句 102
9.13 用汇编语言实现while循环语句 103
9.14 用汇编语言实现子程序调用 103
9.15 用汇编语言实现带参数的子程序调用 103
9.16 对程序员的影响 104
9.17 函数调用的汇编语言实现代码 104
9.18 汇编语言与高级语言间的交互 105
9.19 变量和存储的汇编代码 105
9.20 汇编语言代码样例 106
9.21 两次扫描的汇编器 110
9.22 汇编语言的宏 111
9.23 小结 113
习题 113
第三部分 存储器
第10章 内存与存储器 116
10.1 引言 116
10.2 定义 116
10.3 内存的关键方面 116
10.4 内存技术的特点 116
10.5 内存层级的重要概念 117
10.6 指令和数据存储 118
10.7 提取–保存范式 118
10.8 小结 119
习题 119
第11章 物理内存和物理寻址 120
11.1 引言 120
11.2 计算机内存的特点 120
11.3 静态和动态RAM技术 120
11.4 内存技术的两个主要度量 121
11.5 密度 121
11.6 读写性能的分离 121
11.7 延迟和内存控制器 122
11.8 同步和多数据速率技术 122
11.9 内存组织 123
11.10 内存访问和内存总线 123
11.11 字、物理地址和内存传输 124
11.12 物理内存操作 124
11.13 内存字大小和数据类型 125
11.14 字节寻址和将字节映射到字 125
11.15 使用2的幂 126
11.16 字节对齐和编程 126
11.17 内存大小和地址空间 127
11.18 使用字寻址的编程 127
11.19 内存大小和2的幂 128
11.20 指针和数据结构 128
11.21 内存转储 129
11.22 间接寻址和间接操作数 129
11.23 带有独立控制器的多个内存 130
11.24 内存的存储体 130
11.25 交叉存取 131
11.26 内容可寻址存储器 132
11.27 三态内容可寻址存储器 133
11.28 小结 133
习题 133
第12章 缓存器和缓存 135
12.1 引言 135
12.2 在存储层级上的信息传播 135
12.3 缓存的定义 135
12.4 缓存器的特征 135
12.5 缓存术语 136
12.6 最好和最坏情况下的缓存性能 136
12.7 一个典型请求序列的缓存性能 137
12.8 缓存替换策略 138
12.9 最近最少使用替换策略 138
12.10 多级缓存层级结构 138
12.11 预加载缓存 139
12.12 和内存一块使用的缓存 139
12.13 物理内存缓存 140
12.14 写直通策略和写回策略 140
12.15 缓存一致性 141
12.16 L1、L2和L3缓存 141
12.17 L1、L2和L3缓存的大小 142
12.18 指令和数据缓存 142
12.19 改良的哈佛体系结构 143
12.20 内存缓存的实现 143
12.21 直接映射的内存缓存 144
12.22 使用2的幂提高效率 145
12.23 直接映射缓存的硬件实现 146
12.24 组相联的内存缓存 147
12.25 对程序员的影响 148
12.26 小结 148
习题 148
第13章 虚拟内存技术与虚拟寻址 150
13.1 引言 150
13.2 虚拟内存的定义 150
13.3 内存的管理单元和地址空间 150
13.4 多个物理内存系统的接口 150
13.5 地址转换或者地址映射 151
13.6 避免算术计算 152
13.7 不连续的地址空间 152
13.8 虚拟内存的动机 153
13.9 多虚拟地址空间和多道程序 154
13.10 动态地创建虚拟地址空间 155
13.11 基址–界限寄存器 155
13.12 改变虚拟地址空间 155
13.13 虚拟内存和保护 156
13.14 分段 156
13.15 请求分页 157
13.16 请求分页的硬件和软件 157
13.17 页替换 157
13.18 分页术语和数据结构 158
13.19 分页系统中的地址转换 158
13.20 使用2的幂 159
13.21 存在位、使用位和修改位 159
13.22 页表的存储 160
13.23 分页效率和转换后备缓冲区 160
13.24 对程序员的影响 161
13.25 虚拟内存和缓存间的关系 162
13.26 虚拟内存缓存和缓存刷新 162
13.27 小结 163
习题 164
第四部分 输入和输出
第14章 输入/输出的概念和术语 166
14.1 引言 166
14.2 输入和输出设备 166
14.3 外部设备的控制 166
14.4 数据传输 167
14.5 串行与并行数据传输 167
14.6 自同步数据 168
14.7 全双工和半双工交互 168
14.8 接口的吞吐率和延迟 168
14.9 多路复用的基本思想 169
14.10 每个接口支持多个设备 169
14.11 从处理器角度看I/O 170
14.12 小结 170
习题 170
第15章 总线及总线架构 171
15.1 引言 171
15.2 总线的定义 171
15.3 处理器、I/O设备以及总线 171
15.4 物理连接 172
15.5 总线接口 173
15.6 控制、地址和数据线 173
15.7 提取–保存范式 174
15.8 提取–保存和总线宽度 174
15.9 多路复用 175
15.10 总线的宽度和数据项的大小 176
15.11 总线地址空间 176
15.12 潜在错误 177
15.13 地址的配置和插槽 177
15.14 多总线的问题 178
15.15 对设备使用提取–保存 178
15.16 接口的操作 179
15.17 不对称赋值和总线错误 179
15.18 统一内存和设备寻址 180
15.19 总线地址空间中的“洞” 180
15.20 地址映射 180
15.21 总线的程序接口 181
15.22 总线之间的桥 182
15.23 主总线和辅助总线 182
15.24 对程序员的影响 183
15.25 总线的替代者——交换结构 183
15.26 小结 184
习题 185
第16章 可编程的I/O和中断驱动的I/O 186
16.1 引言 186
16.2 I/O范式 186
16.3 可编程的I/O 186
16.4 同步 186
16.5 轮询 187
16.6 轮询的代码 187
16.7 控制和状态寄存器 189
16.8 使用结构来定义CSR 190
16.9 处理器的使用和轮询 190
16.10 中断驱动的I/O 191
16.11 中断机制和取指–执行 191
16.12 处理中断 192
16.13 中断向量 192
16.14 中断初始化和禁用中断 193
16.15 中断一个中断处理程序 193
16.16 中断的配置 194
16.17 动态的总线连接和可插拔设备 194
16.18 中断、性能和智能设备 195
16.19 直接内存访问 195
16.20 用缓冲链扩展DMA 196
16.21 分散读操作和聚集写操作 196
16.22 操作链 197
16.23 小结 197
习题 198
第17章 程序员视角的设备、输入/输出和缓冲 199
17.1 引言 199
17.2 设备驱动程序的定义 199
17.3 设备的独立、封装和隐藏 199
17.4 设备驱动程序的概念 200
17.5 两类设备 200
17.6 设备驱动程序的示例流程 201
17.7 输出操作队列 202
17.8 强制设备发出中断 202
17.9 输入操作队列 203
17.10 异步设备驱动程序和互斥 203
17.11 从应用程序看I/O 204
17.12 库/操作系统二元论 205
17.13 操作系统支持的I/O操作 205
17.14 I/O操作的成本 205
17.15 减少系统调用的开销 206
17.16 缓冲的关键概念 206
17.17 缓冲输出的实现 207
17.18 清空缓冲区 208
17.19 缓冲输入 208
17.20 缓冲的效率 209
17.21 与缓存的关系 209
17.22 一个例子:C语言的标准I/O库 209
17.23 小结 209
习题 210
第五部分 高级主题
第18章 并行 212
18.1 引言 212
18.2 并行性和流水线架构 212
18.3 并行的特征 212
18.4 微观与宏观 212
18.5 微观并行的例子 213
18.6 宏观并行的例子 213
18.7 对称与非对称 214
18.8 细粒度并行与粗粒度并行 214
18.9 显式并行与隐式并行 214
18.10 并行体系结构的类型(弗林分类法) 214
18.11 单指令流单数据流 215
18.12 单指令流多数据流 215
18.13 多指令流多数据流 216
18.14 通信、协同和竞争 218
18.15 多处理器的性能 218
18.16 对程序员的影响 220
18.17 冗余并行体系结构 221
18.18 分布式集群计算机 222
18.19 现代超级计算机 222
18.20 小结 223
习题 223
第19章 数据流水线 225
19.1 引言 225
19.2 流水线的概念 225
19.3 软件流水线 226
19.4 软件流水线的性能和开销 227
19.5 硬件流水线 227
19.6 硬件流水线如何提升性能 228
19.7 何时使用流水线 229
19.8 处理过程的概念划分 230
19.9 流水线架构 231
19.10 流水线的建立、延迟以及排空时间 231
19.11 超流水线架构的定义 231
19.12 小结 232
习题 232
第20章 功率与能耗 233
20.1 引言 233
20.2 功率的定义 233
20.3 能耗的定义 233
20.4 数字电路的功耗 234
20.5 CMOS数字电路的切换功耗 234
20.6 冷却、功耗密度和功率墙 235
20.7 能耗使用 236
20.8 功率管理 236
20.9 能耗使用的软件控制 238
20.10 选择何时睡眠和何时唤醒 239
20.11 睡眠模式和网络设备 240
20.12 小结 240
习题 241
第21章 评估性能 242
21.1 引言 242
21.2 测量计算能力和性能 242
21.3 计算能力的测量 242
21.4 应用相关的指令数 243
21.5 指令混合 244
21.6 标准化测试程序 244
21.7 I/O和内存瓶颈 245
21.8 硬件与软件的权衡 245
21.9 选择拟优化的部件——阿姆达尔定律 246
21.10 阿姆达尔定律和并行系统 246
21.11 小结 246
习题 247
第22章 体系结构的例子和层次 248
22.1 引言 248
22.2 体系结构的层次 248
22.3 系统级架构——个人电子计算机 248
22.4 总线互连和桥接 249
22.5 控制器芯片和物理架构 249
22.6 虚拟总线 250
22.7 连接速率 251
22.8 桥接功能和虚拟总线 252
22.9 板级架构 252
22.10 芯片级架构 253
22.11 片上功能单元的结构 254
22.12 小结 254
习题 255
第23章 硬件模块化 256
23.1 引言 256
23.2 模块化的动机 256
23.3 软件模块化 256
23.4 子程序的参数化调用 257
23.5 硬件扩展和并行 257
23.6 基本块复制 257
23.7 示例设计(重启器) 257
23.8 重启器的高层次设计 258
23.9 适应各种尺寸的构建块 258
23.10 并行互连 258
23.11 互连的例子 259
23.12 模块选择 259
23.13 小结 260
习题 260
附录A 用于计算机体系结构课程的实验练习 261
附录B 布尔代数化简法则 272
附录C x86汇编语言快速入门 273
附录D ARM寄存器定义和调用序列 286