太阳是黑色的

少年听雨歌楼上,红烛昏罗帐.壮年听雨客舟中,江阔云低断雁叫西风. 而今听雨僧庐下,鬓已星星也! 悲欢离合总无情,一任阶前点滴到天明.

Archive for 1 2 月, 2006

IA-32 Intel Architecture 读书笔记(1)

IA-32 Intel Architecture 读书笔记

IA-32架构的简要历史
Intel微处理器的架构历史其实并不长,而每一代的分界也十分清楚。唯一需要我们去理解的就是,微处理器的分代和微处理器的产品编号并没有本质上的联系。也就是说,几个不同型号的微处理器也许是一代产品,使用的是同一个架构,而少数相同型号的微处理器,则完全使用了不同架构。
第一代微处理器
第一代Intel的微处理器当然就是著名的8086和8088了。这一代微处理器的技术指标主要有以下几个方面。
8086拥有16位寄存器和16位的外部数据总线,20位的地址总线,使得可访问的内存达到了1MB。8088和8086非常相似,不过只拥有8位的外部数据总线。从第一代微处理器开始,Intel就加入了对分段内存管理的支持。4个16位的段寄存器可以让8086和8088支持每一个内存段都达到64KB大小。通过一个段地址和一个16位的偏移地址,可以组成一个20位的地址访问整个1MB的内存空间。
保护模式的引入
Intel 286芯片引入了跨时代的“保护模式”,这一个模式成为了今后数十年程序运行的主流模式。保护模式降低了内存中任务之间的干扰性,保护了各个任务的流畅运行。同时对分段内存管理的进一步加强,使得可以形成24位的地址访问16MB的内存空间。
32位微处理器
Intel 386是IA-32家族的第一款32位处理器。它拥有32位寄存器和32位的地址总线,可以访问4GB的物理地址空间。对于每一个任务进程都享受独立的4GB物理地址空间。
从386起,处理器开始支持分段和分页两种内存管理模式。对于分段,还支持了“扁平”(Flat)模式,所有的段寄存器都指向同样的地址,也就是说一个32位地址就可以访问整个4GB的物理空间。对于分页,则使用4KB作为一个页面的大小,并且支持虚拟内存管理。
Intel 486微处理器
486处理器主要在并行处理能力上进行了改进,增加了8KB的一级缓存,集成了x87浮点运算芯片。以往,浮点运算器并不是微处理器的一部分。同时486还开始支持电源管理用于笔记本电脑市场的开拓。
Pentium微处理器
Pentium处理器增强了数据处理速度和能力,一级缓存增大到了16KB,其中8KB用于代码,8KB用于数据。尽管寄存器依旧是32位,但内部数据总线已经增加到了128位或者是256位。其后,Intel MMX的引入则极大的扩展了Pentium多媒体的处理能力,其中SIMD使得数据可以在64位的MMX寄存器上并行执行。
P6家族处理器
在Pentium之后,Intel微处理器的内部硬件结构发生了很多变化,在没有改变Pentium的整体架构的情况下,性能的提升主要来自很多细微的地方。P6家族的处理器包括:Pentium Pro,Pentium II,Pentium II Xeon,Intel Celeron,Pentium III,Pentium III Xeon。
Pentium Pro增强了缓存的能力,一级缓存有8KB,而二级缓存达到了256KB。同时,地址总线达到了36位,这样就可以访问64GB的物理地址空间。
Pentium II的一级缓存有16KB,二级缓存分别支持256KB,512KB和1MB大小,并且加入了MMX技术。
Pentium III引入了流水SIMD(SSE)技术,并且新增了128位的MMX寄存器。
Pentium 4 处理器
增加流水SIMD扩展2指令集(SSE2),扩展支持128位浮点数的运算。扩展了一系列的硬件特性,支持超线程技术。

以上就是IA32 架构的粗略的发展史,我主要是侧重软件编程方面的介绍,重点关注对软件编程会产生影响的重大变化。我们发现,IA32这么多年的变化,从软件的角度来讲并不是特别大,原因之一就是要尽可能得与以往的代码兼容。在这一点上,Intel无疑是十分成功的。很多8088和8086代码都可以运行在非常现代的Pentium4的处理器上,最大可能的减少了软件的迁移代价。然而,因为硬件条件的逐渐变化,尽管内存的段页式管理从386就基本确立下来,但是内存的访问空间却是不断在增大。这里就隐藏着整个32位系统最大的矛盾,寄存器的位数和地址线的位数一直不统一,当然,这一方面为段页式内存管理提供了方便,但一方面则使代码显得不优雅。到了P6家族,除了寄存器的位数还维持在32位,所有的处理位数都大大多于32位。这在很大程度上也阻碍了处理器性能的继续提高。所以,64位时代的到来肯定是毋庸置疑的。