具体描述
计算机科学正在发生深刻的变革,随着嵌入式系统的广泛应用,每年全世界售出的嵌入式计算机大约是桌面计算机的40倍,大学毕业生将更多地从事嵌入式系统硬件的设计,而不是设计一个传统的桌面计算机。计算学科发展和产业界的技术进步,要求高等教育也进行与时俱进的改革。本书采用现代视角来看待当今的计算机体系结构,强调日益重要的嵌入式系统,以满足教育界和工业界对于硬件设计人才培养的需求。
本书在提供计算机体系结构背景知识的基础上,将讲述的重点放在我们每天生活和工作都要依赖的嵌入式系统上。书中首先介绍了算术和处理中的基础知识,随后分几章讨论了CPU结构、功能单元、性能优化、外部接口、实际嵌入式处理和计算的未来。本书还提出了嵌入式工业中关键的几个特定主题,以及在CPU设计项目中包含设计、仿真、测试和规划一个简单嵌入式计算机的一切必要步骤。
本书所采用的嵌入式系统相关的方法,使得书中的知识内容更加贴近工业界的需要,激励学生更投入地学习,并构建起该门课程与传统课程体系内其他相关课程(如电子学、计算机工程或计算机科学课程)的相互联系。本书不是在传统计算机体系结构教材的基础上扩展了嵌入式系统的一章,而是以新颖的视角来看待今天的计算机体系结构——它以历史上巨大而古老的机器为基础,现在正朝着嵌入式系统高度集成化的方向不断发展。
作者简介
Ian McLoughlin 现任新加坡南洋理工大学计算机工程学院副教授,拥有英国伯明翰大学博士学位。过去的20年,他在三大洲的工业部门、政府部门和学术界都工作过。作为经验丰富的工程师,他设计和工作的系统涉及航空、电信、日常消费品等诸多领域。他经常主持面向电子行业的技术培训课程,并为嵌入式系统(尤其是与音频和无线技术相关)的开发项目提供咨询和顾问服务。由于其在农村电信解决方案方面的杰出工作,他与新西兰大吉电子有限公司(Tait Electronics Ltd)的团队成员在2005年荣获首届IEE工程创新奖。他是IET会员、IEEE高级会员、英国注册工程师和全欧工程师。
目录信息
前言
致谢
第1章 引言1
1.1 本书组织结构1
1.2 进化过程1
1.3 计算机发展阶段划分4
1.3.1 第一代计算机4
1.3.2 第二代计算机4
1.3.3 第三代计算机5
1.3.4 第四代计算机6
1.3.5 第五代计算机7
1.4 云、普适、网格和超并行计算机7
1.5 未来8
1.6 小结9
第2章 基础知识10
2.1 计算机组成10
2.1.1 Flynn分类法10
2.1.2 连接方式11
2.1.3 计算机结构层次视图11
2.2 计算机基本原理12
2.3 数字格式15
2.3.1 无符号二进制15
2.3.2 原码15
2.3.3 反码15
2.3.4 补码15
2.3.5 移码(excess-n)16
2.3.6 BCD码16
2.3.7 定点数表示法17
2.3.8 符号扩展17
2.4 算术运算18
2.4.1 加法18
2.4.2 并行进位传递加法器18
2.4.3 超前进位20
2.4.4 减法20
2.5 乘法21
2.5.1 加法迭代法22
2.5.2 部分积方法22
2.5.3 移位加方法24
2.5.4 Booth和Robertson方法25
2.6 除法26
2.7 定点数格式的运算28
2.7.1 定点数的运算28
2.7.2 定点数的乘除29
2.8 浮点数30
2.8.1 广义浮点数30
2.8.2 IEEE754浮点标准30
2.8.3 IEEE754标准模式31
2.8.3.1 规格化模式31
2.8.3.2 非规格化模式32
2.8.3.3 其他模式数33
2.8.4 IEEE754数的范围33
2.9 浮点数处理35
2.9.1 IEEE754数的加减运算36
2.9.2 IEEE754数的乘除法38
2.9.3 IEEE754中间格式38
2.9.4 舍入39
2.10 小结39
思考题40
第3章 CPU基础42
3.1 什么是计算机42
3.2 让计算机为你服务42
3.2.1 程序存储42
3.2.2 存储架构43
3.2.3 程序传输44
3.2.4 控制单元44
3.2.5 微指令48
3.2.6 RISC和CISC的对比49
3.2.7 处理器实例51
3.3 指令处理51
3.3.1 指令集52
3.3.2 取指和译码54
3.3.2.1 指令译码55
3.3.2.2 取操作数55
3.3.2.3 分支56
3.3.2.4 立即数57
3.3.3 压缩指令集57
3.3.4 寻址模式59
3.3.5 堆栈机和逆波兰表示法61
3.4 数据处理62
3.4.1 数据的格式和表达63
3.4.2 数据流65
3.4.3 数据存储66
3.4.4 内部数据66
3.4.5 数据处理67
3.4.5.1 在小位宽CPU上处理大位宽数字67
3.4.5.2 定点CPU上的浮点数68
3.4.5.3 复数69
3.5 自顶向下方法69
3.5.1 计算机的能力69
3.5.1.1 功能70
3.5.1.2 时钟频率70
3.5.1.3 位宽70
3.5.1.4 内存70
3.5.2 性能衡量和统计70
3.5.3 性能评估72
3.6 小结73
思考题74
第4章 处理器内部组成76
4.1 内部总线结构76
4.1.1 程序员的角度76
4.1.2 分解互联排列77
4.1.3 ADSP21xx总线排列78
4.1.4 数据与程序同时访存78
4.1.5 双总线体系结构80
4.1.6 单总线体系结构81
4.2 算术逻辑单元82
4.2.1 ALU功能82
4.2.2 ALU设计83
4.3 内存管理单元85
4.3.1 对虚拟存储的需求85
4.3.2 MMU操作85
4.3.3 退回算法87
4.3.4 内部存储碎片和片段87
4.3.5 外部碎片88
4.3.6 改进的MMU89
4.3.7 内存保护89
4.4 cache90
4.4.1 直接相联cache92
4.4.2 组相联cache93
4.4.3 全相联cache94
4.4.4 局部性原则94
4.4.5 cache替换算法95
4.4.6 cache性能98
4.4.7 cache一致性99
4.5 协处理器100
4.6 浮点运算单元101
4.6.1 浮点仿真102
4.7 SIMD流指令扩展(SSE)和多媒体扩展103
4.7.1 多媒体扩展(MMX)103
4.7.2 MMX实现103
4.7.3 MMX的使用104
4.7.4 SIMD流指令扩展(SSE)105
4.7.5 使用SSE和MMX105
4.8 嵌入式系统中的协处理105
4.9 小结106
思考题107
第5章 提高CPU性能110
5.1 CPU加速技术简介110
5.2 流水线111
5.2.1 多功能流水线112
5.2.2 动态流水线113
5.2.3 改变流水线模式113
5.2.4 数据相关冒险114
5.2.5 条件冒险116
5.2.6 条件分支117
5.2.7 编译时流水线补偿118
5.2.8 相对地址分支119
5.2.9 流水线的指令集补偿120
5.2.10 运行时流水线补偿122
5.3 复杂指令集(CISC)和精简指令集(RISC)123
5.4 超标量体系结构124
5.4.1 简单超标量124
5.4.2 多发送超标量125
5.4.3 超标量的性能126
5.5 每周期的指令数127
5.5.1 不同体系结构的IPC127
5.5.2 IPC度量128
5.6 硬件加速器129
5.6.1 零开销循环129
5.6.2 地址处理硬件131
5.6.3 影子寄存器134
5.7 分支预测134
5.7.1 分支预测的必要性134
5.7.2 单T位预测器136
5.7.3 双位预测器137
5.7.4 计数器和移位器预测器138
5.7.5 局部分支预测器139
5.7.6 全局分支预测器141
5.7.7 G选择预测器142
5.7.8 G共享预测器143
5.7.9 混合预测器144
5.7.10 分支目标缓冲145
5.7.11 基本代码段147
5.7.12 分支预测总结148
5.8 并行机器148
5.8.1 SISD向MIMD的演变150
5.8.2 为提高性能而采用并行152
5.8.3 其他并行处理153
5.9 Tomasulo算法155
5.9.1 Tomasulo算法的原理155
5.9.2 Tomasulo系统的例子155
5.9.3 嵌入式系统中的Tomasulo算法159
5.10 小结160
思考题160
第6章 外部总线163
6.1 总线接口163
6.1.1 总线控制信号164
6.1.2 直接存储器存取(DMA)164
6.2 并行总线规范165
6.3 标准接口166
6.3.1 系统控制接口166
6.3.2 系统数据总线167
6.3.2.1 ISA总线及其衍生总线167
6.3.2.2 PC/104168
6.3.2.3 PCI170
6.3.2.4 LVDS170
6.3.3 输入/输出总线171
6.3.4 外设器件总线172
6.3.5 与网络设备的接口172
6.4 实时性问题172
6.4.1 外部激励173
6.4.2 中断173
6.4.3 实时性定义173
6.4.4 时间范围参数174
6.4.5 硬件体系结构对实时操作系统的支持175
6.5 中断和中断处理176
6.5.1 中断的重要性176
6.5.2 中断过程176
6.5.2.1 中断事件通知处理器176
6.5.2.2 CPU完成正在进行的工作177
6.5.2.3 转入中断服务例程177
6.5.2.4 中断重定向179
6.5.3 高级中断处理180
6.5.4 共享中断180
6.5.5 可重入代码181
6.5.6 软件中断181
6.6 无线181
6.6.1 无线技术181
6.6.2 无线接口183
6.6.3 无线相关问题183
6.7 小结183
思考题184
第7章 实用嵌入式CPU187
7.1 概述187
7.2 微处理器不只是核187
7.3 功能需求189
7.4 时钟192
7.5 时钟与功耗194
7.5.1 传输延迟195
7.5.2 电流相关问题195
7.5.3 时钟问题解决方法196
7.5.4 低电压设计196
7.6 存储197
7.6.1 早期的计算机存储198
7.6.2 只读存储器198
7.6.3 随机存取存储器203
7.6.3.1 静态RAM204
7.6.3.2 动态RAM205
7.6.3.3 DRAM的寻址机制206
7.7 分页与重叠209
7.8 嵌入式系统中的存储210
7.8.1 非易失存储器211
7.8.2 易失存储器212
7.8.3 其他存储器213
7.9 测试和验证214
7.9.1 集成电路设计和制造问题215
7.9.2 内置自测(BIST)216
7.9.3 联合测试行动小组(JTAG)218
7.10 错误检测和纠正220
7.11 看门狗定时器和复位监测223
7.12 逆向工程225
7.12.1 逆向工程过程226
7.12.1.1 功能分析228
7.12.1.2 物理结构分析228
7.12.1.3 材料清单228
7.12.1.4 系统架构229
7.12.2 详细的物理布局229
7.12.2.1 电气连接原理图230
7.12.2.2 存储程序230
7.12.2.3 软件230
7.13 防止逆向工程232
7.13.1 存储程序的被动模糊233
7.13.2 可编程逻辑家族234
7.13.3 主动RE防范234
7.13.4 主动RE防范分类235
7.14 小结236
思考题236
第8章 CPU设计238
8.1 软核处理器238
8.1.1 微处理器不仅仅有处理器核238
8.1.2 软核处理器的优点239
8.1.2.1 性能239
8.1.2.2 可用性239
8.1.2.3 效率240
8.1.2.4 人为因素240
8.2 软硬件协同设计241
8.3 现成的软核243
8.4 制作自己的软核245
8.5 CPU设计规格说明245
8.5.1 CPU体系结构246
8.5.2 总线246
8.5.3 程序及数据存储247
8.5.4 逻辑运算248
8.5.5 指令处理248
8.5.6 系统控制249
8.6 指令集249
8.6.1 CPU控制251
8.6.1.1 闲置状态252
8.6.1.2 取指状态252
8.6.1.3 执行状态252
8.7 CPU实现253
8.7.1 测试的重要性253
8.7.2 定义操作和状态:defs.v253
8.7.3 第一个小模块:counter.v254
8.7.4 CPU控制:state.v256
8.7.5 程序和变量存储:ram.v257
8.7.6 堆栈:stack.v259
8.7.7 算术、逻辑和乘法单元:alu.v261
8.7.8 综合测试:tinycpu.v263
8.8 CPU测试及运行267
8.9 编程并使用CPU267
8.9.1 编写TinyCPU程序268
8.9.2 TinyCPU编程工具271
8.10 小结271
思考题272
第9章 未来274
9.1 单比特体系结构274
9.1.1 位串行加法274
9.1.2 位串行减法275
9.1.3 位串行逻辑电路和处理275
9.2 超长指令字体系结构276
9.2.1 VLIW的基本原理276
9.2.2 VLIW的难题277
9.3 并行与大规模并行计算机278
9.3.1 大型计算机集群278
9.3.2 小型计算机集群279
9.3.2.1 从嵌入式系统中解放计算资源279
9.3.2.2 并行处理单元279
9.3.3 并行和集群处理注意事项283
9.3.4 互连策略283
9.4 异步处理器285
9.4.1 数据流控制286
9.4.2 避免流水线冒险286
9.5 替代数字格式系统287
9.5.1 多值逻辑287
9.5.2 带符号数字的表示288
9.6 光计算289
9.6.1 光电全加器289
9.6.2 光电底板290
9.7 科幻小说还是未来的现实291
9.7.1 分布式计算291
9.7.2 湿件(大脑)291
9.8 小结292
附录A 内存大小的标准表示方法293
附录B 开放系统互连模型295
B.1 引言295
B.2 OSI层次295
B.3 小结296
附录C 探索cache大小和结构安排的权衡设计方法297
C.1 引言297
C.2 准备工作297
C.3 安装Cacti和Dinero297
C.4 工具的使用298
C.5 不同cache设计方案的实验299
C.6 cache设计中的进一步信息299
思考题300
附录D 嵌入式计算机上的无线技术301
D.1 引言301
D.2 802.11a,b和g301
D.3 802.11n302
D.4 802.20302
D.5 802.16302
D.6 蓝牙303
D.7 GSM303
D.8 GPRS304
D.9 ZigBee305
D.10 无线USB305
D.11 近距离通信306
D.12 WiBro307
D.13 无线设备总结307
D.14 应用举例308
D.15 小结308
附录E 编译和仿真TinyCPU的工具309
E.1 准备和软件获取309
E.2 如何编译和仿真Verilog309
E.3 如何查看仿真输出313
E.4 高级测试平台318
E.5 小结318
附录F TinyCPU编译和汇编代码的工具319
F.1 引言319
F.2 汇编过程319
F.3 汇编器320
F.4 汇编程序实例322
F.5 编译器323
F.6 小结323
索引325
· · · · · · (收起)
读后感
用户评价
这本书在处理I/O(输入/输出)和中断机制的部分,展现出了极高的专业水准和对系统整体性能的深刻理解。以往很多书籍只是将I/O视为一个外围模块,但作者在这里将其提升到了与CPU核心同等重要的地位来讨论,着重阐述了DMA(直接内存访问)如何极大地解放了CPU,避免了不必要的周期性轮询。这种对系统级效率的关注,是我在这类技术书籍中很少见到的深度。作者对中断处理流程的描述细致入微,从硬件触发到操作系统内核接管的整个上下文切换过程,被清晰地分步骤讲解,配上精确的流程图,几乎可以让你在脑海中模拟出一次中断发生时的所有操作。这对于理解实时系统和操作系统内核的调度机制至关重要。通过阅读这一部分,我才真正明白了为什么现代计算机的响应速度能如此之快——那不是单纯依靠提高时钟频率,而是依赖于这些精妙的异步处理机制。这本书绝对是工程师们提升架构理解深度的必备读物,它教会我如何从整体架构而非单一组件的角度去评估性能瓶颈。
这是一本需要静下心来仔细研读的宝典,它对并行处理和多核设计的探讨,简直是站在了时代的前沿。我曾经花了很多时间在网上搜索关于GPU加速和异构计算的资料,但信息零散且深度不够。这本书却提供了一个系统化、有脉络的框架。作者详尽地解释了如何将一个宏大的计算任务拆解成可以并行执行的子任务,以及同步和互斥机制在保证数据正确性方面所起到的关键作用。那些关于指令级并行(ILP)和数据级并行(DLP)的对比分析,清晰地揭示了现代处理器架构设计哲学是如何围绕“榨干每一个时钟周期”这一目标展开的。阅读过程中,我时常会停下来,对比自己正在使用的软件,思考它们在底层是如何与硬件进行交互的。这本书没有过度渲染“黑科技”,而是脚踏实地地展示了工程师们是如何通过巧妙的工程设计来突破物理极限的。对于任何想要进入高性能计算或嵌入式系统领域的专业人士而言,这本书无疑提供了坚实的基础和前瞻性的视野。
这本书实在是太引人入胜了!我一直对那些隐藏在日常电子设备背后的“魔法”感到好奇,而这本书简直就是一本详尽的拆解手册。作者的叙述方式极其生动,仿佛带着你亲手去触摸那些微小的硅晶片,感受电流是如何在复杂的逻辑门之间穿梭奔跑的。特别是关于流水线技术和缓存一致性的章节,原本以为会是枯燥的理论堆砌,结果却被作者描绘成一场精妙的交响乐。我尤其欣赏他对不同架构设计哲学——比如精简指令集(RISC)与复杂指令集(CISC)——之间权衡的深入剖析。他没有简单地宣布谁优谁劣,而是将其置于实际应用场景中进行对比,让我深刻理解了为什么某些设备会偏爱特定的设计。阅读过程中,我脑海中不断浮现出图表和模型,那种“豁然开朗”的感觉,远超我预期的技术读物能带来的震撼。如果说有什么美中不足,可能某些高级优化技巧的推导过程略显跳跃,但瑕不掩瑜,对于想要建立扎实底层理解的读者来说,这本书绝对是首选的入门与进阶指南。它成功地将抽象的电子工程概念,转化为可感知的、有逻辑的故事线。
我不得不说,作者的写作功底非同一般,他成功地将原本可能晦涩难懂的数字电路原理和逻辑设计,转化成了一场引人入胜的侦探故事。从最基础的逻辑门、触发器,到如何构建一个完整的算术逻辑单元(ALU),整个过程的衔接无比流畅自然。我最欣赏的是,作者总能在我们即将感到迷茫的临界点提供一个清晰的上下文或者一个历史背景的插曲,解释为什么某项技术会被发明出来,它解决了当时怎样的痛点。这使得学习过程充满了目的性,而不是盲目地背诵定义。尤其是对位操作和数据表示的讲解,非常透彻,让我彻底理解了计算机内部处理负数和浮点数的真正机制,消除了过去很多似是而非的模糊认识。这本书不是那种读完后就束之高阁的参考书,它更像是一本工具书,每次重读都会因为我自身知识的增长而发现新的理解层次。它奠定了扎实的硬件基础,让我对接下来的系统软件学习充满了信心。
说实话,我抱着一种半信半疑的态度打开了这本厚厚的书,毕竟市面上介绍底层硬件的书籍往往要么过于学术化,让人昏昏欲睡,要么又为了追求通俗而牺牲了严谨性。这本书却巧妙地找到了一个完美的平衡点。它不像某些教科书那样,上来就抛出一堆让你摸不着头脑的术语,而是循序渐进,用清晰的比喻和恰当的案例来引导读者构建知识体系。我特别喜欢其中关于内存访问延迟和性能瓶颈分析的部分。作者没有回避那些复杂的数学公式,但总是先给出直观的解释,让我明白为什么这些公式是必要的,以及它们在实际解决问题时扮演的角色。比如,当谈到分支预测失败的代价时,那种对性能的“惩罚感”是如此真实,让我以后在编写代码时都会下意识地去考虑代码结构对处理器的友好程度。这本书的价值不仅仅在于传授知识,更在于培养一种底层思维模式——一种对效率的极致追求和对资源分配的深刻洞察。它让我不再仅仅是一个应用程序的使用者,而更像是一个能够理解并优化整个计算生态的工程师。
让我真正理解了许多CPU概念!
让我真正理解了许多CPU概念!
让我真正理解了许多CPU概念!
让我真正理解了许多CPU概念!
让我真正理解了许多CPU概念!