《x86/x64体系探索及编程》图书信息

x86/x64体系探索及编程

 

 

(x86处理器介绍得最详尽又最具实践指导意义的一本书)

邓志著

ISBN 978-7-121-18176-4

201210月出版

定价:119.00

16

840

x86处理器介绍得最详尽又最具实践指导意义的一本书

本书是对Intel手册所述处理器架构的探索和论证。全书共五大部分,从多个方面对处理器架构相关的知识进行了梳理介绍。书中每个章节都有相应的测试实验,所运行的实验例子都可以在真实的机器上执行。

通过阅读本书,读者应能培养自己动手实验的能力。如果再有一些OS方面的相关知识,基本上就可以写出自己简易的OS核心。

本书适合有一定的x86基础知识,且对了解处理器架构及编程感兴趣的读者阅读。

作者介绍

邓志,1977年生于广东,在银行工作十余年,现自由职业者。对计算机有一股热情和蛮劲,善于思考,特别喜欢琢磨底层架构。熟悉C语言,并且精通x86/x64平台的汇编语言与机器指令系统,能用汇编写简易的OS核心。

名家推荐

·在学习x86汇编语言的过程中,总会遇到这样一种情况:基础的指令和架构已经学完,驱动或者应用也会开发了,但想要再进一步发掘处理器的新增指令集以及新特征,却发现参考资料只有Intel的指令手册,每条指令寥寥数语的说明文字对于了解复杂的新特征根本是杯水车薪。现在,本书以详尽的示例带领读者探索这部分内容,全面深入地为读者展现了x86处理器的高级特征。

罗云彬

畅销书《琢石成器——Windows环境下32位汇编语言程序设计》作者

 

·这本书真正是让我眼前一亮。到目前为止,这是我见过的对x86处理器介绍得最详尽又最具实践指导意义的书。我如果学习的话,一定会选择这本书。很显然,在实践中解决困难,应用所学知识的乐趣,是任何高大全的课程所无法比拟的。如果耐心地将这本书上的内容读过,将作者提供的例子一一运行过,我相信对x86处理器的知识,必定会了然于胸。

谭文

畅销书《天书夜读——从汇编语言到 Windows 内核编程》

《寒江独钓——Windows 内核安全编程》作者

我还记得我最初碰到邓志,是因为我碰到需求不得不要写一个比较简单的x86指令的编码器。其实我并不是要写一个汇编器那么强大的工具,只是需要动态地生成一部分x86的指令来完成一些功能。我在网上找了很多代码,包括下载了nasm的源码,改了一段时间,因为牵涉太广实在是无法精简。没办法就只好自己学习x86的指令编码规则。于是在志志的主页上看到了他对x86指令编码规则的简单通俗的介绍。学了一下受益颇多,比看Intel提供的指令手册要简单多了,而且照样好用。不过,可惜的是,现在我又忘得精光了。当然,如果我要再用,我会去找他的。现在可简单多了,我会要他送一本他的新书给我。我想这本书应该很快就会和读者们见面了,因为我已经在帮他写序了。

从他网站上的文章来看,他是个基础非常扎实的技术人。这点和我就不一样了。我多年来一直疲于奔命地开发各种各样的项目,做了无数种稀奇古怪的东西,但基本上都是做完即忘。下次碰到一样的问题,唯一的记忆是知道应该去哪里找线索。所以我在写《天书夜读》和《寒江独钓》的时候,也只能一边写代码一边写书。如果是代码上没有用到的地方,也就避而不谈了。避不开的,我只能说,这个问题笔者没有研究过,请读者自己研究云云。当然这也招来了不少读者的不满。不过我总觉得,我作为一个工程师,只能写出工程上遇到过和处理过的问题。否则就只能瞎编或者照搬了。但是志志的风格和我完全不一样。我感觉他总是要亲手编码研究每个细节问题,而不在乎这个问题在实际项目中是否真会遇到。否则我无法理解他的作品为何会那么详尽。

我曾经把《天书夜读》第二版(这个版本至今还没有出版)的一些章节发给他,让他帮我给点意见。结果他自己过滤了每个字和每个标点符号,针对每个遣词用句、技术细节给了无数的反馈意见,而且任何一个小问题都引经据典地同我辩驳,我往往无言以对。从此我只能叫他邓学究。

