第1章 引言1
1.1 符号约定1
1.1.1 位与字节顺序1
1.1.2 保留位与软件兼容性1
1.1.3 十六进制与二进制数2
1.1.4 分段的寻址2
1.1.5 对CPUID、CR和MSR值的新句法3
1.1.6 异常3
1.2 Intel 64和IA-32体系结构的简要历史4
1.2.1 16位处理器与分段4
1.2.2 Intel 286处理器4
1.2.3 Intel 386处理器4
1.2.4 Intel 486处理器4
1.2.5 Intel Pentium(奔腾)处理器5
1.2.6 处理器的P6族(系列)5
1.2.7 Intel Pentium 4处理器系列6
1.2.8 Intel Xeon 处理器6
1.2.9 Intel Pentium M处理器6
1.2.10 Intel Pentium处理器极品版6
1.2.11 Intel Core Duo和Intel Core Solo处理器7
1.2.12 Intel Xeon 处理器5100系列和
Intel Core 2处理器系列7
1.3 更多的关于特定的先进技术8
1.3.1 P6族微体系结构8
1.3.2 Intel NetBurst 微体系结构9
1.3.3 Intel Core 微体系结构11
1.3.4 SIMD指令13
1.3.5 超线程技术14 1.3.6 多核技术15
1.3.7 Intel 64 体系结构16
1.3.8 Intel虚拟化技术17
第2章 基本执行环境18
2.1 操作方式18
2.1.1 Intel 64 体系结构18
2.1.2 x86-64的操作方式19
2.2 基本执行环境概要21
2.2.1 64 位方式执行环境22
2.3 内存组织24
2.3.1 IA-32方式25
2.3.2 分页和虚拟存储器26
2.3.3 64位方式的内存组织26
2.3.4 操作方式与内存模型26
2.3.5 32位和16位地址与操作数尺寸26
2.3.6 在保护方式扩展的物理寻址27
2.3.7 在64位方式的地址计算27
2.4 基本程序执行寄存器28
2.4.1 通用寄存器28
2.4.2 段寄存器30
2.4.3 EFLAGS寄存器32
2.5 指令指针35
2.6 操作数尺寸和地址尺寸属性35
2.7 操作数寻址36
2.7.1 立即数37
2.7.2 寄存器操作数37
2.7.3 存储器操作数38
2.7.4 规定段选择子38
2.7.5 规定偏移量39
2.7.6 汇编程序和编译器寻址方式40
2.7.7 I/O端口寻址40
第3章 数据类型41
3.1 基本数据类型41
3.2 数字数据类型42
3.2.1 整数42
3.2.2 浮点数据类型43
3.3 指针数据类型45
3.4 位字段数据类型46
3.5 串数据类型46
3.6 组合的SIMD数据类型47
3.6.1 64位SIMD组合的数据类型47
3.6.2 128位组合的SIMD数据类型47
3.7 BCD和组合的BCD整数48
3.8 实数和浮点格式49
3.8.1 实数系统49
3.8.2 浮点格式49
3.8.3 实数和非数字编码51
3.8.4 舍入54
3.9 浮点异常概要55
3.9.1 浮点异常条件56
3.9.2 浮点异常优先权59
3.9.3 浮点异常处理程序的典型动作60
第4章 Intel 64 (AMD x86-64)和IA-32系统体系结构概要61
4.1 系统级体系结构概要62
4.1.1 全局和局部描述符表62
4.1.2 系统段、段描述符和门64
4.1.3 任务状态段和任务门64
4.1.4 中断和异常处理65
4.1.5 存储管理65
4.1.6 系统寄存器66
4.1.7 其他系统资源66
4.2 操作方式67
4.3 在EFLAGS寄存器中的系统标志和字段68
4.4 存储管理寄存器70
4.4.1 全局描述符表寄存器(GDTR) 70
4.4.2 局部描述符表寄存器(LDTR) 70
4.4.3 中断描述符表寄存器(IDTR) 70
4.4.4 任务寄存器(TR) 71
4.5 控制寄存器71
4.6 系统指令概要75
4.6.1 装入和存储系统寄存器77
4.6.2 验证访问权77
4.6.3 装入和存储调试寄存器77
4.6.4 无效缓存和TLB78
4.6.5 控制处理器78
4.6.6 读性能监视和时戳计数器78
4.6.7 读和写模型特定寄存器79
第5章 保护方式存储管理80
5.1 存储管理概要80
5.2 使用分段81
5.2.1 基本平面模型81
5.2.2 保护的平面模型 82
5.2.3 多段模型82
5.2.4 在IA-32e方式中的分段83
5.2.5 分页和段83
5.3 物理地址空间84
5.4 逻辑和线性地址84
5.4.1 在IA-32e方式中逻辑地址的转换85
5.4.2 段选择子85
5.4.3 段寄存器85
5.4.4 在IA-32e方式中的段装入指令86
5.4.5 段描述符87
5.5 系统描述符类型90
5.5.1 段描述符表91
5.5.2 在IA-32e方式中的段描述符表92
5.6 分页(虚拟存储器)概要93
5.6.1 分页选项93
5.6.2 页表和页目录94
5.7 使用32位物理寻址的页转换94
5.7.1 线性地址转换(4KB页)94
5.7.2 线性地址转换(4MB页)95
5.7.3 混合4KB和4MB页96
5.7.4 内存混合96
5.7.5 页目录的基地址96
5.7.6 页目录和页表项96
5.7.7 页目录和页项不存在99
5.8 使用PAE分页机制的36位物理寻址99
5.8.1 增强的传统PAE分页 100
5.8.2 具有PAE启用的(4KB页)的线性地址转换100
5.8.3 具有PAE启用的(2MB页)的线性地址转换101
5.8.4 访问具有扩展的页表结构的全扩展物理地址空间101
5.8.5 具有扩展的地址启用的页目录和页表102
5.9 使用PSE-36分页机制的36位物理寻址103
5.10 在IA-32e方式中PAE启用的分页104
5.10.1 IA-32e方式线性地址转换(4KB页)105
5.10.2 IA-32e方式线性地址转换(2MB页)106
5.10.3 增强的分页数据结构106
5.11 映射段至页109
5.12 转换查找缓冲器110
5.13 输入输出111
5.13.1 I/O端口寻址111
5.13.2 I/O端口硬件111
5.13.3 I/O地址空间111
5.13.4 I/O指令112
5.13.5 保护方式I/O113
5.13.6 顺序I/O114
第6章 内存缓存控制116
6.1 内部缓存、TLB和缓冲器116
6.2 缓存的术语119
6.3 缓存可用的方法120
6.3.1 写组合内存单元的缓冲121
6.3.2 选择内存类型122
6.3.3 在不可缓存的内存中取代码123
6.4 缓存控制协议123
6.5 缓存控制123
6.5.1 缓存控制寄存器和位124
6.5.2 缓存控制的优先级126
6.5.3 阻止缓存127
6.5.4 禁止和启用L3缓存128
6.5.5 缓存管理指令128
6.5.6 L1数据缓存环境方式129
6.6 自修改代码129
6.7 隐含的缓存(Pentium 4、Intel Xeon和P6族处理器)129
6.8 显式缓存130
6.9 无效转换查找缓冲器130
6.10 存储缓冲器131
6.11 内存类型范围寄存器131
6.11.1 MTRR特性标识132
6.11.2 用MTRR设置内存范围133
6.11.3 基地址和屏蔽计算举例136
6.11.4 范围尺寸和对齐要求137
6.11.5 MTRR初始化138
6.11.6 重新映射内存类型138
6.11.7 MTRR维护编程接口138
6.11.8 在MP系统中MTRR考虑141
6.11.9 大页尺寸考虑142
6.12 页属性表(PAT) 142
6.12.1 检测对PAT特性的支持143
6.12.2 IA32_CR_PAT MSR143
6.12.3 从PAT选择一内存类型144
6.12.4 编码PAT144
第7章 保护146
7.1 启用与禁止段和页保护146
7.2 段级和页级保护所用的字段与标志147
7.3 界限检查149
7.4 类型检查150
7.5 特权级151
7.6 当访问数据段时的特权级检查152
7.7 当装入SS寄存器时的特权级检查154
7.8 在码段之间传送程序控制的特权级检查154
7.8.1 直接调用或跳转至码段154
7.8.2 门描述符156
7.8.3 调用门156
7.8.4 通过调用门访问码段158
7.8.5 堆栈切换160
7.8.6 从被调用过程返回162
7.8.7 用SYSENTER和SYSEXIT指令执行快速调用至系统过程162
7.8.8 在64位方式中快速系统调用164
7.9 特权指令165
7.10 指针确认166
7.10.1 访问权检查(LAR指令)166
7.10.2 检查读写权限(VERR和VERW指令)166
7.10.3 检查偏移量在界限内(LSL指令)167
7.10.4 调整调用者的访问权(ARPL指令)167
7.10.5 检查对齐169
7.11 页级保护169
7.11.1 页保护标志169
7.11.2 限制可寻址的域169
7.11.3 页类型169
7.11.4 组合页表的两级保护170
7.11.5 超越页保护171
7.12 组合页与段保护171
7.13 页级保护与执行禁止位171
7.13.1 检测与启用执行禁止位功能172
7.13.2 执行禁止位页保护172
7.13.3 保留位检查173
7.13.4 异常处理174
第8章 中断和异常处理175
8.1 中断和异常概要175
8.2 异常和中断向量175
8.3 中断源177
8.3.1 外部中断177
8.3.2 可屏蔽的硬件中断177
8.3.3 软件生成的中断177
8.4 异常的源178
8.4.1 程序差错异常178
8.4.2 软件生成的中断178
8.4.3 机器检查异常178
8.5 异常分类178
8.6 程序或任务重启动179
8.7 非屏蔽中断180
8.8 启用与禁止中断180
8.8.1 屏蔽可屏蔽的硬件中断180
8.8.2 屏蔽指令断点181
8.8.3 屏蔽当切换堆栈时的异常和中断181
8.9 在同时发生中断和异常之间的优先级181
8.10 中断描述符表(IDT) 182
8.11 IDT描述符183
8.12 异常和中断处理184
8.12.1 异常或中断处理程序过程185
8.12.2 中断任务187
8.13 出错码188
8.14 在64位方式中的异常和中断处理188
8.14.1 64位方式IDT189
8.14.2 64位方式堆栈帧190
8.14.3 在IA-32e方式中的IRET190
8.14.4 在IA-32e方式中的堆栈切换190
8.14.5 中断堆栈表191
8.15 异常和中断引用191
8.15.1 中断0--除法错误异常(#DE) 192
8.15.2 中断1--调试异常(#DB) 192
8.15.3 中断2--NMI中断193
8.15.4 中断3--断点异常(#BP) 193
8.15.5 中断4--溢出异常(#OF) 194
8.15.6 中断5--BOUND范围超出异常(#BR) 194
8.15.7 中断6--无效操作码异常(#UD) 194
8.15.8 中断7--设备不可用异常(#NM) 195
8.15.9 中断8--双故障异常(#DF) 196
8.15.10 中断9--协处理器段超出198
8.15.11 中断10--无效异常(#TS) 198
8.15.12 中断11--段不存在(#NP) 201
8.15.13 中断12--堆栈故障异常(#SS) 202
8.15.14 中断13--通用保护异常202
8.15.15 中断14--页故障异常204
8.15.16 中断15--x87 FPU浮点出错(#MF) 207
8.15.17 中断16--对齐检查异常(#AC) 208
8.15.18 中断17--机器检查异常处理程序(#MC) 209
8.15.19 中断18--SIMD浮点异常(#XF) 210
8.15.20 中断32~255--用户定义的中断211
第9章 指令集小结213
9.1 通用指令214
9.1.1 数据传送指令214
9.1.2 二进制算术运算指令221
9.1.3 十进制算术运算指令225
9.1.4 逻辑指令227
9.1.5 移位和旋转指令228
9.1.6 位和字节指令230
9.1.7 控制传送指令233
9.1.8 串指令243
9.1.9 I/O指令247
9.1.10 进入和离开指令249
9.1.11 标志控制指令250
9.1.12 段寄存器指令254
9.1.13 杂项指令254
9.2 x87 FPU指令256
9.2.1 x87 FPU数据传送指令256
9.2.2 x87 FPU基本算术运算指令260
9.2.3 x87 FPU比较指令270
9.2.4 x87 FPU超越指令273
9.2.5 x87 FPU装入常数指令278
9.2.6 x87 FPU控制指令278
9.3 x87 FPU和SIMD状态管理指令282
9.4 MMX指令288
9.4.1 MMX数据传送指令288
9.4.2 MMX转换指令289
9.4.3 MMX组合的算术运算指令291
9.4.4 MMX比较指令295
9.4.5 MMX逻辑指令295
9.4.6 MMX移位和旋转指令296
9.4.7 MMX状态管理指令298
9.5 SSE指令298
9.5.1 SSE SIMD单精度浮点指令298
9.5.2 SSE MXCSR状态管理指令310
9.5.3 SSE 64位SIMD整数指令311
9.5.4 SSE缓存控制、预取和指令按序指令314
9.6 SSE2指令316
9.6.1 SSE2组合的和标量双精度浮点指令317
9.6.2 SSE2组合的单精度浮点指令329
9.6.3 SSE2 128位SIMD整数指令330
9.6.4 SSE2缓存控制指令和按序指令333
9.7 SSE3指令336
9.7.1 SSE3 x87 FPU整数转换指令336
9.7.2 SSE3特定的128位未对齐的数据装入指令337
9.7.3 SSE3 SIMD浮点组合的加/减指令337
9.7.4 SSE3 SIMD浮点水平加/减指令338
9.7.5 SSE3 SIMD浮点装入/传送/复制指令341
9.7.6 SSE3代理同步指令342
9.8 补充的流扩展3指令344
9.8.1 水平加减指令344
9.8.2 组合的绝对值345
9.8.3 乘和加组合的符号的和无符号的字节345
9.8.4 用舍入和伸缩组合地乘高345
9.8.5 组合地抽取字节346
9.8.6 组合的符号346
9.8.7 组合的右对齐346
9.9 系统指令347
9.10 64位方式指令360
第10章 用x87 FPU编程363
10.1 x87 FPU执行环境363
10.1.1 在64位方式和兼容方式中的x87 FPU364
10.1.2 x87 FPU数据寄存器364
10.1.3 x87 FPU状态寄存器365
10.1.4 条件分支和条件传送367
10.1.5 x87 FPU控制字368
10.1.6 无穷大控制标志369
10.1.7 x87 FPU标记字369
10.1.8 x87 FPU指令和数据指针370
10.1.9 最后的指令操作码370
10.1.10 用FSTENV/FNSTENV和FSAVE/FNSAVE
保存x87 FPU的状态371
10.1.11 用FXSAVE保存x87 FPU的状态372
10.2 x87 FPU数据类型372
10.2.1 不确定373
10.2.2 不支持的扩展双精度浮点编码和伪非规格化373
10.3 x87 FPU指令集374
10.3.1 换码指令375
10.3.2 x87 FPU指令操作数375
10.3.3 数据传送指令375
10.3.4 装入常数指令376
10.3.5 基本算术运算指令376
10.3.6 比较和分类指令378
10.3.7 三角函数指令379
10.3.8 π380
10.3.9 对数、指数和伸缩381
10.3.10 超越指令精度381
10.3.11 x87 FPU控制指令381
10.3.12 等待的与非等待的指令382
10.3.13 不支持的x87 FPU指令382
10.4 x87 FPU浮点异常处理383
10.4.1 算术与非算术指令383
10.5 x87 FPU浮点异常条件384
10.5.1 无效操作异常384
10.5.2 非规格化操作数异常(#D) 386
10.5.3 被零除异常(#Z) 386
10.5.4 数字溢出异常(#O) 386
10.5.5 数字下溢异常(#U) 387
10.5.6 不精确结果(精度)异常(#P) 388
10.6 x87 FPU异常同步388
10.7 用软件处理x87 FPU异常389
10.7.1 本身方式389
10.7.2 MS-DOS兼容子方式390
10.7.3 用软件处理x87 FPU异常390
10.8 8087程序设计举例391
第11章 64位和128位媒体与科学编程419
11.1 概要420
11.2 能力420
11.2.1 并行操作421
11.2.2 数据转换和重组422
11.2.3 矩阵运算425
11.2.4 饱和426
11.2.5 分支删除426
11.2.6 浮点向量运算427
11.3 MMX技术、SSE和SSE2编程环境428
11.3.1 在64位方式和兼容方式中的SSE428
11.3.2 MMX寄存器429
11.3.3 XMM寄存器429
11.3.4 MXCSR控制和状态寄存器430
11.3.5 SSE扩展与SSE2/SSE3/MMX和x87 FPU的兼容性433
11.3.6 其他寄存器433
11.3.7 rFLAGS 寄存器433
11.4 操作数433
11.4.1 数据类型434
11.4.2 操作数尺寸和超越436
11.4.3 操作数寻址436
11.4.4 数据对齐436
11.4.5 整型数据类型437
11.4.6 64位媒体浮点数据类型438
11.4.7 128位媒体浮点数据类型439
11.4.8 浮点数表示440
11.4.9 浮点数编码442
11.4.10 浮点舍入444
11.5 指令摘要--整型指令444
11.5.1 语法445
11.5.2 退出媒体状态446
11.5.3 数据传送446
11.5.4 数据转换450
11.5.5 数据重组450
11.5.6 算术运算454
11.5.7 移位459
11.5.8 比较460
11.5.9 逻辑指令462
11.5.10 保存和恢复状态462
11.6 指令摘要--浮点指令463
11.6.1 语法463
11.6.2 数据转换463
11.6.3 数据传送465
11.6.4 数据重组467
11.6.5 算术运算469
11.6.6 比较473
11.6.7 128位媒体逻辑指令475
11.6.8 存储顺序指令475
11.6.9 PAUSE指令476
11.7 指令对标志的影响476
11.8 指令前缀476
11.8.1 支持的前缀476
11.8.2 特殊使用和保留的前缀477
11.8.3 引起异常的前缀477
11.9 特征检测477
11.10 异常477
11.10.1 通用异常478
11.10.2 x87 浮点异常(#MF)479
11.10.3 128位媒体指令引起的SIMD 浮点异常479
11.10.4 生成SIMD浮点异常482
11.10.5 SIMD异常处理482
11.10.6 SIMD浮点异常优先级483
11.10.7 SIMD和x87 FPU浮点异常的交互作用485
11.11 在执行64位媒体指令上采取的动作485
11.12 混合媒体码和x87码486
11.12.1 混合代码486
11.12.2 清MMX䦛Euclid SymboldCp状态487
11.13 状态保存487
11.13.1 状态保存和恢复487
11.13.2 状态保存指令487
11.13.3 参数传递488
11.13.4 在MMX寄存器中访问操作数488
11.14 性能考虑488
11.14.1 用小的操作数尺寸488
11.14.2 为并行操作重组织数据489
11.14.3 删除分支489
11.14.4 用流存储489
11.14.5 对齐数据489
11.14.6 为可缓存性组织数据489
11.14.7 预取数据489
11.14.8 为传送数据用128位媒体码490
11.14.9 保留中间结果至MMX或XMM寄存器中490
11.14.10 用128位媒体码替换GPR码490
11.14.11 用128位媒体码替换x87码490
11.15 用SSE/SSE2扩展的应用程序490
11.15.1 使用SSE/SSE2扩展的通用指南490
11.15.2 检查对SSE/SSE2的支持491
11.15.3 检查在MXCSR寄存器中的DAZ标志491
11.15.4 SSE/SSE2扩展的初始化491
11.15.5 保存和恢复SSE/SSE2状态492
11.15.6 写MXCSR寄存器的指南492
11.15.7 SSE/SSE2指令与x87 FPU和MMX指令的交互作用493
11.15.8 SIMD和x87 FPU浮点数据类型的兼容性493
11.15.9 混合组合的和标量浮点与128位SIMD整数指令与数据493
11.15.10 与SSE/SSE2过程和函数的接口494
11.15.11 用128位SIMD整数指令更新已存在的MMX技术例程495
11.15.12 在算术运算上的分支495
11.15.13 线索指令的可缓存性495
11.15.14 指令前缀对SSE/SSE2指令的影响496
11.16 应用举例: 基于MMX/SSE/SSE2的H.264解码器关键算法优化497
11.16.1 H.264解码器关键算法优化497
11.16.2 性能测试结果500
11.16.3 结论501
第12章 用SSE3和追加的SSE3编程502
12.1 SSE3/SSSE3编程环境和数据类型502
12.1.1 SSE3/SSSE3在64位方式和兼容方式中502
12.1.2 SSE3/SSSE3与MMX技术、x87 FPU环境
和SSE/SSE2扩展的兼容性502
12.1.3 水平的和不对称的处理502
12.2 SSE3指令的概要503
12.3 SSE3指令503
12.3.1 x87 FPU整数转换的指令503
12.3.2 特殊的128位未对齐数据装入的SIMD整数指令504
12.3.3 增强LOAD/MOVE/DUPLICATE性能的SIMD浮点指令504
12.3.4 提供组合的加/减的SIMD浮点指令504
12.3.5 提供水平加/减的SIMD浮点指令505
12.3.6 两条线程同步指令505
12.4 用SSE3扩展写应用程序506
12.4.1 使用SSE3扩展的指南506
12.4.2 检查对SSE3的支持506
12.4.3 对于SIMD浮点计算启用FTZ和DAZ506
12.4.4 与SSE/SSE2扩展编程SSE3506
12.5 SSSE3指令概要507
12.6 SSSE3指令507
12.6.1 水平加/减507
12.6.2 组合的绝对值508
12.6.3 乘和加组合的符号和无符号字节508
12.6.4 组合的乘高与舍入和比例508
12.6.5 组合的搅乱字节508
12.6.6 组合的符号509
12.6.7 组合的右对齐509
12.7 用SSSE3扩展写应用程序509
12.7.1 使用SSSE3扩展的指南509
12.7.2 检查对SSSE3的支持509
12.8 SSE3/SSSE3异常509
12.8.1 设备不可用异常509
12.8.2 数字出错标志和IGNNE#510
12.8.3 仿真510
第13章 任务管理511
13.1 任务管理概要511
13.1.1 任务结构511
13.1.2 任务状态511
13.1.3 执行任务512
13.2 任务管理数据结构513
13.2.1 任务状态段513
13.2.2 TSS描述符515
13.2.3 在64位方式中的TSS描述符516
13.2.4 任务寄存器516
13.2.5 任务门描述符517
13.3 任务切换518
13.4 任务链接521
13.4.1 使用忙标志以防止递归的任务切换522
13.4.2 修改任务链接522
13.5 任务地址空间522
13.5.1 映射任务至线性和物理地址空间523
13.5.2 任务线性地址空间523
13.6 16位任务状态段524
13.7 在64位方式中的任务管理525
第14章 调试与性能监视527
14.1 调试支持设施的概要527
14.2 调试寄存器528
14.2.1 调试地址寄存器(DR0~DR3) 529
14.2.2 调试寄存器DR4、DR5529
14.2.3 调试状态寄存器(DR6) 529
14.2.4 调试控制寄存器(DR7) 530
14.2.5 断点字段识别531
14.2.6 调试寄存器和Intel 64处理器532
14.3 调试异常532
14.3.1 调试异常(#DB) --中断向量1532
14.3.2 断点异常(#BP) --中断向量3535
14.4 最后分支记录概要535
14.5 最后分支、中断和异常记录(Intel Core 2 Duo处理器族)535
14.5.1 IA32_DEBUGCTL MSR535
14.5.2 BTS和相关的设施537
14.6 最后分支、中断和异常记录(基于Intel NetBurst微体系结构处理器)538
14.6.1 CPL确定的最后分支记录机制539
14.6.2 MSR_DEBUGCTLA MSR540
14.6.3 LBR堆栈541
14.6.4 监视的分支、异常和中断542
14.6.5 在分支、异常和中断上单步542
14.6.6 分支追踪消息543
14.6.7 最后异常记录543
14.6.8 分支踪迹存储543
14.7 最后分支、中断和异常记录(Intel Core Solo和Intel Core Duo处理器)546
14.8 最后分支、中断和异常(Pentium M处理器)547
14.9 最后分支、中断和异常记录(P6族处理器)548
14.9.1 DEBUGCTLMSR寄存器549
14.9.2 最后分支和最后异常MSR549
14.9.3 监视的分支、异常和中断550
14.10 时戳计数器550
14.11 性能监视概要551
14.12 体系结构的性能监视552
14.12.1 体系结构性能监视版本1552
14.12.2 体系结构性能监视版本2554
14.12.3 预定义的体系结构性能事件556
14.13 性能监视(Intel Core Solo和Intel Core Duo处理器)558
14.14 性能监视(基于Intel Core微体系结构处理器)559
14.14.1 固定功能性能计数器560
14.14.2 全局计数器控制设施560
14.14.3 在撤出点的事件562
14.14.4 基于采样的精确事件562
14.15 性能监视(基于Intel NetBurst微体系结构的处理器)564
14.15.1 ESCR MSR568
14.15.2 性能计数器569
14.15.3 CCCR MSR570
14.15.4 调试存储机制571
14.15.5 DS保存区域571
14.15.6 为非撤出事件编程性能计数器575
14.15.7 在撤出时计数580
14.15.8 基于采样的精确事件582
14.15.9 操作系统暗示583
14.16 性能监视和超线程技术583
14.16.1 ESCR MSR584
14.16.2 CCCR MSR584
14.16.3 IA32_PEBS_ENABLE MSR586
14.16.4 性能监视事件586
14.17 计数时钟587
14.17.1 非暂停的时钟滴答588
14.17.2 非睡眠时钟滴答588
14.17.3 增量时戳计数器589
14.17.4 未暂停的基准时钟滴答589
14.17.5 周期计数和机会主义的处理器操作589
14.18 性能监视和双核技术590
14.19 在64位具有8MB L3缓存的Intel Xeon处理器MP上的性能监视590
14.20 在双核Intel Xeon处理器7100系列上的性能监视592
14.20.1 GBSQ事件接口593
14.20.2 GSNPQ事件接口594
14.20.3 FSB事件计数595
14.20.4 公共事件控制接口596
第15章 先进的可编程的中断控制器598
15.1 当地和I/O APIC概要598
15.2 系统总线与APIC总线600
15.3 Intel 82489DX外部APIC、APIC和xAPIC601
15.4 当地APIC601
15.4.1 当地APIC方框图601
15.4.2 当地APIC的存在604
15.4.3 启用或禁止当地APIC604
15.4.4 当地APIC状态和位置604
15.4.5 当地APIC寄存器的重定位605
15.4.6 当地APIC ID605
15.4.7 当地APIC状态605
15.4.8 当地APIC版本寄存器607
15.5 处理当地中断607
15.5.1 当地向量表607
15.5.2 有效的中断向量609
15.5.3 差错处理610
15.5.4 APIC定时器611
15.5.5 当地中断接受612
15.6 发出处理器间中断612
15.6.1 中断命令寄存器612
15.6.2 确定IPI目的615
15.6.3 IPI交付和接收618
15.7 系统和总线仲裁618
15.8 处理中断619
15.8.1 Pentium 4和Intel Xeon处理器的中断处理619
15.8.2 中断、任务和处理器优先级619
15.8.3 对于固定中断的接收620
15.8.4 通知中断服务完成621
15.8.5 在IA-32e方式中任务优先级622
15.9 伪中断623
15.10 消息通知的中断623
15.10.1 消息地址寄存器格式624
15.10.2 消息数据寄存器格式625
第16章 多处理器管理626
16.1 锁定的原子操作627
16.1.1 保证的原子操作627
16.1.2 总线锁定628
16.1.3 处理自修改代码和交叉修改代码629
16.1.4 在处理器内部缓存中的LOCK操作的影响630
16.2 内存顺序630
16.2.1 在Pentium和Intel 486处理器中的内存顺序631
16.2.2 在P6和更近代处理器族中时的内存顺序631
16.2.3 对于串操作的超出顺序存储632
16.2.4 强或弱内存顺序模型633
16.3 传播页表和页目录项修改至多处理器634
16.4 串行化指令634
16.5 多处理器初始化635
16.5.1 BSP和AP处理器636
16.5.2 MP初始化协议要求和对Intel Xeon处理器的限制636
16.5.3 对于Intel Xeon处理器的初始化协议算法636
16.5.4 MP初始化举例637
16.5.5 在MP系统中标识逻辑处理器640
16.6 超线程和多核技术640
16.7 测试硬件多线程支持和拓扑641
16.7.1 初始化支持超线程技术的处理器641
16.7.2 初始化多核处理器641
16.7.3 在一支持硬件多线程的Intel 64或IA-32处理器上执行多线程642
16.7.4 在支持硬件多线程的IA-32处理器上处理中断642
16.8 Intel超线程技术体系结构642
16.8.1 逻辑处理器状态643
16.8.2 APIC功能643
16.8.3 内存范围寄存器644
16.8.4 页属性表644
16.8.5 机器检查属性644
16.8.6 调试寄存器和扩展644
16.8.7 性能监视计数器644
16.8.8 IA32_MISC_ENABLE MSR644
16.8.9 内存顺序645
16.8.10 串行化指令645
16.8.11 微码更新资源645
16.8.12 自修改码645
16.8.13 实现特定的HT技术设施645
16.9 多核体系结构647
16.9.1 逻辑处理器支持647
16.9.2 内存类型范围寄存器647
16.9.3 性能监视计数器647
16.9.4 IA32_MISC_ENABLE MSR647
16.9.5 微码更新资源648
16.10 对于硬件多线程功能资源的编程考虑648
16.10.1 共享的资源的层次映射648
16.10.2 在MP系统中标识逻辑处理器649
16.10.3 对于APIC ID的三级映射算法650
16.10.4 在一MP系统中标识拓扑关系652
16.11 空闲和阻断条件的管理656
16.11.1 HLT指令656
16.11.2 PAUSE指令656
16.11.3 检测对MONITOR/MWAIT指令的支持656
16.11.4 MONITOR/MWAIT指令657
16.11.5 MONITOR/MWAIT地址范围确定658
16.11.6 要求的操作系统支持658
第17章 处理器标识及特性663
17.1 CPUID(处理器标识)指令663
17.1.1 指令格式663
17.1.2 指令描述663
17.1.3 测试CPUID指令663
17.1.4 CPUID功能0668
17.1.5 CPUID功能1669
17.1.6 CPUID功能2674
17.1.7 CPUID功能4677
17.1.8 CPUID功能5677
17.1.9 CPUID功能6677
17.1.10 CPUID功能10677
17.2 CPUID指令的使用678
17.2.1 返回商标信息的方法678
第18章 处理器管理和初始化681
18.1 初始化概要681
18.1.1 复位后的处理器状态682
18.1.2 处理器内置自测试684
18.1.3 模型和步进信息684
18.1.4 执行的第一条指令684
18.2 x87 FPU初始化685
18.2.1 配置x87 FPU环境685
18.2.2 设置处理器为x87 FPU软件仿真686
18.3 启用缓存686
18.4 模型特定的寄存器686
18.5 存储类型范围寄存器687
18.6 初始化SSE/SSE2/SSE3/SSSE3扩展687
18.7 为实地址方式操作的软件初始化687
18.7.1 实地址方式IDT688
18.7.2 NMI中断处理688
18.8 软件初始化保护方式操作688
18.8.1 保护方式系统数据结构689
18.8.2 初始化保护方式异常和中断689
18.8.3 初始化分页689
18.8.4 初始化多任务689
18.8.5 初始化IA-32e方式690
18.9 方式切换692
18.9.1 切换至保护方式692
18.9.2 切换回实地址方式692
18.10 初始化和方式切换举例693
18.10.1 汇编程序使用695
18.10.2 STARTUP.ASM清单695
18.10.3 MAIN.ASM源代码703
18.10.4 支持文件704
18.11 微码更新设施706
18.11.1 微码更新706
18.11.2 任选的扩展签名表708
18.11.3 处理器标识709
18.11.4 平台标识710
18.11.5 微码更新检验和711
18.11.6 微码更新装入器711
18.11.7 更新签名和验证713
18.11.8 Pentium 4、Intel Xeon和P6族处理器微码更新规范714
参考文献726