x8664体系探索及编程
‘壹’ x86/x64体系探索及编程的前言
2003年前后,我开始对x86平台的一些架构知识产生了浓厚的兴趣,在业余时间断断续续地学习了AMD的System Programming手册。后来,为了方便,索性挑了些感兴趣的章节打印出来,偶尔拿出来翻翻。也曾通过写一个OS来学习x64的体系知识,当然这个OS只是个试验品。
在计划好写本书之后,我又好好地重读了Intel的几卷手册,特别是Intel 64 and IA-32 Architectures Software Developer's Manual的Volume 3 System Programming Guide和Volume 1 Basic Architecture。
因此,本书所写的内容是基于Intel处理器的,至于所测试机器的处理器则是Intel的Westmere微架构处理器(SandyBridge的上一代)。但是,如非明确注明,大部分内容对于AMD处理器也是适用的,有些地方甚至反复多次对Intel与AMD的区别进行了强调。
尽管我已竭力探索事物的本质真相,然而不可否认,本书中仍可能会有些个人主观的认知因素,但必须说明的是,这些主观的认知是经过客观的实验事实而得出的,本书的每个知识点都经过了实验例子进行测试。在本书成书过程中,我慢慢地发现,如果没有经过实验的测试竟然觉得心里不踏实,总觉得欠缺什么而不敢下笔。本书中有上百个实验,每个章节都有数个例子。然而比起我所做过的测试仍相距甚远。
通过本书,我希望能引起读者的共呜,激发求知的欲望和探索的精神,以及学会怎样“肓人摸象”。尽管摸到的可能只是事实的一部分,但是只要我们不断地进行摸索,经过反复的测试,我们终将会慢慢积累知识,在一无所知的情况下逐步接近真相。
‘贰’ x86/x64体系探索及编程的章节阅读
如果想对x86与x64有较全面的了解,那么从第1章到第21章最好都去阅读。对于x86与x64编程基础不是那么好的读者,第1章和第2章是必须要去了解的。
要想更好地了解x86与x64平台,第1篇、第2篇,以及第4篇是需要好好阅读的,它们是x86与x64架构体系的基石。
第3篇与第5篇旨在帮助读者扩展视野,它们是让x86与x64平台变得强大的地方。
x86与x64的章节
在每一个章节里都会有x86与x64体系的相关描述,特别是在第2篇和第3篇。如非明确注明,x86下大多数的特征在x64下也是适用的。譬如对MSR(Model-Specific Register)的访问方式在64位执行环境下与x86体系下是一样的;再譬如对local APIC的编程方式,在x64下与x86下也是一样的;又譬如对x87 FPU与SSE指令的执行环境,大多数情况下在x64下与x86下是一样的。
总之,除了第12章明确描述x64内容外,其他章节都会含有x86与x64的描述。
只要您有耐心,它们都是不二之选。
致谢
感谢电子工业出版社博文视点编辑及相关工作人员的辛勤劳动使本书得以出版,感谢谭文先生作序,感谢罗云彬先生推荐。
邓志
2012年8月
‘叁’ x86/x64体系探索及编程的读者对象
如果你工作在x86与x64平台上;如果你对x86与x64架构知识有兴趣;如果你正在学习x86与x64,或者有一定的基础,想继续扩展视野:我想本书是适合你阅读的。
本书假设你有一定的x86基础知识,包括:
1)有一些汇编语言的基础,至少能看懂一些简单的汇编代码。
2)有一些x86架构知识,知道x86是什么。譬如:知道什么是实模式、保护模式等。
3)最好能有一些写boot代码的知识。即使没有,你也可以参照书中的源代码例子。
尽管书中例子是使用汇编语言编写,但即便你的汇编语言基础不那么好,阅读起来也不会感到太困难,因为这些例子的代码并不像从高级语言反汇编出来的代码那样涉及过多的程序结构知识,譬如:
1)你不会面对着stack的各种开栈销栈处理,因为实验例子中的过程调用基本上不会使用栈来传递参数。
2)你不会面对着各种复杂的程序分支结构和编程技巧,实验例子都使用很纯粹的汇编代码编写。
了解一下nasm
如果你对汇编语言掌握比较熟练,你可能需要去了解一下nasm汇编语法,因为本书的所有实验例子都使用nasm编译器编译。别担心,对一条汇编代码,nasm的语法和Intel使用的语法是一样的,但对于操作数寻址到内存,则表达形式有一些差异。
nasm与Intel在内存操作数寻址的表达上有一些区别,主要有以下两方面。
1)operand size(操作数尺寸)的指示字。
2)segment 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结束
‘肆’ x86/x64体系探索及编程 例子怎么用
本书是对Intel手册所述处理器架构的探索和论证。全书共五大部分,从多个方面对处理器架构相关的知识进行了梳理介绍。书中每个章节都有相应的测试实验,所运行的实验例子都可以在真实的机器上执行。
通过阅读本书,读者应能培养自己动手实验的能力。如果再有一些OS方面的相关知识,基本上就可以写出自己简易的OS核心。
本书适合有一定的x86基础知识,且对了解处理器架构及编程感兴趣的读者阅读。
‘伍’ x86/x64体系探索及编程的作者介绍
邓志,1977年生于广东,在银行工作十余年,现自由职业者。对计算机有一股热情和蛮劲,善于思考,特别喜欢琢磨底层架构。熟悉C语言,并且精通x86/x64平台的汇编语言与机器指令系统,能用汇编写简易的OS核心。
‘陆’ x86/x64体系探索及编程的本书特色
本书是对Intel手册所描述的处理器架构进行探索和论证,每个章节都有相应的测试实验,所运行的实验例子可以在真实的机器上执行。部分实验是不能在VMware虚拟机和bochs模拟器上进行的,必须要在真实机器上运行。例如:第3篇的绝大部分内容和第4篇的部分内容。
通过阅读本书,大约能培养自己动手实验的能力。由于本书的实例是在祼机(无OS环境)上运行,因此,如果能走完本书的例子,加上一些OS知识的处理,基本上就可以写出自己简易的OS核心。
关于x86与x64
本书的另一个特色是无缝地集成了对x86与x64体系的描述。因此,既适合于x86体系,也适合于x64体系。这是因为,x64是在x86的基础上扩展而来的64位技术,x64体系有x86的全部内容,又增添了全新的long-mode工作模式与64位执行环境。
在现在的技术趋势下,为什么还要保留对x86体系的描述?一方面,这能满足不同的读者层;另一方面,也是最重要的原因:x64体系并不是一个全新的平台架构,而是基于x86架构扩展而来的。因此对x64的描述绝不能脱离x86架构,x64体系还保留着向下兼容的能力,在long-mode的64位执行环境里,许多情况下仍然可能使用常见的32位编程技术,这主要是因为,在64位执行环境里,尽管default address size(默认地址大小)是64位,然而绝大部分指令的default operand size(默认操作数大小)依然是32位。
从软件编程的角度上看,Pointer(指针)值是属于64位的(地址宽度为64位),但是integer与long仍属于32位(默认的数据宽度为32位),除非明确数据使用64位的long long类型访问,64位执行环境里指令使用REX prefix(REX扩展操作数前缀)来达到访问64位的数据宽度。
当然,如果只把它看成一本描述x64体系的书籍,那也是没问题的!即使是Intel官方的手册里也是同时在对Intel64与IA-32架构进行描述。
‘柒’ x86/x64体系探索及编程的名家推荐
·在学习x86汇编语言的过程中,总会遇到这样一种情况:基础的指令和架构已经学完,驱动或者应用也会开发了,但想要再进一步发掘处理器的新增指令集以及新特征,却发现参考资料只有Intel的指令手册,每条指令寥寥数语的说明文字对于了解复杂的新特征根本是杯水车薪。现在,本书以详尽的示例带领读者探索这部分内容,全面深入地为读者展现了x86处理器的高级特征。
罗云彬
畅销书《琢石成器——Windows环境下32位汇编语言程序设计》作者
·这本书真正是让我眼前一亮。到目前为止,这是我见过的对x86处理器介绍得最详尽又最具实践指导意义的书。我如果学习的话,一定会选择这本书。很显然,在实践中解决困难,应用所学知识的乐趣,是任何高大全的课程所无法比拟的。如果耐心地将这本书上的内容读过,将作者提供的例子一一运行过,我相信对x86处理器的知识,必定会了然于胸。
谭文
畅销书《天书夜读——从汇编语言到Windows 内核编程》
《寒江独钓——Windows 内核安全编程》作者
‘捌’ x86/x64体系探索及编程的介绍
《x86/x64体系探索及编程》是2012年出版的图书,作者是邓志。