MIPS处理器设计透视

MIPS处理器设计透视
作 者: Dominic Sweetman 赵俊良 赵俊良
出版社: 北京航空航天大学出版社
丛编项: AKAE嵌入式研究中心推荐教材
版权说明: 本书为公共版权或经版权方授权,请支持正版图书
标 签: 微处理器/CPU
ISBN 出版时间 包装 开本 页数 字数
未知 暂无 暂无 未知 0 暂无

作者简介

  Dominic Sweetman属于最后一代希望从底层到上层理解计算机系统的程序员。他丰富的职业生涯开始于编写底层代码,从操作系统的开发到网络再到分布式系统。他是一位在硬件系统、CPU、网络的操作系统方面经验丰富的设计者和开发者,是Whitechael Workstations的发起人之一,于1988年创立了Algoritmics公司,并担任主管。Dominic和他的妻子、两个孩子及三只猫生活在伦敦北部。

内容简介

本书涵盖了有关MIPS处理器的发展历史、运行原理和编程等诸多内容。首先介绍了MIPS的发展历史;然后分别对MIPS处理器的体系结构、协处理器、Cache、中断、内存管理、浮点运算、MIPS指令集、汇编语言编程、C语言编程、代码的可移植性等细节进行了详细深入的分析;最后列举了一些MIPS代码的例子。本书不仅内容充实,而且语言通俗易懂,是MIPS体系结构领域中全面性和易读性结合的很好的一本书,适合学习MIPS体系结构的初学者;同时对于MIPS程序员和高级用户也极有参考价值。本书既可用作计算机类、微电子类本科生及研究生教科书和参考书,也可作为从事MIPS软件开发、计算机体系结构研究和开发人员的参考资料。本书前言这是一本关于MIPS的书。MIPS是20世纪80年代中期诞生的RISCCPU设计之一,也是销量最好的RISCCPU之一。从SONY、任天堂的游戏主机,到Cisco的路由器,再到SGI的超级计算机,到处都能看到MIPSCPU的应用。目前,RISC体系结构正面临着普及与强大的x86体系结构CPU的强烈冲击,到20世纪末,MIPS也许会是那些原始RISCCPU设计中惟一正常盈利的体系结构。RISC是一个有用的名词,而并非只是市场宣传用语,它体现了20世纪80年代中期为提高流水线效率所设计的一组计算机体系结构之间的共同特性。CISC则麻烦得多,因为它实际上泛指所有非RISC的东西。本书将采用一个狭义的CISC定义,用它来指使用微代码控制的结构,如68000、x86等。本书是为程序员编写的,这个目标决定了本书内容的取舍。如果一个程序员遇到问题或感兴趣,那么这些内容将包含在本书内。这意味着我们不必讨论那些困扰了两代硬件设计工程师的MIPS接口问题。在操作系统中可能隐藏着许多我们在这里讨论的细节。有许多优秀的程序员认为C语言已经足够地接近底层了,结构方面的调节不需要关心。但有时确实需要深入具体细节——对比特边界是如何工作的这一问题,人类是天生就满怀好奇的。根据这个原则,我们在描述一个软件人员可能不熟悉的东西时,倾向于非正式的方式——特别是关于CPU内部工作原理的内容。但讨论到程序员们以往见过的东西,如寄存器、指令以及数据如何存储在内有等问题时,我们将采用更简洁和技术化的说法。这里假设本书的读者已经熟悉并适应了C语言。在本书中,大多数的引用材料使用C语言作为简要操作的一种描述方法,特别是在指令集细节和汇编语言相关的章节。...

图书目录

第1章 RISC和MIPS

1.1 流水线2

1.1.1 什么使流水线效率降低?3

1.1.2 流水线和缓存4

1.2 MIPS的五级流水线4

1.3 RISC 和CISC6

1.4 迄今为止一些重要的MIPS芯片7

1.4.1 R2000到R30007

1.4.2 R6000: 一次偏轨7

1.4.3 R4000革命8

1.4.4 R5000和R100009

1.5 MIPS和CISC体系结构的比较11

1.5.1 MIPS指令集的一些规定11

