第1章RISC和MIPS 1
1.1流水线 1
1.1.1什么使流水线效率降低 3
1.1.2流水线和缓存 3
1.2 MIPS的五段流水线 4
1.3 RISC和CISC 5
1.4迄今为止一些重要的MIPS芯片 6
1.4.1 R2000处理器到R3000处理器 6
1.4.2 R6000处理器:一次偏轨 7
1.4.3第一批CPU内核 8
1.4.4 R4000处理器:一次革命 8
1.4.5 ACE联盟的兴衰 9
1.4.6 SGI收购MIPS 9
1.4.7 QED:嵌入式系统中的快速MIPS处理器 9
1.4.8 R10000处理器和它的后继者 10
1.4.9消费类电子产品中的MIPS处理器 10
1.4.10网络路由器和激光打印机中的MIPS 11
1.4.11现代的MIPS处理器 12
1.4.12 MIPS Technologies的重生 14
1.4.13现状 14
1.5 MIPS和CISC体系结构的比较 16
1.5.1对MIPS指令的各种限制 16
1.5.2编址及内存访问 17
1.5.3 MIPS不支持的特性 18
1.5.4程序员可见的流水线效果 19
第2章MIPS体系结构 21
2.1MIPS汇编语言的风格 23
2.2寄存器 24
2.3整数乘法单元和寄存器 26
2.4加载和存储:寻址方式 27
2.5存储器和寄存器中的数据类型 27
2.5.1整数数据类型 28
2.5.2未对齐的加载和存储 28
2.5.3内存中的浮点数据 29
2.6汇编语言中的合成指令 29
2.7 MIPS I发展到MIPS 64指令集:64位(和其他)的扩展 30
2.7.1迈向64位 31
2.7.2谁需要64位 31
2.7.3关于64位与无模式转换:寄存器中的数据 32
2.8基本地址空间 33
2.8.1简单系统的寻址 35
2.8.2核心与用户特权级别 35
2.8.3整体视图:内存映射的64位视图 35
2.9流水线的可见度 36
第3章 协处理器0.MIPS处理器控制 38
3.1 CPU控制指令 40
3.2相关寄存器与时序 41
3.3 CPU控制寄存器及其编码 42
3.3.1状态寄存器(SR) 42
3.3.2原因寄存器 46
3.3.3异常返回地址(EPC)寄存器 48
3.3.4无效虚地址(BadVaddr)寄存器 48
3.3.5计数/比较寄存器(Count/Compare):CPU上的计时器 48
3.3.6处理器ID(PRId)寄存器 48
3.3.7配置(Config)寄存器:CPU资源信息与配置 49
3.3.8 EBase和IntCtl:中断与异常设置 51
3.3.9 SRSCtl和SRSMap:影子寄存器设置 52
3.3.10链接加载地址(LLAddr)寄存器 53
3.4 CP0冒险——不经意间的陷阱 53
3.4.1冒险屏障指令 54
3.4.2指令冒险与用户冒险 54
3.4.3 CP0指令之间的冒险 55
第4章MIPS处理器的高速缓存 56
4.1高速缓存和高速缓存的管理 56
4.2高速缓存怎样工作 56
4.3早期MIPS CPU中的写透式高速缓存 59
4.4 MIPS CPU中的写回式高速缓存 59
4.5高速缓存设计的其他选择 59
4.6管理高速缓存 60
4.7二级和三级高速缓存 62
4.8 MIPS CPU高速缓存的配置 62
4.9编程MIPS32/64高速缓存 63
4.9.1 Cache指令 64
4.9.2高速缓存初始化和Tag/Data寄存器 66
4.9.3 CacheErr, ERR和ErrorEPC寄存器:内存/高速缓存的错误处理 66
4.9.4计算高速缓存大小和配置方式 67
4.9.5初始化例程 67
4.9.6在高速缓存中无效或写回一个内存区域 68
4.10高速缓存效率 69
4.11重组软件来影响高速缓存效率 70
4.12高速缓存别名 71
第5章 异常、中断和初始化 74
5.1精确异常 75
5.2异常发生时刻 76
5.3异常向量:异常处理开始的地方 77
5.4异常处理:基础 79
5.5从异常返回 79
5.6嵌套异常 80
5.7一个异常处理例程 80
5.8中断 80
5.8.1 MIPS CPU中的中断资源 81
5.8.2通过软件实现中断优先级 82
5.8.3原子性和SR的原子改变 83
5.8.4中断使能时的临界区:MIPS中的信号量机制 84
5.8.5 MIPS32/64中向量化和EIC中断 86
5.8.6影子寄存器 86
5.9启动 86
5.9.1探测和识别CPU型号 88
5.9.2启动序列 89
5.9.3启动一个应用程序 89
5.10模拟指令 89
第6章 底层内存管理与TLB 91
6.1 TLB/MMU硬件和它的功能 91
6.2 TLB/MMU的寄存器描述 92
6.2.1 TLB关键字域——EntryHi和PageMask 92
6.2.2 TLB输出域——EntryLo0-1 94
6.2.3选择一个TLB表项——Index,Random和Wired寄存器 95
6.2.4页表访问助手——Context和XContext 95
6.3 TLB/MMU的控制指令 97
6.4对TLB编程 97
6.4.1如何进行重填 98
6.4.2使用ASID 98
6.4.3 Random寄存器与被锁定表项 99
6.5硬件友好的页表和重填机制 99
6.5.1 TLB缺失处理 100
6.5.2 XTLB的缺失处理函数 101
6.6 MIPS TLB的日常使用 102
6.7更简单操作系统中的内存管理 102
第7章 浮点支持 104
7.1浮点的基本描述 104
7.2 IEEE 754标准及其背景 104
7.3怎样存储IEEE浮点数 106
7.3.1 IEEE尾数和规格化 106
7.3.2使用特殊值时的预留指数值 107
7.3.3 MIPS浮点数据格式 107
7.4 IEEE 754的MIPS实现 108
7.5浮点寄存器 109
7.6浮点异常/中断 110
7.7浮点控制:控制/状态寄存器 110
7.8浮点实现寄存器 113
7.9浮点指令指南 114
7.9.1加载/存储 114
7.9.2寄存器间的传递 115
7.9.3三操作数算术运算 116
7.9.4乘加运算 116
7.9.5一元(改变符号)运算 116
7.9.6转换操作 117
7.9.7条件分支和测试指令 117
7.10成对单精度浮点指令和MIPS-3DASE 119
7.10.1成对单精度指令的异常 119
7.10.2成对单精度的三操作数算术、乘加、改变符号和无条件移动操作 119
7.10.3成对单精度转换操作 119
7.10.4成对单精度测试和条件移动指令 120
7.10.5 MIPS-3D指令 121
7.11指令时序需求 122
7.12指令加速的时序 123
7.13按需初始化和使能 123
7.14浮点仿真 124
第8章MIPS指令集完全指南 125
8.1一个简单的例子 125
8.2汇编指令及其含义 126
8.2.1 U和非U助记符 127
8.2.2除法助记符 128
8.2.3指令的详细清单 128
8.3浮点指令 145
8.4 MIPS32/64发行版1的区别 150
8.4.1在发行版2中加入的常规指令 150
8.4.2发行版2新加入的特权指令 151
8.5特殊指令和它们的用途 151
8.5.1向左加载/向右加载:地址非对齐的存取操作 151
8.5.2链接加载/条件存储 155
8.5.3条件传递指令 156
8.5.4可能分支指令 157
8.5.5整数乘累加指令和乘加指令 157
8.5.6浮点乘加指令 158
8.5.7多浮点条件标志位 158
8.5.8缓存数据预取 159
8.5.9存取内存屏障:Sync指令 159
8.5.10冒险屏蔽指令 160
8.5.11 Synci:指令写入的缓存管理 161
8.5.12读取硬件寄存器 161
8.6指令的机器编码 162
8.6.1指令编码表中的域 162
8.6.2指令编码表的注意事项 163
8.6.3编码方式和处理器的简单实现 163
8.7指令集的功能分组 180
8.7.1空操作 180
8.7.2寄存器间的数据传递指令 180
8.7.3常数加载指令 181
8.7.4算术/逻辑操作指令 181
8.7.5整数乘法、除法以及求余指令 182
8.7.6整数乘累加指令 183
8.7.7存取指令 184
8.7.8跳转、分支和子程序调用指令 185
8.7.9断点及陷阱指令 186
8.7.10协处理器0功能 186
8.7.11浮点操作指令 187
8.7.12用户模式下对“底层”硬件的有限访问 187
第9章 阅读MIPS汇编语言 188
9.1一个简单的例子 188
9.2句法 191
9.3指令的约定 192
9.3.1计算指令:3寄存器、2寄存器和1寄存器 192
9.3.2立即数:带常量的计算指令 192
9.3.3关于64位和32位指令 193
9.4寻址模式 193
9.5目标文件和内存布局 195
第10章在MIPS体系结构上移植软件 198
10.1 MIPS应用的底层软件:经常会遇到问题的列表 198
10.2尾端:字、字节和位的顺序 199
10.2.1位、字节、字和整数 199
10.2.2软件和尾端 201
10.2.3硬件和尾端 203
10.2.4 MIPS CPU的双尾端软件 206
10.2.5可移植性和尾端无关代码 207
10.2.6尾端和外来数据 208
10.3可见缓存的问题 208
10.3.1缓存管理和DMA数据 210
10.3.2缓存管理和写指令:自修改代码 210
10.3.3缓存管理和非缓存或写透数据 211
10.3.4缓存别名和页面着色 211
10.4存储访问顺序和重排 211
10.4.1排序与写缓冲 213
10.4.2实现wbflush 213
10.5写C程序 214
10.5.1用GNU C编译器包装汇编代码 214
10.5.2映射为内存的I/O寄存器和“Volatile 215
10.5.3用C写MIPS应用程序的其他问题 216
第11章MIPS软件标准(ABI) 218
11.1数据表示和对齐 218
11.1.1基本类型的大小 219
11.1.2 “long”型和指针型数据大小 219
11.1.3对齐要求 219
11.1.4基本类型的内存布局和尾端如何产生影响 219
11.1.5内存的布局结构、数组类型和对齐 220
11.1.6结构中的位域 221
11.1.7 C中的不对齐数据 223
11.2参数传递以及MIPS ABI中的堆栈约定 223
11.2.1堆栈、子例程链接和参数传递 223
11.2.2 o32的堆栈参数结构 224
11.2.3使用寄存器传递参数 224
11.2.4 C库中的例子 225
11.2.5特殊的例子:传递结构 226
11.2.6传递可变参数 226
11.2.7函数返回值 227
11.2.8扩展寄存器-使用约定:SGIn32和n64 227
11.2.9堆栈布局、堆栈帧和辅助调试器 230
11.2.10可变参数和stdargs 235
第12章 调试MIPS设计——调试和剖析特性 236
12.1 “EJTAG”片上调试单元 237
12.1.1 EJTAG历史 238
12.1.2探头如何控制CPU 238
12.1.3通过JTAG调试通信 239
12.1.4调试模式 239
12.1.5单步 240
12.1.6 dseg内存译码区域 240
12.1.7 EJTAG CP0寄存器,特殊调试 242
12.1.8 DCR(调试控制)内存映射寄存器 244
12.1.9 EJTAG断点硬件支持 244
12.1.10理解断点条件 246
12.1.11非精确调试断点 247
12.1.12 PC取样与EJTAG 247
12.1.13使用没有探头的EJTAG 247
12.2 EJTAG之前的调试支持——break指令和CP0观察点 248
12.3 PDtrace 249
12.4性能计数器 249
第13章GNU/Linux概览 251
13.1组件 251
13.2内核代码的层次 254
13.2.1异常模式下的MIPS CPU 254
13.2.2屏蔽部分或全部中断的MIPS CPU 254
13.2.3中断上下文 255
13.2.4线程上下文中执行内核 255
第14章 硬件与软件如何协同工作 256
14.1中断的生命周期 256
14.2线程、临界区和原子性 258
14.2.1 MIPS体系结构和原子操作 259
14.2.2 Linux自旋锁 260
14.3系统调用时发生了什么 260
14.4 Linux/MIPS系统如何进行地址翻译 262
14.4.1为什么进行内存翻译 263
14.4.2基本进程布局与保护 265
14.4.3映射进程地址到真实内存 265
14.4.4选择页式映射 266
14.4.5我们真正需要的 266
14.4.6 MIPS设计的起源 268
14.4.7记录被修改的页面(模拟“脏”位) 270
14.4.8内核如何服务一个TLB重填异常 270
14.4.9 TLB的注意事项与维护 273
14.4.10内存翻译与64位指针 273
第15章Linux内核中的MIPS特有问题 275
15.1显式缓存管理 275
15.1.1 DMA设备访问 275
15.1.2写入指令稍后执行 276
15.1.3缓存/内存映射问题 276
15.1.4缓存别名 277
15.2 CP0流水线冒险 277
15.3多处理器系统与一致性缓存 278
15.4对一个关键例程的极度优化调整 280
第16章Linux应用程序代码、PIC和库 82
16.1链接单元如何进入程序 283
16.2全局偏移表(GOT)组织 283
附录A MIPS多线程 286
附录B MIPS指令集的其他可选扩展 292
MIPS术语表 296
参考文献 324