我很高兴为邓学究的书写序。他的书是学院派的,并非工程派的。学院派的好处是体系完整,事无巨细,尽情囊括。读者尽可以从中学到全貌的知识,而不像每天只知道干活的工程师写出的经验总结——那些经验或许很有价值,能够协助你快速入门,甚至完成一个项目的任务,但是夯实自己的技术基础,那依然是自己不得不要去完成的任务。

我甚至觉得他这本书非常适合作为教材。一般的学院派的书理论居多,指导实践的少。我在大学的时候就常常是觉得学过了大部头的教材,还是完全不知道学到的东西如何使用。往往是几个简单的实验做完就了事了。到了工作中早就忘记得一干二净。幸运的是邓志的这本书完全不是如此。几乎书中讲到的每一步,他都介绍了在计算机上实际操作的方法。而所用的软件工具,无一不详尽提供其细节,真正达到了从零基础开始动手,也不会存在任何障碍的程度。当然,学习这样一本书,是需要极大努力和耐心的。如果我是教师,我甚至可能都不敢选择这本书作为教材。因为我要花很多时间,才能去把上面的示例代码一一跑通。而且还要时刻担心在课堂上演示出问题,而又解决不了时满头大汗的尴尬呢。但要是学习的话,就一定会选择这本书。很显然,在实践中解决困难,应用所学知识的乐趣,是任何高大全的课程所无法比拟的。如果耐心地将这本书上的内容读过,将邓学究提供的例子一一运行过,我相信自己对关于x86处理器的知识,必定会了然于胸了。

当然,有些读者会觉得奇怪,为什么要学习这本书呢?这本书有什么价值呢?我觉得可以拿大学的一门课程来解释这本书的价值,那就是“80x86微机原理与接口技术。在我读大学的时候,这门课程的内容就已经严重地过时了。此后工作许多年,我也没有碰到过这门课程中有令我满意的资料。有一些翻译的书还算不错,比如我后来用过的《Intel微处理器》,但是邓志的这本书真正是让我眼前一亮。目前为止,这是我见过的对x86处理器介绍得最详尽又最具实践指导意义的书。

 

谭文于2012年秋

 

2003年前后,我开始对x86平台的一些架构知识产生了浓厚的兴趣,在业余时间断断续续地学习了AMDSystem Programming手册。后来,为了方便,索性挑了些感兴趣的章节打印出来,偶尔拿出来翻翻。也曾通过写一个OS来学习x64的体系知识,当然这个OS只是个试验品。

在计划好写本书之后,我又好好地重读了Intel的几卷手册,特别是Intel 64 and IA-32 Architectures Software Developer's ManualVolume 3 System Programming GuideVolume 1 Basic Architecture

因此,本书所写的内容是基于Intel处理器的,至于所测试机器的处理器则是IntelWestmere微架构处理器(SandyBridge的上一代)。但是,如非明确注明,大部分内容对于AMD处理器也是适用的,有些地方甚至反复多次对IntelAMD的区别进行了强调。

尽管我已竭力探索事物的本质真相,然而不可否认,本书中仍可能会有些个人主观的认知因素,但必须说明的是,这些主观的认知是经过客观的实验事实而得出的,本书的每个知识点都经过了实验例子进行测试。在本书成书过程中,我慢慢地发现,如果没有经过实验的测试竟然觉得心里不踏实,总觉得欠缺什么而不敢下笔。本书中有上百个实验,每个章节都有数个例子。然而比起我所做过的测试仍相距甚远。

通过本书,我希望能引起读者的共呜,激发求知的欲望和探索的精神,以及学会怎样肓人摸象。尽管摸到的可能只是事实的一部分,但是只要我们不断地进行摸索,经过反复的测试,我们终将会慢慢积累知识,在一无所知的情况下逐步接近真相。

本书特色

本书是对Intel手册所描述的处理器架构进行探索和论证,每个章节都有相应的测试实验,所运行的实验例子可以在真实的机器上执行。部分实验是不能在VMware虚拟机和bochs模拟器上进行的,必须要在真实机器上运行。例如:第3篇的绝大部分内容和第4篇的部分内容。

通过阅读本书,大约能培养自己动手实验的能力。由于本书的实例是在祼机(无OS环境)上运行,因此,如果能走完本书的例子,加上一些OS知识的处理,基本上就可以写出自己简易的OS核心。

关于x86x64

本书的另一个特色是无缝地集成了对x86x64体系的描述。因此,既适合于x86体系,也适合于x64体系。这是因为,x64是在x86的基础上扩展而来的64位技术,x64体系有x86的全部内容,又增添了全新的long-mode工作模式与64位执行环境。