1.5.2 编址及内存访问12

1.5.3 MIPS不支持的特征13

1.5.4 可能没有预料到的特征14

1.5.5 程序员可见的流水线效果14

第2章 MIPS体系结构

2.1 MIPS汇编语言18

2.2 寄存器的特点19

2.3 整数乘法单元和寄存器22

2.4 加载和存储:寻址方式23

2.5 存储器和寄存器中的数据类型24

2.5.1 整数数据类型24

2.5.2 未对齐的加载和存储 25

2.5.3 存储器中的浮点数据 25

2.6 汇编语言的合成指令 26

2.7 MIPS I发展到 MIPS IV : 64位(和其他)的扩展 27

2.7.1 迈向64位 28

2.7.2 谁需要64位?29

2.7.3 关于64位与无模式转换:寄存器中的数据30

2.7.4 MIPS III的一些其他改进31

2.8 基本地址空间 32

2.8.1 简单系统的寻址34

2.8.2 核心与用户权限34

2.8.3 64位CPU的存储映射34

2.9 流水线冒险36

第3章 协处理器0: MIPS处理器控制

3.1 CPU控制指令41

3.2 起作用的寄存器及起作用的时机42

3.3 标准CPU控制寄存器编码43

3.3.1 处理器ID(PRId)寄存器43

3.3.2 状态寄存器(SR)44

3.3.3 原因寄存器(Cause)49

3.3.4 异常返回地址(EPC)51

3.3.5 无效虚地址寄存器(BadVaddr)51

3.4 R4000以后的CPU专有的控制寄存器51

3.4.1 Count/Compare寄存器: R4000时钟51

3.4.2 Config寄存器: R4x00配置52

3.4.3 LoadLinked Address (LLAddr)寄存器54

3.4.4 调试观测点(WatchLo/WatchHi)寄存器54

第4章 MIPS的缓存

4.1 缓存和缓存的管理56

4.2 缓存怎样工作56

4.3 早期MIPS CPU中的写透缓存58

4.4 近期MIPS CPU中的回写缓存59

4.5 缓存设计的其他选择59

4.6 缓存管理60

4.7 二级和三级缓存62

4.8 MIPS CPU缓存的构造63

4.9 对R3000风格的缓存编程64

4.9.1 使用缓存隔离和交换65

4.9.2 初始化和判断大小66

4.9.3 缓存无效66

4.9.4 测试和探察67

4.10 对R4000风格的缓存编程67

4.10.1 CacheERR、ERR和ErrorEPC寄存器:缓存错误处理68

4.10.2 缓存指令70

4.10.3 计算缓存的大小和配置方式71

4.10.4 初始化程序72

4.10.5 在缓存中无效或者写回一个内存区域73

4.11 缓存效率73

4.12 修改软件来影响缓存的效率75

4.13 写缓冲区和需要关心它的时候77

4.14 关于MIPS缓存的其他话题79

4.14.1 多处理器的缓存特征79

4.14.2 缓存别名79

第5章 异常、中断和初始化

5.1 精确异常81

5.2 异常发生时刻83

5.3 异常向量: 异常处理开始的地方83

5.4 异常处理基础86

5.5 从异常返回87

5.6 嵌套异常87

5.7 一个异常处理例程88

5.8 中断88

5.8.1 MIPS处理器的中断资源89

5.8.2 实现中断优先级91

5.8.3 原子性和对SR的原子改变92

5.8.4 中断使能下的关键区: MIPS中的信号量机制93

5.9 启动94

5.9.1 识别CPU型号96

5.9.2 启动序列97

5.9.3 启动一个应用程序97

5.10 模拟指令98

第6章 内存管理与TLB

6.1 大型计算机上的内存管理101

6.1.1 基本进程空间布局和保护101

6.1.2 把进程空间映射到真正的物理内存103

6.1.3 最佳页映射103

6.1.4 我们真正想要的104

6.1.5 MIPS设计的起源106

6.2 MIPS TLB的特点106

6.3 MMU的寄存器109

6.3.1 EntryHi、EntryLo和PageMask寄存器110

