书籍详情
MIPS处理器设计透视
作者:(英)Dominic Sweetman著;赵俊良等译;赵俊良译
出版社:北京航空航天大学出版社
出版时间:2005-06-01
ISBN:9787810774307
定价:¥55.00
购买这本书可以去
内容简介
本书涵盖了有关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语言作为简要操作的一种描述方法,特别是在指令集细节和汇编语言相关的章节。在本书中有些部分是要求读者要了解CISC(即680x0或x86)汇编语言的,因为站在CISC的角度上,MIPS体系结构的独创性与特殊性会更好地体现出来。当然如果不熟悉CISC汇编,这也并没有太大关系。通常需要对CPU的细节了解到本书所述程序的是操作系统开发人员或在嵌入式领域工作的人。嵌入式系统广义来说,是指任何把计算机操作得不像计算机的用法。这些系统的共同特征是,操作系统并未将CPU工作的细节隐藏起来,它对于程序员来说是可见的。MIPSCPU可以应用在很宽的领域内,例如从游戏程序领域到工业控制领域。但这并不是说本书只是一本参考手册,要把一个CPU体系结构留在你的大脑里,就必须真正地理解它。我希望本书能引起希望全面理解现代CPU体系结构的学生(在校或即将入校的学生)的编程兴趣。如果从头到尾地将此书读上一遍,你大概会期望从综述到细节的逐步深入过程,本书正是如此。不过同时,你还会看到一些按历史发展的内容表述,通常我们第一次介绍某个概念时,会讨论关于它的第一个版本。Hennessy和Patterson称此为“进化学习(learningthroughevolution)”,我们认为这是一种优秀的表达方法(当然,对他们来说足够优秀的方法对我也是一样的)。因此,在第1章中以一些历史和背景作为开始,把MIPS放在当时的环境中,来讨论当初MIPS的发明者们在头脑中最初形成的相关技术和观念。在第2章中,继续跟随他们的思路讨论MIPS机器语言的特点。为了简化指令,前两章省去了处理器控制方面的细节,我们把这内容留到第3章。处理器机制难看但实用,它允许MIPSCPU处理它们的高速缓存(cache)、异常和启动(exceptionsandstartup)与存储器管理(memorymanagement)。以上三个主题将分别由第4章到第6章来讨论。MIPS指令集中和浮点数处理相关的部分被刻意地分离开来。这种分离使得我们可以设计不同程序支持浮点的MIPS处理器,从完全不支持、部分支持到完全支持。所以也把浮点功能放在第7章单独介绍。到此为止,是按照一个合乎逻辑的顺序来使读者获取MIPS方面的知识。但在剩余的章节中将作一些调整,将使它们更像一本参考手册或是一本基于例子的教程。第8章将全面介绍整个MIPS指令系统。目的是详尽地介绍MIPS指令集,但是要比标准MIPS手册要简洁得多。本书只用了十来页篇幅介绍指令集,而在其他书中则需要一百多页来讲述。第9章讲述的是汇编语言编程,其组织结构更像一本编程手册。本章的风格与本书其余章节不同,它的出现是由于一直没有一份合适的MIPS汇编语言手册。任何在汇编级别的编程者,将会看到本书其余部分都有相关内容。第10章面向的读者是熟悉C编程而关心其中MIPS体系结构有影响的部分的,如包括MIPS编译器下的存储器管理和参数传递的执行。第11章是一个帮助提示的列表,来帮助读者在MIPS和其他CPU间移植软件。第12章收集了一些软件的片断,并加入了注释,这些都是根据本书的相关主题精选出来的。理解实际软件也许会很困难,但是如果读者从事MIPS软件项目开发,不管把它看作为一个风格指南,还是看作一个参考列表,此章将会非常有用。附录A(关于指令时序)、附录B(关于汇编语言语法)和附录C(关于目标代码)中包含了很高的技术含量,尽管有许多东西可能不会涉及到,但这些是不能被完全忽略的。在附录D中能看到一些关于MIPS体系结构的一些消息,能了解到MIPS16、MDMX和MIPSV扩展的指令系统。在本书的末尾还能看到相关的术语说明——可以查询专用名词、陌生名词和缩写。风格和限制(styleandlimits)因为每本书都体现了作者的劳动,所以我最好说说本书的优点。因为读者当中有一些学生,所以我想是否要把MIPS的用法和普通用法区分开。但我决定不这么做,除非这样做没有任何代价。我也尽量把书写得具体些,而不那么抽象。我并不关心像TLB之类的术语在更大的范围内有什么含义,但会解释它们在MIPS上下文中的意思。人类有很强的总结能力,我想这一点对于学习者来说不会造成太大的打击。本书至少酝酿了七年,所以并不是一朝一夕写成的。我在1986年开始从事MIPS体系结构方面的工作。在1988年之前,我给一些客户做关于MIPS体系结构方面的培训课程,其中演示的幻灯片就成了本书的一些框架。在1993年,我将它们收集在一起并给IDT公司做了一个软件手册作为MIPS文档包的一部分来出版,但它仅针对IDTR3051系列,略去了许多有趣的细节。在1995到1996年间,本书加入了64位的CPU的内容,并且覆盖了所有看上去相关的内容。MIPS的传奇还在继续,不然,本书只能写给历史学家,MorganKaufmann也将不愿意出版它了。因为撰写和审核本书的过程相当的长,所以我不得不定义了一些合理的止步点。有些宣布得太晚的MIPS技术发展,书中没有涉及,但在出版前更新了附录D来尽量多地反映当今MIPS方面的发展。感谢(acknowledgments)本书中的所有主题都是根据我所从事计算机方面的经验来写的。MikeCole使我对计算机产生了浓厚的兴趣,所以从那时起我就试着效仿他的技巧来筛选一些好的想法。许多人在Whitechapel工作站教过我一些关于计算机结构和硬件设计方面的东西——可能BobNewman和RickFilipkiewicz是让我受益最多的人。我也必须感谢Whitechapel的销售员DaveGravell让我最初接触了MIPS。我对在Algorithmics的工程师同事们(ChrisDearman,RickFilipkiewicz,GeraldOnions,NigelStephens和ChrisShaw)必须致以双倍的感谢,在同他们无数次的探讨、争论和设计中使本书能够跟上时代的竞争。在MorganKaufmann,我也不止耗尽了一个编辑的精力:BruceSpatz在最初鼓励我开始写此书,JenniferMann接管了此事,DenisePenrose帮着出版。还要感谢很多的评论家对于本书的章节花费了大量的时间:IDT(IntegratedDeviceTechnology,Inc.)公司的PhilBourekas,LSILogicCorporation的ThomasDaniel,SGI公司的MikeMurphy和CarnegieMellon大学的DavidNagle。Algorithmics的NigelStephens写了最初版本的第9章的一部分和附录B、附录C中关于汇编语言语法和目标代码部分。在这些部分如果有错误,那全都是我的失误,与他无关。作者
作者简介
Dominic Sweetman属于最后一代希望从底层到上层理解计算机系统的程序员。他丰富的职业生涯开始于编写底层代码,从操作系统的开发到网络再到分布式系统。他是一位在硬件系统、CPU、网络的操作系统方面经验丰富的设计者和开发者,是Whitechael Workstations的发起人之一,于1988年创立了Algoritmics公司,并担任主管。Dominic和他的妻子、两个孩子及三只猫生活在伦敦北部。
目录
第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 LoadLinked 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和NonU(非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 关联加载/条件存储(loadlinked/storeconditional)183
8.4.3 条件拷贝(conditional move)指令184
8.4.4 可能跳转的指令(branchlikely)185
8.4.5 整数乘累加指令(interget multiplyaccumulate)和乘加指令(multiplyadd)186
8.4.6 浮点乘加指令(floatingpoint multiplyadd)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 ATMizerII系统的专用浮点指令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: 低层模块(lowlevel 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
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 LoadLinked 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和NonU(非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 关联加载/条件存储(loadlinked/storeconditional)183
8.4.3 条件拷贝(conditional move)指令184
8.4.4 可能跳转的指令(branchlikely)185
8.4.5 整数乘累加指令(interget multiplyaccumulate)和乘加指令(multiplyadd)186
8.4.6 浮点乘加指令(floatingpoint multiplyadd)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 ATMizerII系统的专用浮点指令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: 低层模块(lowlevel 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
猜您喜欢