在现在的技术趋势下,为什么还要保留对x86体系的描述?一方面,这能满足不同的读者层;另一方面,也是最重要的原因:x64体系并不是一个全新的平台架构,而是基于x86架构扩展而来的。因此对x64的描述绝不能脱离x86架构,x64体系还保留着向下兼容的能力,在long-mode64位执行环境里,许多情况下仍然可能使用常见的32位编程技术,这主要是因为,在64位执行环境里,尽管default address size(默认地址大小)是64位,然而绝大部分指令的default operand size(默认操作数大小)依然是32位。

从软件编程的角度上看,Pointer(指针)值是属于64位的(地址宽度为64位),但是integerlong仍属于32位(默认的数据宽度为32位),除非明确数据使用64位的long long类型访问,64位执行环境里指令使用REX prefixREX扩展操作数前缀)来达到访问64位的数据宽度。

当然,如果只把它看成一本描述x64体系的书籍,那也是没问题的!即使是Intel官方的手册里也是同时在对Intel64IA-32架构进行描述。

读者对象

如果你工作在x86x64平台上;如果你对x86x64架构知识有兴趣;如果你正在学习x86x64,或者有一定的基础,想继续扩展视野:我想本书是适合你阅读的。

本书假设你有一定的x86基础知识,包括:

1)有一些汇编语言的基础,至少能看懂一些简单的汇编代码。

2)有一些x86架构知识,知道x86是什么。譬如:知道什么是实模式、保护模式等。

3)最好能有一些写boot代码的知识。即使没有,你也可以参照书中的源代码例子。

尽管书中例子是使用汇编语言编写,但即便你的汇编语言基础不那么好,阅读起来也不会感到太困难,因为这些例子的代码并不像从高级语言反汇编出来的代码那样涉及过多的程序结构知识,譬如:

1)你不会面对着stack的各种开栈销栈处理,因为实验例子中的过程调用基本上不会使用栈来传递参数。

2)你不会面对着各种复杂的程序分支结构和编程技巧,实验例子都使用很纯粹的汇编代码编写。

了解一下nasm

如果你对汇编语言掌握比较熟练,你可能需要去了解一下nasm汇编语法,因为本书的所有实验例子都使用nasm编译器编译。别担心,对一条汇编代码,nasm的语法和Intel使用的语法是一样的,但对于操作数寻址到内存,则表达形式有一些差异。你可以从http://www.nasm.us/xdoc/2.10.03/html/nasmdoc0.html这个在线文档了解nasm简单的语法。

nasmIntel在内存操作数寻址的表达上有一些区别,主要有以下两方面。

1operand size(操作数尺寸)的指示字。

2segment override prefix(段改写前缀)的位置。

Intel语法上:

mov dword ptr [eax], 1                       ; 操作数尺寸使用dword ptr指示字

mov eax, cs:[20100h]                         ; 段前缀放在[]括号外

而在nasm语法上则需要变通一下:

mov dword [eax], 1                                   ; 操作数尺寸指示字去掉ptr

mov eax, [cs:20100h]                         ; 段前缀放在[]括号内

另外,例子中也有使用宏定义,因此也需要注意一下nasm中宏的定义方式,如下所示:

%macro NMI_DISABLE 0                 ; %macro 开始,参数个数为 0

       ......

%endmacro                                       ; %endmacro结束

选择章节阅读

如果想对x86x64有较全面的了解,那么从第1章到第21章最好都去阅读。对于x86x64编程基础不是那么好的读者,第1章和第2章是必须要去了解的。

要想更好地了解x86x64平台,第1篇、第2篇,以及第4篇是需要好好阅读的,它们是x86x64架构体系的基石。

3篇与第5篇旨在帮助读者扩展视野,它们是让x86x64平台变得强大的地方。

x86x64的章节

在每一个章节里都会有x86x64体系的相关描述,特别是在第2篇和第3篇。如非明确注明,x86下大多数的特征在x64下也是适用的。譬如对MSRModel-Specific Register)的访问方式在64位执行环境下与x86体系下是一样的;再譬如对local APIC的编程方式,在x64下与x86下也是一样的;又譬如对x87 FPUSSE指令的执行环境,大多数情况下在x64下与x86下是一样的。

总之,除了第12章明确描述x64内容外,其他章节都会含有x86x64的描述。

书中的例子与工具

