x86编程
1. 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架构进行描述。
2. 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的区别进行了强调。
尽管我已竭力探索事物的本质真相,然而不可否认,本书中仍可能会有些个人主观的认知因素,但必须说明的是,这些主观的认知是经过客观的实验事实而得出的,本书的每个知识点都经过了实验例子进行测试。在本书成书过程中,我慢慢地发现,如果没有经过实验的测试竟然觉得心里不踏实,总觉得欠缺什么而不敢下笔。本书中有上百个实验,每个章节都有数个例子。然而比起我所做过的测试仍相距甚远。
通过本书,我希望能引起读者的共呜,激发求知的欲望和探索的精神,以及学会怎样“肓人摸象”。尽管摸到的可能只是事实的一部分,但是只要我们不断地进行摸索,经过反复的测试,我们终将会慢慢积累知识,在一无所知的情况下逐步接近真相。