6.3.2 Index寄存器112

6.3.3 Random寄存器113

6.3.4 Wired寄存器114

6.3.5 Context寄存器及XContext寄存器114

6.4 MMU的控制指令115

6.5 对TLB编程116

6.5.1 如何产生重装入116

6.5.2 使用ASID117

6.5.3 Random寄存器与被绑定入口117

6.6 建立内存译码机制118

6.7 TLB的异常处理代码119

6.7.1 32位R3000系列CPU的TLB异常处理函数120

6.7.2 R4x00系列CPU的TLB异常处理函数122

6.7.3 XTLB的失效处理函数124

6.8 跟踪已修改的页(模拟dirty位)124

6.9 内存地址译码和64位指针125

6.10 使用MIPS的TLB126

6.11 在非Unix系统中的内存管理127

第7章 浮点支持

7.1 浮点的基本描述128

7.2 IEEE754标准及其背景129

7.3 怎样保存IEEE浮点数130

7.3.1 IEEE尾数的标准化131

7.3.2 对使用特殊值时的保留指数值131

7.3.3 MIPS浮点数据格式132

7.4 IEEE754的MIPS实现134

7.5 浮点寄存器135

7.6 浮点异常/中断136

7.7 浮点控制: 控制/状态寄存器137

7.8 浮点实现/校正寄存器139

7.9 浮点指令指南140

7.9.1 装入/存储140

7.9.2 寄存器间的传送141

7.9.3 三个操作数算术操作142

7.9.4 乘加操作143

7.9.5 一元(可变符号)操作143

7.9.6 转换操作143

7.9.7 条件分支和测试指令144

7.10 指令时序安排的要求146

7.11 指令时序对速度需求147

7.12 按需初始化和使能147

7.13 浮点模拟148

第8章 MIPS指令集完全指南

8.1 一个简单的例子149

8.2 汇编助记符及其含义150

8.2.1 U和NonU(非U)助记符152

8.2.2 除法助记符153

8.2.3 指令的详细清单153

8.3 浮点处理指令175

8.4 特殊指令及其用途179

8.4.1 向左加载/向右加载(load left/load right): 地址非对齐的存取操作179

8.4.2 关联加载/条件存储(loadlinked/storeconditional)183

8.4.3 条件拷贝(conditional move)指令184

8.4.4 可能跳转的指令(branchlikely)185

8.4.5 整数乘累加指令(interget multiplyaccumulate)和乘加指令(multiplyadd)186

8.4.6 浮点乘加指令(floatingpoint multiplyadd)187

8.4.7 多浮点条件标志位187

8.4.8 缓存数据预取188

8.4.9 存取同步屏障:Sync指令189

8.5 指令的机器编码190

8.5.1 指令编码中的域190

8.5.2 指令编码表的注意事项202

8.5.3 编码方式和处理器实现的简单剖析203

8.6 指令集的功能分组203

8.6.1 空操作204

8.6.2 寄存器间的数据拷贝指令204

8.6.3 立即数加载指令204

8.6.4 算术/逻辑操作指令205

8.6.5 整数乘法、除法以及求余指令207

8.6.6 整数乘累加指令208

8.6.7 存取指令209

8.6.8 跳转、分支和子程序调用指令211

8.6.9 断点及异常指令212

8.6.10 0#协处理器(CP0)处理指令212

8.6.11 浮点操作指令213

8.6.12 ATMizerII系统的专用浮点指令215

第9章 汇编程序设计

9.1 一个简单的例子216

9.2 语法简介220

9.3 指令使用规则221

9.3.1 带1~3个寄存器的计算型指令221

9.3.2 带立即数的运算指令222

9.3.3 关于32/64位指令223

9.4 寻址模式223

9.5 汇编伪指令226

9.5.1 段的选择226

9.5.2 包含堆栈的程序布局228

9.5.3 数据的定义与对齐229

9.5.4 符号绑定属性231

9.5.5 函数伪指令233

9.5.6 汇编器控制伪操作(.set)235

9.5.7 编译/调试支持237

9.5.8 SGI汇编语言中增加的伪操作237