本书共21章,每一章对应一个topicXX目录,实验例子源代码就在这些目录下以ex开头的子目录里,有上百个实验例子。书中示例可在http://www.broadview.com.cn/18176下载,也可以在www.mouseos.com/books/x86-64/index.html下载。

下载解压后即可在\source目录下看到前面所说的目录结构和实验源代码,还可以看到每个实验生成的软盘映像文件(demo.img)及硬盘映像文件(c.img),其中的硬盘映像文件可以直接写入到U盘,放在真实机器上进行测试。

此外,在\tools目录下还包括了我写的merge工具及其源代码和开源的dd工具。merge工具是一个合并模块写入映像文件以及U盘的工具。由于所附merge工具是在Windows 7下编译的,如果在您的平台下不能使用,您可以使用Visual Studio重新编译生成。

dd工具也可以用来写入U盘,但我很少使用它,不过我们可以用它来查看U盘设备在Windows上的符号链接名字,例如:\\.\g:就是在我的机器上的U盘符号链接名,在您的机器上应该是不同的名字。

参考资料

IntelIntel® 64 and IA-32 Architectures Software Developer's Manual,即Intel64IA-32架构软件开发者参考手册,共有三卷,可从Intel官方网站免费下载:http:// www.intel.hk/content/www/xa/en/processors/architectures-software-developer-manuals.html

AMDAMD64 Architecture Programmer's Manual,即AMD64架构编程手册,共有五卷,可从其官方网站免费下载:http://developer.amd.com/documentation/Pages/default.aspx

只要您有耐心,它们都是不二之选。

致谢

感谢电子工业出版社博文视点编辑及相关工作人员的辛勤劳动使本书得以出版,感谢谭文先生作序,感谢罗云彬先生推荐。

邓志

20128

 

第一篇 x86基础

1 数与数据类型       2

1.1    2

1.1.1 数字   2

1.1.2 二进制数   3

1.1.3 二进制数的排列       3

1.1.4 十六进制数       5

1.1.5 八进制数与十进制数       5

1.2 数据类型      6

1.2.1 integer   6

1.2.2 floating-point 9

1.2.3 real number(实数)与NaNnot a number      11

1.2.4 unsupported编码值   14

1.2.5 浮点数精度的转换   15

1.2.6 浮点数的溢出   17

1.2.7 BCD      20

1.2.8 SIMD数据 21

2 x86/x64编程基础 23

2.1 选择编译器   23

2.2 机器语言      24

2.3 Hello world   25

2.3.1 使用寄存器传递参数       26

2.3.2 调用过程   27

2.3.3 定义变量   27

2.4 16位编程、32位编程,以及64位编程   28

2.4.1 通用寄存器       28

2.4.2 操作数大小       30

2.4.3 64位模式下的内存地址   30

2.4.4 内存寻址模式   31

2.4.5 内存寻址范围   34

2.4.6 使用的指令限制       34

2.5 编程基础      34

2.5.1 操作数寻址       35

2.5.2 传送数据指令   39

2.5.3 位操作指令       45

2.5.4 算术指令   47

2.5.5 CALLRET指令   48

2.5.6 跳转指令   48

2.6 编辑与编译、运行      48

3 编写本书的实验例子    50

3.1 实验的运行环境   50

3.2 生成空白的映像文件   52

3.2.1 使用nasm编译器生成     52

3.2.2 使用bximage工具    52

3.3 设置bochs配置文件    53

3.4 源代码的基本结构      54

3.5 编译源代码   55

3.6 映像文件内的组织      55

3.7 使用merge工具   56

3.7.1 merge的配置文件    57

3.7.2 执行merge命令       57

3.8 使用U盘启动真实机器      58

3.8.1 使用merge工具写U   58

3.8.2 使用hex编辑软件写U       59

3.9 编写boot代码     60

3.9.1 LBA转换为CHS      62

3.9.2 测试是否支持int 13h扩展功能      63

3.9.3 使用int 13h扩展读磁盘 64

3.9.4 最后看看load_module()   64

3.10 总结    66

4 处理器的身份       67

4.1 测试是否支持CPUID指令 67

4.2 CPUID指令的术语及表达 68

4.3 基本信息与扩展信息   68

