目录 1
第1篇 AMDx86-64系统编程 1
第1章 AMDx86-64系统编程概要 2
1.1 内存模型 2
1.1.1 内存寻址 2
1.1.2 存储器组织 4
1.1.3 规范地址形式 4
1.2 存储管理 5
1.2.1 段 5
1.2.2 分页 5
1.2.3 混合分段和分页 6
1.2.4 实寻址 7
1.3 操作模式 8
1.3.1 长模式 8
1.3.2 传统模式 10
1.3.3 系统管理模式 11
1.4 系统寄存器 11
1.5 系统数据结构 13
1.6 中断 14
1.7 附加的系统编程特性 15
1.7.1 硬件多任务 15
1.7.3 软件调试 16
1.7.4 性能监视 16
1.7.2 机器检查 16
第2章 x86和x86-64体系结构的区别 17
2.1 操作模式 17
2.1.1 长模式 17
2.1.2 传统模式 17
2.1.3 系统管理模式 18
2.2 存储器模型 18
2.2.1 存储器寻址 18
2.2.2 页转换 18
2.2.3 分段 19
2.4.2 128位多媒体寄存器 21
2.4.4 指令指针 21
2.4.3 标志寄存器 21
2.4 寄存器 21
2.4.1 通用寄存器 21
2.3 保护检查 21
2.4.5 堆栈指针 22
2.4.6 控制寄存器 22
2.4.7 调试寄存器 22
2.4.8 扩展的特征寄存器(EFER) 22
2.4.9 存储类型范围寄存器(MTRR) 22
2.4.10 其他模型特定的寄存器(MSR) 22
2.5.4 地址计算 23
2.5.2 在64位模式中段超越前缀 23
2.5.3 操作数和结果 23
2.5.1 REX前缀 23
2.5 指令系统 23
2.5.5 引用RSP的指令 24
2.5.6 分支 25
2.5.7 NOP指令 26
2.5.8 单字节INC和DEC指令 27
2.5.9 MOVSXD指令 27
2.5.10 无效指令 27
2.5.11 FXSAVE和FXRSTOR指令 28
2.6 中断和异常 28
2.6.4 IRET指令 29
2.6.3 堆栈切换 29
2.6.2 推入的堆栈帧 29
2.6.1 中断描述符表 29
2.6.5 任务特权寄存器(CR8) 30
2.6.6 新异常条件 30
2.7 硬件任务切换 30
2.8 长模式与传统模式的区别 30
第3章 系统资源 32
3.1 系统控制寄存器 32
3.1.1 CR0寄存器 33
3.1.2 CR2和CR3寄存器 35
3.1.3 CR4寄存器 36
3.1.7 RFLAGS寄存器 39
3.1.6 CR8(任务特权寄存器,TPR) 39
3.1.5 64位模式扩展的控制寄存器 39
3.1.4 CR1和CR5~CR7寄存器 39
3.1.8 扩展的特征启用寄存器(EFER) 42
3.2 模型特定的寄存器 43
3.2.1 系统配置寄存器 44
3.2.2 系统链接寄存器 45
3.2.3 内存类型寄存器 45
3.2.4 调试扩展寄存器 46
3.2.5 性能监视寄存器 46
3.2.6 机器检查寄存器 47
3.3 处理器的特征标识 47
4.1 实模式分段 49
第4章 分段虚拟存储器 49
4.2 虚拟8086模式段 50
4.3 保护模式分段内存模式 50
4.3.1 多段模型 50
4.3.2 平面内存模型 50
4.3.3 64位模式中的段 51
4.4 段数据结构和寄存器 51
4.5 段选择子和寄存器 52
4.5.1 段选择子 52
4.5.2 段寄存器 53
4.5.3 64位模式下的段寄存器 54
4.6.2 全局描述符表寄存器 55
4.6 描述符表 55
4.6.1 全局描述符表 55
4.6.3 局部描述符表 56
4.6.4 局部描述符表寄存器 57
4.6.5 中断描述符表 58
4.6.6 中断描述符表寄存器 59
4.7 传统段描述符 59
4.7.1 描述符格式 59
4.7.2 码段描述符 61
4.7.3 数据段描述符 62
4.7.4 系统描述符 64
4.7.5 门描述符 65
4.8.1 码段描述符 66
4.8 长模式段描述符 66
4.8.2 数据段描述符 67
4.8.3 系统段描述符 68
4.8.4 门描述符 69
4.8.5 长模式描述符小结 71
4.9 段保护概要 72
4.9.1 特权级概念 73
4.9.2 特权级类型 73
4.10 数据访问特权检查 74
4.10.1 访问数据段 74
4.10.2 访问堆栈段 75
4.11.1 直接控制传送 76
4.11 控制传送特权检查 76
4.11.2 控制传送通过调用门 78
4.11.3 返回控制传送 83
4.12 界限检查 84
4.13 类型检查 85
4.13.1 在传统和兼容模式的类型检查 85
4.13.2 长模式类型检查的区别 86
第5章 页转换和保护 88
5.1 页转换概要 88
5.1.4 页尺寸扩展(PSE)位 90
5.1.3 物理地址扩展(PAE)位 90
5.1.2 页转换启用(PG)位 90
5.1.1 页转换选项 90
5.1.5 页目录 91
5.2 传统模式转换 91
5.2.1 CR3寄存器 92
5.2.2 正常(非PAE)分页 92
5.2.3 PAE分页 94
5.3 长模式页转换 97
5.3.1 规范的地址形式 97
5.3.2 CR3 97
5.3.3 4KB页转换 98
5.3.4 2MB页转换 99
5.4 页转换表项字段 101
5.5 转换查找缓冲器(TLB) 104
5.5.1 全局页 104
5.5.2 TLB管理 105
5.6 页保护检查 105
5.6.1 非执行(NX)位 105
5.6.2 用户/管理员(U/S)位 106
5.6.3 读/写(R/W)位 106
5.6.4 写保护(CR0.WP)位 106
5.7 跨越分页层次保护 106
5.8 段保护的作用 108
第6章 系统管理指令 109
6.1 快速系统调用和返回指令 111
6.1.1 SYSCALL和SYSRET 111
6.1.2 SYSENTER和SYSEXIT(只在传统模式) 112
6.1.3 SWAPGS指令 113
6.2 系统状态和控制 113
6.2.1 处理器特征标识符(CPUID) 114
6.2.2 访问控制寄存器 114
6.2.3 访问RFLAGS寄存器 114
6.2.4 访问调试寄存器 114
6.3.1 访问段寄存器 115
6.3.2 访问描述符表寄存器 115
6.2.5 访问模型特定的寄存器 115
6.3 段寄存器和描述符寄存器访问 115
6.4 保护检查 116
6.4.1 检查访问权力 116
6.4.2 检查段界限 116
6.4.3 检查读/写权力 116
6.4.4 调整访问权力 116
6.5 处理器暂停 117
6.6 缓存和TLB管理 117
6.6.1 缓存管理 117
6.6.2 TLB无效 117
第7章 内存系统 118
7.1.2 写顺序 120
7.1 内存访问顺序 120
7.1.1 读顺序 120
7.1.3 读写栅栏 121
7.2 内存一致性和协议 121
7.3 内存类型 124
7.4 缓冲和组合内存写 125
7.4.1 写缓冲 125
7.4.2 写组合 126
7.5 内存检查 127
7.5.1 缓存组织和操作 127
7.5.2 缓存控制机制 128
7.5.3 缓存和内存管理指令 130
7.5.4 串行化指令 131
7.6.1 MTRR类型字段 132
7.6 内存类型范围寄存器 132
7.6.2 MTRR 133
7.6.3 使用MTRR 138
7.6.4 MTRR和页缓存控制 138
7.6.5 多处理器环境中的MTRR 140
7.7 页属性表机制 140
7.7.1 PAT寄存器 140
7.7.2 PAT索引 141
7.7.3 标识PAT支持 142
7.7.4 PAT访问 142
7.7.5 MTRR和PAT的组合影响 142
7.8.1 扩展的固定范围MTRR类型字段编码 143
7.8 内存映射的I/O 143
7.8.2 IORR 145
7.8.3 IORR的重叠 146
7.8.4 内存的顶 146
第8章 异常和中断 148
8.1 概要 148
8.2 通用特性 148
8.3 向量 150
8.3.1 #DE(被零除差错异常-向量0) 152
8.3.2 #DB(调试异步异常-向量1) 153
8.3.5 #OF(溢出异常-向量4) 154
8.3.4 #BP(断点异常向量3) 154
8.3.3 NMI(非屏蔽中断异常-向量2) 154
8.3.6 #BR(边界异常-向量5) 155
8.3.7 #UD(无效操作码异常-向量6) 155
8.3.8 #NM(设备不可用异常-向量7) 156
8.3.9 #DF(双故障异常-向量8) 156
8.3.10 Coprocessor-Segment-Overrun(协处理器段超越异常-向量9) 157
8.3.11 #TS(无效TSS异常-向量10) 157
8.3.12 #NP(段不存在异常-向量11) 158
8.3.13 #SS(堆栈异常-向量12) 159
8.3.14 #GP(通用保护异常-向量13) 159
8.3.16 #MF(x87浮点异常挂起-向量16) 161
8.3.15 #PF(页故障异常-向量14) 161
8.3.17 #AC(对齐检查异常-向量17) 162
8.3.18 #MC(机器检查异常-向量18) 163
8.3.19 #XF(SIMD浮点异常-向量19) 163
8.3.20 用户定义的中断(向量32~255) 164
8.4 任务切换期间的异常 165
8.5 差错码 165
8.5.1 选择子差错码 165
8.5.2 页故障差错码 166
8.6 优先权 166
8.6.1 浮点异常优先权 167
8.6.2 外部的中断优先权 168
8.7 实模式下的中断控制传送 169
8.8 传统保护模式下的中断控制传送 170
8.8.1 定位中断处理程序 171
8.8.2 中断至相同特权级 171
8.8.3 中断至更高特权级 172
8.8.4 特权检查 173
8.8.5 从中断过程返回 175
8.9 虚拟8086模式中断控制传送 175
8.9.1 保护模式处理程序控制传送 176
8.9.2 虚拟8086处理程序控制传送 177
8.10 长模式下的中断控制传送 177
8.10.1 中断门和陷阱门 178
8.10.2 定位中断处理程序 178
8.10.3 中断堆栈 179
8.10.4 中断堆栈表 180
8.10.5 从中断过程返回 181
8.11 虚拟中断 182
8.11.1 虚拟8086模式扩展 182
8.11.2 保护模式虚拟中断 187
8.11.3 修改指令的影响 187
第9章 机器检查机制 189
9.1 确定机器检查机制 189
9.2 机器检查差错 189
9.3 机器检查MSR 190
9.3.1 全局状态和控制寄存器 191
9.3.2 差错报告寄存器体 192
9.3.3 差错码 193
9.4 初始化机器检查机制 195
9.5 使用机器检查特征 196
9.5.1 处理机器检查异常 196
9.5.2 报告可改正的机器检查差错 197
第10章 系统管理模式 198
10.1 SMM资源 198
10.1.1 SMRAM 199
10.1.2 SMBASE寄存器 199
10.1.3 SMRAM状态保存区 200
10.2.1 系统管理中断(SMI) 204
10.2 使用SMM 204
10.1.4 SMM版本标识符 204
10.2.2 SMM操作环境 205
10.2.3 异常和中断 205
10.2.4 使缓存无效 206
10.2.5 保存附加的处理器状态 207
10.2.6 操作在保护模式和长模式 207
10.2.7 自动暂停重启动 207
10.2.8 I/O指令重启动 208
10.3 离开SMM 208
第11章 128位、64位和x87编程 210
11.1 系统软件考虑的概要 210
11.2 确定支持的媒体和x87特征 210
11.4 媒体和处理器状态 211
11.3 启用128位媒体指令 211
11.4.1 128位媒体状态 212
11.4.2 64位媒体状态 212
11.4.3 x87状态 213
11.4.4 保存媒体和x87处理器状态 214
第12章 任务管理 223
12.1 硬件多任务概要 223
12.2 任务管理资源 224
12.2.1 TSS选择子 225
12.2.2 TSS描述符 225
12.2.3 任务寄存器 226
12.2.4 传统任务状态段 227
12.2.5 任务门描述符(只是传统模式) 231
12.3 在传统模式的硬件任务管理 232
12.3.1 任务存储映像 232
12.3.2 任务切换 233
12.3.3 用任务门进行任务切换 234
12.3.4 嵌套任务 235
第13章 调试和性能资源 237
13.1 软件调试资源 237
13.2 断点 243
13.2.1 设置断点 243
13.2.2 使用断点 245
13.2.4 控制传送断点特征 248
13.2.3 断点指令(INT3) 248
13.3 性能优化 249
13.3.1 性能计数器 249
13.3.2 性能事件选择寄存器 250
13.3.3 使用性能计数器 251
第14章 处理器初始化和长模式激活 253
14.1 复位和初始化 253
14.1.1 内置自测试(BIST) 253
14.1.2 时钟倍频选择 254
14.1.3 处理器初始化状态 254
14.2.1 处理器实现信息 256
14.2 硬件配置 256
14.1.5 取第一条指令 256
14.1.4 多处理器初始化 256
14.2.2 启用内部缓存 257
14.2.3 初始化媒体和x87处理器状态 257
14.3 初始化实模式 259
14.4 初始化保护模式 259
14.5 初始化长模式 260
14.6 启用和激活长模式 260
14.6.1 激活长模式 261
14.6.2 一致性检查 262
14.6.3 更新系统描述符表引用 262
14.7 离开长模式 263
14.8 长模式初始化举例 263
14.6.4 重定位页转换表 263
第2篇 Intel Itanium系统编程概要 267
第1章 Intel Itanium系统环境 268
1.1 处理器引导顺序 268
1.2 Intel Itanium系统环境概要 269
第2章 系统状态和编程模型 270
2.1 特权级 270
2.2 顺序化 270
2.2.1 指令顺序化 271
2.2.2 数据顺序化 271
2.3.1 系统状态概要 272
2.3 系统状态 272
2.2.3 正在处理的(in-flight)资源的定义 272
2.3.2 处理器状态寄存器(PSR) 273
2.3.3 控制寄存器 279
2.3.4 全局控制寄存器 281
2.3.5 中断控制寄存器 284
2.3.6 外部中断控制寄存器 289
2.3.7 分体的通用寄存器 289
第3章 基于Itanium操作系统与IA-32应用程序交互模型 291
3.1 指令集转换 291
3.2 系统寄存器模型 291
3.3 IA-32系统段寄存器 293
3.3.2 IA-32系统EFLAG寄存器 295
3.3.1 IA-32当前特权级 295
3.3.3 IA-32系统寄存器 298
3.4 对于IA-32码的寄存器上下文切换指南 302
3.4.1 进入IA-32过程 302
3.4.2 退出IA-32过程 302
3.5 IA-32指令集行为小结 303
3.6 系统内存模型 309
3.6.1 虚拟存储器引用 310
3.6.2 IA-32虚拟内存引用 310
3.6.3 IA-32物理内存引用 311
3.6.4 超级用户访问 311
3.6.6 原子操作 312
3.6.5 内存对齐 312
3.7 I/O端口空间模型 313
3.7.1 虚拟I/O端口寻址 314
3.7.2 物理I/O端口寻址 315
3.7.3 IA-32 IN/OUT指令 316
3.7.4 由装入和存储指令对I/O端口访问 317
3.8 调试模型 317
3.8.1 数据断点寄存器匹配 318
3.8.2 指令断点寄存器匹配 319
3.9 中断模型 319
3.9.1 中断小结 320
3.9.2 IA-32数字异常模型 321
3.10 为支持IA-32应用处理器的总线考虑 322
参考文献 323