第10章 MIPS上的C语言编程

10.1 堆栈、子程序链接以及参数传递239

10.2 堆栈参数结构240

10.3 使用寄存器传递参数241

10.4 C库范例242

10.5 一个特殊的例子传递数据结构243

10.6 传递不定数量的参数244

10.7 函数的返回值245

10.8 扩展寄存器——使用标准SGI n32和n64245

10.9 堆栈分布、堆栈帧以及辅助调试器248

10.9.1 leaf函数250

10.9.2 nonleaf函数251

10.9.3 适用于复杂堆栈要求的堆栈帧指针254

10.10 数目可变的参数列表257

10.11 不同线程间的共享函数和共享库问题258

10.11.1 单一地址空间的代码共享259

10.11.2 MIPS ABI中的共享库代码259

10.12 编译器的优化261

10.12.1 普通优化262

10.12.2 优化不友好的代码并且如何避免264

10.12.3 优化约束265

10.13 通过C进行器件访问的提示265

10.13.1 使用“volatile”制约破坏性的优化266

10.13.2 C中的非对齐数据267

第11章 可移植性和C代码

11.1 MIPS的移植: 常见问题清单270

11.2 一个理想的程序移植过程272

11.2.1 程序移植的3个选择272

11.2.2 解决系统相关的问题273

11.2.3 分离不可移植代码274

11.2.4 何时使用汇编274

11.3 可移植C程序和语言标准275

11.4 C库函数和POSIX276

11.5 数据表示和对齐277

11.6 尾端: 字、字节和位的顺序279

11.6.1 尾端和程序员281

11.6.2 尾端: 描述和脑力问题282

11.6.3 尾端: 硬件问题284

11.6.4 互相对立尾端阵营之间的连接286

11.6.5 可配置尾端的连接287

11.6.6 处理MIPS CPU的两种尾端的软件288

11.6.7 可移植性与尾端无关代码290

11.6.8 尾端和外部数据291

11.6.9 尾端问题“预知”和“治愈”的假象292

11.7 高速缓存会引起什么样的错误?怎样才能阻止它?292

11.7.1 高速缓存的管理和DMA数据294

11.7.2 高速缓存的管理和指令数据的写入295

11.7.3 高速缓存的管理和非高速缓存(或写透)的数据295

11.8 MIPS的不同实现295

第12章 软件举例

12.1 MIPS的启动298

12.2 MIPS缓存管理309

12.2.1 缓存操作:缓存指令出现前的32位MIPS310

12.2.2 Cache操作: 遵从MIPS III和Cache指令320

12.3 MIPS异常处理337

12.3.1 xcption: 为程序员做些什么?337

12.3.2 xcption: C语言接口代码338

12.3.3 xcption: 低层模块(lowlevel module)339

12.4 MIPS中断355

12.5 MIPS的优化357

附录A指令时序与优化

A.1 避免冒险: 确保代码正确363

A.2 避免互锁提高性能364

A.3 乘法单元冒险: hi和lo的早期修正365

A.4 避免CP0冒险: 要使用多少nop?365

A.5 CP0指令/指令调度(instruction scheduling)367

A.6 CP0标志位(flags)和指令369

附录B汇编语言语法

附录C目标代码

C.1 工具377

C.2 区和段(section & segment)378

C.3 ECOFF(RISC/OS)379

C.3.1 文件头379

C.3.2 可选的a.out头381

C.3.3 调入器(loader)举例382

C.3.4 进一步阅读383

C.4 ELF(MIPS ABI)383

C.4.1 文件头383

C.4.2 程序头385

C.4.3 调入器举例385

C.4.4 进一步阅读387

C.5 目标代码工具387

附录DMIPS的发展

D.1 MIPS16388

D.1.1 MIPS16中的特殊编码和指令389

D.1.2 MIPS16的评价389

D.2 MIPS V/MDMX390

D.2.1 编译器可以使用多媒体指令吗?391

D.2.2 MDMX的应用392

D.2.3 MIPS V的应用393

D.2.4 MDMX/MIPS V可能的成功393

MIPS术语说明394