4.4 处理器的型号(family,modelstepping      72

4.5 最大的物理地址和线性地址      73

4.6 处理器扩展状态信息   74

4.6.1 探测Processor Extended State子叶 75

4.6.2 Processor Extended State子叶所需内存size   76

4.6.3 Processor Extended State的保存     77

4.6.4 Processor Extended State的恢复     78

4.7 处理器的特性      78

4.8 处理器的CacheTLB信息      80

4.9 MONITOR/MWAIT信息     83

4.10 处理器的long mode   84

5 了解Flags      85

5.1 Eflags中的状态标志位       86

5.1.1 signed数的运算 86

5.1.2 unsigned数的运算    89

5.2 IOPL标志位 90

5.3 TF标志与RF标志      93

5.4 NT标志 95

5.5 AC标志 96

5.6 VM标志       98

5.7 eflags寄存器的其他事项    99

6 处理器的控制寄存器    101

6.1 CR8       102

6.2 CR3       103

6.3 CR0       104

6.3.1 保护模式位PE 104

6.3.2 x87 FPU单元的执行环境       104

6.3.3 CR0.PG控制位 108

6.3.4 CR0.CDCR0.NW控制位    108

6.3.5 CR0.WP控制位 110

6.3.6 CR0.AM控制位       110

6.4 CR4       110

6.4.1 CR4.TSDCR4.PCE控制位 110

6.4.2 CR4.DECR4.MCD控制位 111

6.4.3 CR4.OSFXSR控制位       111

6.4.4 CR4.VMXECR4.SMXE控制位 111

6.4.5 CR4.PCIDECR4.SMEP控制位 112

6.4.6 CR4.OSXSAVE控制位    113

6.4.7 CR4中关于页的控制位   113

6.5 EFER扩展功能寄存器       114

7 MSR       116

7.1 MSR的使用 116

7.2 MTRR    117

7.2.1 Fixed-range区域的映射   118

7.2.2 MTRR的功能寄存器       120

7.3 MSR中对特殊指令的支持 124

7.3.1 支持sysenter/sysexit指令的MSR    125

7.3.2 支持syscall/sysret指令的MSR       126

7.3.3 支持swapgs指令的MSR 127

7.3.4 支持monitor/mwait指令的MSR    128

7.4 提供processor feature管理 129

7.5 其他未列出来的MSR 129

7.6 关于MSR一些后续说明    129

第二篇 处理器的工作模式

8 实地址模式    132

8.1 真实的地址   132

8.2 real mode的编址 132

8.3 real mode的状态 133

8.4 段基址的计算      134

8.5 1条执行的指令      134

8.6 实模式下的执行环境   135

8.7 实模式下的IVT   135

8.8 突破64K段限      136

8.9 A20地址线   137

9 SMM系统管理模式探索      138

9.1 进入SMM    138

9.2 SMM的运行环境 141

9.2.1 SMRAM区域    141

9.2.2 SMM执行环境的初始化 143

9.2.3 SMM下的operandaddress 144

9.2.4 SMM下的CSEIP       144

9.2.5 SMM下的SSESP       145

9.3 SMM里的中断    145

9.4 SMIBack-to-Back响应   147

9.5 SMM里开启保护模式 147

9.6 SMM的版本 148

9.7 I/O指令的重启及Halt重启       151

9.8 SMM的退出 152

9.9 SMBASE的重定位     153

9.10 SMI处理程序的初始化    154

9.11 SMM的安全      156

9.11.1 芯片组的控制 156

9.11.2 处理器对SMRAM空间的限制     158

9.11.3 cache的限制    160

9.12 测试SMI处理程序    161

10 x86/x64保护模式体系(上)    163

10.1 x86/x64的权限   164

10.2 保护模式下的环境    164

10.2.1 段式管理所使用的资源 165

10.2.2 paging分页机制所使用的资源     165

10.3 物理地址的产生 166

10.4 段式管理机制    167

10.4.1 段式内存管理 168

10.4.2 段式的保护措施     168

10.5 段式管理的数据结构 169

10.5.1 Segment Selector(段选择子)     169

10.5.2 Descriptor Table(描述符表)      172

10.5.3 Segment Selector Register(段寄存器)      174

10.5.4 Segment Descriptor(段描述符) 175

10.5.5 LDT描述符与LDT 258

10.6 开启保护模式    260

10.6.1 初始化GDT    260

10.6.2 初始化IDT      262

10.6.3 切换到保护模式     263

11 x86/x64保护模式体系(下)    265

11.1 物理页面     265

11.1.1 处理器的最高物理地址(MAXPHYADDR      266

11.1.2 物理页面的大小     267

11.1.3 页转换模式(Paging Mode 268

11.2 paging机制下使用的资源 270

11.2.1 寄存器     270

11.2.2 CPUID查询leaf      270

11.2.3 寄存器的控制位     271

11.2.4 页转换表资源 272

11.3 32paging模式(non-PAE模式)       273

11.3.1 CR3结构 274

11.3.2 32paging模式下的PDE结构   275

11.3.3 使用32paging    279

11.4 PAE paging模式 282

11.4.1 Intel64下的CR3PDPTE寄存器 283

11.4.2 AMD64下的CR3      285

11.4.3 PAE paging模式里的PDPTE结构       286

11.4.4 PAE paging模式里的PDE结构    286

11.4.5 PAE paging模式里的PTE结构    288

11.4.6 使用和测试PAE paging模式 288

11.4.7 使用和测试Execution Disable功能      292

11.5 IA-32e paging模式    297

11.5.1 IA-32e paging模式下的CR3 299

11.5.2 IA-32e paging模式下的PML4E结构   302

11.5.3 IA-32e paging模式下的PDPTE结构   302

11.5.4 IA-32e paging模式下的PDE结构       303

11.5.5 IA-32e paging模式下的PTE结构 304

11.5.6 SMEP机制      304

11.5.7 使用IA-32e paging模式 308

11.6 TLBCache      314

11.6.1 TLB   315

11.6.2 Paging-Structure Cache   328

11.7 page的内存cache类型      335

11.7.1 PATPage Attribute Table 335

11.7.2 PAT MSR 337

11.7.3 各级table entryPCDPWT标志   337

11.8 页的保护措施     338

11.8.1 访问权限位U/S的检查 338

11.8.2 /写权限位R/W的检查       339

11.8.3 执行权限位XD的检查 339

11.8.4 缺页保护P标志位的检查     340

11.8.5 保留位的检查 341

12  Long-mode   342

12.1 x64体系的设计原则 343

12.2 开启long-mode 344

12.2.1 检测处理器是否支持long-mode   344

12.2.2 EFER寄存器   345

12.2.3 进入long-mode的必要条件 346

12.3 退出long-mode 350

12.4 long-mode的执行环境      352

12.4.1 处理器模式的判断 352

12.4.2 64位模式下的段描述符 353

12.4.3 Long-modegate描述符     353

12.4.4 Long-mode的描述符表结构 355

12.4.5 Long-mode模式的段寄存器 356

12.4.6 Long-modepaging机制     357

12.5 long-mode的指令环境      358

12.5.1 64位模式的操作数 358

12.5.2 64位模式下的无效指令 360

12.5.3 64位模式下的寻址模式 361

12.6 64位模式与compatibility模式编程 363

12.6.1 64位模式切换到compatibility模式     363

12.6.2 compatibility模式切换到64位模式     363

12.6.3 利用compatibility模式执行legacy的库函数      364

第三篇 调试与性能监控

13 断点调试      370

13.1 Single-Step单步调试模式 370

13.2 Breakpoint调试模式 371

13.3 MemoryI/O地址调试模式   372

13.3.1 断点寄存器DR0DR3 372

13.3.2 状态寄存器DR6     372

13.3.3 控制寄存器DR7     373

13.3.4 FaultTrap类型的debug异常    375

13.3.5 General Detect产生的#DB异常    375

13.3.6 执行断点指令产生的#DB异常     377

13.3.7 访问数据断点产生的#DB异常     386

13.3.8 访问I/O断点产生的#DB异常      390

13.3.9 任务切换时产生的Trap调试异常 392

14 分支记录      394

14.1 检测处理器的家族和型号 395

14.2 初识Branch Record    395

14.2.1 记录存放的地方     395

14.2.2 记录的形式     396

14.2.3 何时进行记录 396

14.3 IA32_DEBUGCTL寄存器 396

14.3.1 配置Branch trace record的存放    398

14.3.2 CPL-qualified branch record(受CPL限制的BTS 399

14.3.3 冻结监控 400

14.4 LBR stack    402

14.4.1 FROM_IPTO_IP寄存器   402

14.4.2 IA32_LASTBRANCH_TOS寄存器      404

14.4.3 LBR stack的使用    405

14.5 使用LBR捕捉branch trace      405

14.6 #DB异常下的LBR    419

14.7 IA-32e模式下的LBR stack      421

14.8 使用Single-step on branch功能       428

14.9 BTSBranch Trace Store)机制      429

14.9.1 检测DSDebug Store)是否支持       430

14.9.2 Debug store 64位格式    431

14.9.3 检测BTSBranch Trace Store)机制是否可用 431

14.9.4 检测PEBSPrecise Event Based Sampling)机制是否可用     432

14.9.5 Debug Store存储区域    432

14.9.6 设置DS存储区域   439

14.9.7 使用环形回路BTS buffer      443

14.9.8 使BTS buffer产生DS中断   447

14.9.9 过滤BTS记录 459

14.9.10 64位模式下的BTS机制     463

15 性能监控      469

15.1 性能监控机制    469

15.2 Performance monitoring机制的版本       470

15.2.1 确定处理器所支持的功能     471

15.2.2 IA32_PMCx寄存器在各版本中的数量       472

15.2.3 IA32_PMCx寄存器的宽度    472

15.2.4 预定义的event       473

15.3 Nehalem架构下的性能监控机制     474

15.3.1 物理资源 474

15.3.2 counter(计数器) 475

15.3.3 开启计数器     476

15.3.4 全局控制器     476

15.3.5 通用计数控制器     477

15.3.6 固定用途计数控制器     478

15.3.7 全局状态寄存器     480

15.3.8 全局溢出控制器     481

15.3.9 使用Performance monitoring的例子    481

15.3.10 PMI中冻结计数器   486

15.4 PEBSPrecise Event Based Sampling)机制 489

15.4.1 PEBS buffer    490

15.4.2 PEBS中断      493

15.4.3 PEBS事件      496

15.4.4 PEBS的触发   497

15.4.5 PEBS记录的报告   498

15.4.6 PEBS buffer满时中断    504

15.4.7 多个PMI触发 510

15.4.8 Load latency监控机制    521

15.5 使用Fixed计数器     525

15.6 Time-stamp counterclock      528

15.6.1 Invariant TSC   529

15.6.2 读取TSC    530

15.6.3 Clock per instruction       531

第四篇 中断体系

16 中断与异常处理 538

16.1 Interrupt Source(中断源)      539

16.1.1 硬件中断 539

16.1.2 软件中断 540

16.2 Exception Source(异常源)    540

16.3 Exception的恢复       541

16.4 中断vector 544

16.5 中断的屏蔽 545

16.5.1 可屏蔽的中断 545

16.5.2 不可屏蔽的中断     547

16.6 IDTR寄存器      548

16.7 IVTInterrupt Vector Table   549

16.8 IDTInterrupt Descriptor Table    550

16.9 gate描述符 551

16.9.1 legacy保护模式下的Interrupt-gateTrap-gate描述符     551

16.9.2 IA-32e模式下的Interrupt-gateTrap-gate描述符    552

16.9.3 Task-gate描述符     552

16.10 软件上的中断/异常处理流程 553

16.10.1 处理器对gate描述符和code描述符的检查      553

16.10.2 权限的检查   556

16.10.3 权限处理的三种情形   557

16.10.4 1种情形:同级调用       558

16.10.5 2种情形:权限及stack的切换      559

16.10.6 3种情形:conforming代码段       566

16.10.7 Eflags标志位的处理    567

16.10.8 执行中断/异常处理程序      567

16.11 中断/异常调用中的任务切换 567

16.12 中断/异常调用返回 568

16.12.1 返回时的任务切换       568

16.12.2 IRET指令的operand size     568

16.12.3 IRET指令返回前的检查     571

16.12.4 返回到低权限级别时   573

16.12.5 同级返回       578

16.13 错误码      579

17 8259中断控制器 582

17.1 8259结构    583

17.1.1 IRQ的优先级 584

17.1.2 中断请求状态 584

17.1.3 中断服务状态 584

17.1.4 中断屏蔽状态 585

17.1.5 中断响应过程 586

17.2 8259编程    587

17.2.1 8259寄存器I/O地址     587

17.2.2 8259初始化    588

17.2.3 8259的操作字 592

17.2.4 设置edgelevel触发模式   596

18 Local APIC体系 597

18.1 APIC体系概述   597

18.1.1 local APIC接收到的中断源   598

18.1.2 APIC体系的版本   600

18.2 使用local APIC 600

18.2.1 检测local APIC版本      600

18.2.2 开启和关闭local APIC   601

18.3 local APIC寄存器      604

18.3.1 local APIC寄存器地址   604

18.3.2 local APIC寄存器列表   606

18.4 local APIC ID     609

18.4.1 local APIC ID寄存器     609

18.4.2 APIC IDmulti-threading处理器下   610

18.4.3 multi-threading技术的使用   617

18.4.4 multi-threading处理器编程   627

18.5 local APIC版本寄存器      633

18.6 LVT寄存器 634

18.7 ICRInterrupt Command Register       635

18.8 LVT寄存器及ICR的设置 636

18.8.1 delivery mode的设置     636

18.8.2 trigger模式的设置 637

18.9 中断vectorpriority       637

18.9.1  local interruptvector设置 637

18.9.2 有效的vector     638

18.9.3 local interrupt的优先级 638

18.9.4 64位模式下的优先级       640

18.10 处理器的IPI机制    641

18.10.1 IPI消息对象 641

18.10.2 使用physical目标模式 641

18.10.3 使用logical目标模式   645

18.10.4 多处理器的初始化与编程   648

18.11 local APIC的中断处理    659

18.11.1 检查目标       660

18.11.2 IRRISR仲裁    661

18.11.3 发送EOI命令       663

18.12 APIC timer       663

18.13 错误处理   666

18.14 LINT0LINT1       669

18.14.1 LINT0LINT1寄存器       670

18.14.2 LINT0屏蔽外部中断请求      672

18.14.3 LINT1屏蔽NMI      673

18.15 Performance Monitoring   675

19 I/O APIC      679

19.1 I/O APIC寄存器 680

19.1.1 direct register(直接寄存器)       680

19.1.2 indirect register(间接寄存器)    682

19.1.3 I/O APICIRQ     684

19.1.4 I/O APIC的中断处理     685

19.2 使用HPET(高精度定时器) 688

19.2.1 HPET寄存器基址   688

19.2.2 HPET的工作原理   689

第五篇 浮点与SIMD指令环境

20 x87 FPU单元与MMX技术       698

20.1 x87 FPU执行环境     699

20.1.1 x87 FPU 数据寄存器     700

20.1.2 x87 FPUstack结构    701

20.1.3 x87 FPU状态寄存器      710

20.2 x87 FPU的异常 718

20.2.1 status寄存器的异常标志位    719

20.2.2 异常的屏蔽     720

20.2.3 #IS#IA异常       720

20.2.4 #D异常    722

20.2.5 #Z异常    723

20.2.6 #O#U异常 723

20.2.7  舍入 727

20.3 x87 FPU的异常处理机制 729

20.3.1 默认处理方法 730

20.3.2 unmasked下的异常 732

20.3.3 使用native模式      732

20.3.4 使用DOS compatibility模式 739

20.4 MMX指令环境 742

20.4.1 MMX寄存器   742

20.4.2 64SIMD整数运算     743

20.4.3 MMX指令的比较操作   746

20.4.4 MMX指令的unpack操作     746

20.4.5 x87 FPUMMX混合编程   747

20.5 x87 FPUMMX的状态 748

20.5.1 x87 FPU环境信息的保存      748

20.5.2 使用FSAVE/FNSAVE指令   749

20.5.3 MMX寄存器的保存      750

20.6 x87 FPUMMX环境的设置 750

20.6.1 为任务切换设置环境     751

20.6.2 x87 FPUMMX环境的推荐设置      758

21 SSE系列指令环境      759

21.1 处理器的资源    760

21.1.1 处理器对SSE指令的支持    761

21.1.2 128位的XMM寄存器   762

21.1.3 MXCSR    762

21.1.4 SIMD数据类型      765

21.2 SSE系列指令的异常 765

21.2.1 异常的屏蔽     766

21.2.2 numeric异常的处理       769

21.3 SSE系列指令的操作 771

21.3.1 packed数据的运算 772

21.3.2 scalar数据的运算   772

21.3.3 Horizontal的运算   773

21.3.4 MOVload/store操作 773

21.3.5 shuffle操作     774

21.3.6 unpack操作     777

21.3.7 blend操作       777

21.3.8 insert操作       778

21.3.9 extract操作     780

21.3.10 compare操作 781

21.3.11 logical操作    783

21.3.12 convert操作   785

21.3.13 string处理指令     788

21.4 SSE系列指令操作环境    800

21.4.1 SSE系列指令支持 800

21.4.2 SSE系列指令State信息       801

21.4.3 SSE系列指令环境的设置     805

21.4.4 x87 FPU/MMXSSE环境的延时切换      807

附录参考资料 808

附录实验清单 809

你可能感兴趣的:(操作系统,c/c++,数据结构与算法)