来自当知百科
2010年9月5日 (日) 22:37老生常庸讨论 | 贡献的版本

(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转到: 导航搜索

目录

概述

  一个 64 位的 CPU,内部可能有外部数据总线或不同大小的地址总线,可能比较大或比较小;术语“64位”也常用于描述这些总线的大小。例如,目前有许多机器有着使用64 位总线的 32 位处理器(如最初的 Pentium 和之后的 CPU),因此有时会被称作“64位”。同样的,某些 16位处理器(如 MC68000)指的是 16/32 位处理器具有 16 位的总线,不过内部也有一些 32位的性能。这一术语也可能指计算机指令集的指令长度,或其它的数据项(如常见的 64 位双精度浮点数)。去掉进一步的条件,“64位”计算机架构一般具有 64位宽的整数型寄存器,它可支持(内部和外部两者) 64 位“区块”(chunk)的整数型数据。

架构影响

  处理器中的寄存器通常可分为三种︰整数浮点数、其它。在所有常见的主流处理器中,只有整数寄存器(integerregister)才可存放指针值(内存数据的地址)。非整数寄存器不能存放指针来读写内存,因此不能用来避开任何受到整数寄存器大小所影响的内存限制。

  几乎所有常见的主流处理器(大部分的 ARM 和 32 位 MIPS 实作是明显的例外)集成了浮点数硬件,它有可能使用 64位寄存器保存数据,以供处理。例如,x86 架构包含了 x87 浮点数指令,并使用 8 个 80 位寄存器构成堆栈结构。后来的 x86修改版和 x86-64 架构,又加入 SSE 指令,它使用 8 个 128 位宽的寄存器(在 x86-64 中有 16个寄存器)。与之相较,64 位 Alpha系列处理器,除了 32 个 64 位宽整数寄存器以外,也定义了 32 个 64 位宽的浮点数寄存器。

内存限制

  目前大部分的 CPU(截至 2005年),其单个寄存器可存放虚拟内存中任意数据的内存地址(本机)。因此,虚拟内存(计算机在程序的工作区域中所能保留的数据总量)中可用的地址取决于寄存器的宽度。自1960 年的 IBM System/360 起,然后 1970年 的 DEC VAX 微型计算机,以及 1980年 中期的 Intel 80386,在事实上一致开发合用的 32位大小的寄存器。32 位寄存器意味着 2^32 的地址,或可使用 4 GB 的内存。当时在设计这些架构时,4 GB的内存远远超过一般所安装的可用量,而认为已足够用于寻址。认为 4 GB地址为合适的大小,还有其它重要的理由︰在应用程序中,如数据库,42 亿多的整数已足够对大部分可计算的实例分配唯一的参考引用。

  然而在 1990年初,成本不断降低的内存,使安装的内存数量逼近 4GB,且在处理某些类型的问题时,可以想像虚拟内存的使用空间将超过 4 GB 上限。为此,一些公司开始释出新的 64位架构芯片家族,最初是提供给超级计算机、顶级工作站和服务器机器。64 位运算逐渐流向个人计算机,在 2003 年,某些型号的Apple Macintosh 产生线转向 PowerPC 970 处理器(Apple 称为“G5”),并在 2006 年,转向EM64T 处理器,且 x86-64 处理器在顶级的 PC 中遂渐普及。64 位架构的出现,有效的将内存上限提升至 2^64地址,16 EB 的内存。从这个角度来看,在 4 MB 主内存很普遍时,最大的内存上限 2^32 的地址大约是一般安装内存的 1000倍。如今,当 1 GB 的主内存很普遍时,2^64 的地址上限大约是 1 百亿倍。

  今天市面上大部分的消费级 PC 存在着人为的内存限制,因受限于实例上的限制,而几乎不太可能需要完整支持 16 EB容量。举例来说,Apple 的 MacPro 最多可安装实例内存至 16 GB,而无必要支持超过的大小。最新的 Linux 内核(版本 2.6.16)可编译成最高支持 64 GB的内存,Windows VistaUltimate支持超过128G内存。

32 与 64 位

  从 32位到 64位架构的改变是一个根本的改变,因为大多数操作系统必须进行全面性修改,以取得新架构的优点。其它软件也必须进行移植,以使用新的性能;较旧的软件一般可借由硬件兼容模式(新的处理器支持较旧的32 位版本指令集)或软件模拟进行支持。或者直接在 64 位处理器里面实作 32 位处理器内核(如同 Intel 的 Itanium处理器,其内含有 x86 处理器内核,用来执行 32 位 x86 应用程序)。支持 64 位架构的操作系统,一般同时支持 32 位和64 位的应用程序。

  明显的例外是 AS/400,其软件执行在虚拟的指令集架构,称为TIMI(技术独立机器界面),它会在执行之前,以低阶软件转换成本地机器码。低阶软件必须全部重写,以搬移整个 OS以及所有的软件到新的平台。例如,当 IBM 转移较旧的 32/48 位“IMPI”指令集到 64 位 PowerPC(IMPI完全不像 32 位 PowerPC,所以这比从 32 位版本的指令集转移到相同指令集的 64 位版本的规模还要庞大)。

  64 位架构无疑可应用在需要处理大量数据的应用程序,如数码视频、科学运算、和早期的大型数据库。在其它工作方面,其 32位兼容模式是否会快过同等级的 32 位系统,这部分已有很多争论。在 x86-64 架构(AMD64 和 Intel 64)中,主要的32 位操作系统和应用程序,可平滑的执行于 64 位硬件上。

  Sun 的 64 位Java虚拟机的启动速度比 32位虚拟机还慢,因为 Sun 仍假定所有的64 位机器都是服务器,而且只有为 64位平台实作“服务器”编译器(C2)。“客户端”编译器(C1)产生较慢的代码,不过编译较快速。所以尽管在 64 位 JVM 的 Java程序在一段很长的周期会执行的较好(一般为长时间运作的“服务器”应用程序),它的启动时间可能更久。对于短生命期的应用程序(如 Java编译器 javac) 增加启动时间可控制执行时间,使 64 位的 JVM 整体变慢。

  应当指出,在比较 32 位和 64 位处理器时,速度并不是唯一的考量因素。应用程序,如多任务、应力测试(stress testing)、丛集(clustering)(用于HPC)可能更适合 64位架构以正确部署。为了以上原因,64 位丛集已广泛部署于大型组织,如 IBM、Vodafone、HP、微软。

优缺点

  一个常见的误解是︰除非计算机安装的内存大于 4 GB,否则 64 位架构不会比 32 位架构好。这不完全正确︰

  部分操作系统保留了一部分进程地址空间供操作系统使用,造成使用者程序可用于映射内存的地址空间减少。例如,Windows XP DLL以及 userland OS 组件映射到每一个进程的地址空间,即使计算机装有 4 GB 的内存,也仅留下 2 至 3.8GB(端视其设置)的可用地址空间。这个限制在 64 位 Windows 中并不会出现。

  文件的内存映射对 32 位的架构而言不再合用,尤其是相对便宜的 DVD 烧录技术的引入。大于 4 GB 的文件不再罕见,且如此大的文件无法简单的映射到 32位架构的内存;只能映射文件的一部分范围到地址空间上,并以内存映射存取文件,当有需要时,就必须将这些范围映射进或映射出地址空间。这是一个问题,因为充裕的内存映射仍是从磁盘至内存最有效率的存取方法,如果操作系统能适当实行的话。

  64 位架构主要的缺点是,相对于 32位架构,占用相同的数据会消秏更多的内存空间(由于肿胀的指针,以及其它型态和对齐补白等可能)。这会增加进程对内存的需求,且可能会影响高效能处理器高速缓存的使用。维持一部分的32 位模型是一个处理方法,且大致合理有效。实际上,高效能导向的 z/OS 操作系统便采取这个方法,要求程序代码存放在 32位地址空间的任一数字,数据对象则可(选择性)存放在 64 位区域。

  目前主要的商业软件是建立在 32位代码,而非 64 位代码,所以不能取得在 64 位处理器上较大的 64 位地址空间,或较宽的 64位寄存器和数据路径的优点。然而,免费或自由软件操作系统的使用者已经可以使用专有的 64位运算环境。并非所有的应用程序都需要大量的地址空间或操作 64位数据项,所以这些程序不会享受到较大的地址空间或较宽的寄存器和数据路径的好处;主要受益于 64 位版本的应用程序,并不会享受到使用x86 的版本,会有更多的寄存器可以使用。

软件的可用性

  64 位系统有时缺乏对应的软件,那些软件是写给 32 位架构。最严重的问题是不兼容的驱动程序。尽管大部分软件可执行于 32位兼容模式(又称作模拟模式,即微软 WoW64技术),其通常无法执行驱动程序(或类似软件),因为程序通常执行于操作系统和硬件之间,在此直接模拟无法使用。许多开放源始码软件封包可简单的从源始码编译为可执行于64 位环境操作系统,如 Linux。所需的条件是供给 64 位机器的编译器(通常是 gcc)。目前大部分 64位版本的驱动程序还不能用,由于缺少可用的驱动程序,所以使用 64 位操作系统会有挫折。

  因为设备的驱动程序通常执行于操作系统内核(kernel)的内部,有可能以 32 位进程执行内核,同时支持 64位的使用者进程。以在内核里的额外消耗为代价,如此可为使用者提供受益于 64 位的内存和效能,且不破坏现存 32位驱动程序的二进制兼容性。这个机制源于 Mac OS X 启用 64 位进程,同时支持 32 位的驱动程序。

64 位数据模型

  以高阶语言编写的应用软件,从 32 位架构转换到 64位架构的各种困难。一个共同的问题是,部分程序员假定指针如同其它数据型态一样有相同的长度。程序员假定他们可以在数据型态之间传送数量而不遗失信息。这些假定只在一部分32 位机器上如此(甚至是一部分 16 位机器),不过在 64 位机器上就不再如此。C 语言及其后代 C++尤其容易产生这种错误[1]。

  要在 C 和 C++中避免这种错误,如果确定原始类型的大小为所需的基础,sizeof 操作符可用来确定原始类型的大小,无论是在编译以及执行时期。此外,在C99 标准中的 <limits.h> 表头,以及在 C++ 标准中的 <limits> 表头的numeric_limits 类,可提供更多有用的信息;sizeof只返回字符大小。这个用法使人产生误解,因为一个字符(CHAR_BITS)的大小是由自身决定,在所有的 C 或 C++实作中并未以相同方式定义。然而,除了这些编译器目标 DSP 以外,“64 位 = 8 字符(每一字符有 8 位)”已成标准。

  必须谨慎使用 ptrdiff_t 型态(在标准表头 <stddef.h>中)两个指针相减的结果;太多代码宁可不正确的使用“int”或“long”。表示一个指针(而不是指针差异)为一个整数,在此可以使用uintptr_t(它只定义在 C99 中,不过某些编译器另外集成较早版本的标准以提供之,作为一个扩充)。

  C 和 C++ 并未定义指针、整数型(int)、长型(long)为特定的位数目。

  在主要的 32 位机器程序设计环境中,指针、“int”变量、“long”变量全部都是 32 位长。

  然而,在 64 位机器下的许多程序设计环境,“int”变量仍然是 32 位宽,不过“long”和指针是 64 位宽,上述内容称为LP64 数据模型。另一个选择是 ILP64 数据模型,三种数据型态都是 64 位宽,甚至 SILP64 连“short”变量也是64 位宽。然而,大多数情况下所需的修改是相对次要且简单,而且许多编写良好的程序可以简单的重新编译给新的环境,而无须修改。另一个选择是LLP64 模型,其维持 32 位代码的兼容性,使 int 和 long 为 32 位。“LL”指“longlong”型态,其在所有平台下至少是 64 位,包括 32 位环境。

  今天有许多 64 位编译器使用 LP64 模型(包括 Solaris、AIX、HP、Linux、Mac OS X、IBM z/OS本地编译器)。微软的 VC++ 编译器使用 LLP64 模型。其缺点是在 LP64 模型中将 long 存放到 int可能会溢出。另一方面,还会使强制转型一个指针为 long 可以作用;在 LLP 模型下,情况则刚好相反。两者皆不应该出现在合乎 C99的代码中。

  注意,程序设计模型是在预编译器底层选择的,且数个模型可共存于同一操作系统。然而一般由 OS API 选择程序设计模型作为原始模型。

  另一个考量是用于驱动程序的数据模式。在现代的操作系统中,驱动程序弥补了大多数的操作系统代码(尽管许多代码可能不会加载,当操作系统执行时)。许多驱动程序大量使用指针操控数据,且在某些情况下必须读入一定大小的指针进入支持DMA 的硬件。举个例子,提供给 32 位 PCI 设备的驱动程序,请求设备的 DMA 数据进入 64位机器内存的较高区域,可能无法满足来自操作系统从设备到大于 4 GB 内存读入数据的要求。因为对于这些地址的指针,将不适合设备的DMA 寄存器。这个问题可如下解决,当向设备发出 DMA 请求时,OS 采用与设备相符的内存限制,或者使用 IOMMU。

64 位处理器时间表

  1961︰IBM 发表 IBM 7030Stretch 超级计算机。它使用 64 位数据字组,以及 32 或 64 位的指令字组。

  1974︰Control Data Corporation 推出 CDC Star-100 向量超级计算机,它使用 64位字组架构(先前的 CDC 系统是以 60 位架构为基础)。

  1976︰Cray Research 发表第一台 Cray-1 超级计算机。它以 64 位字组架构为基础,它成为后来的 Cray向量超级计算机的基础。

  1983︰Elxsi 推出 Elxsi 6400 平行微型超级计算机。Elxsi 架构具有 64 位数据寄存器,不过地址空间仍是32 位。

  1991︰MIPS科技公司生产第一台64 位微处理器,作为 MIPS RISC架构 R4000 的第三次修订版本。该款 CPU 使用于以 IRIS Crimson 启动的 SGI 图形工作站。然而,IRIX 操作系统并未包含对 R4000的 64 位支持,直到 1996 年释出 IRIX 6.2 为止。Kendall Square Research 发表他们的第一台KSR1 超级计算机,以专有的执行于 OSF/1 的 64 位 RISC 处理器架构为基础。

  1992︰Digital Equipment Corporation(DEC)引入纯 64 位 Alpha 架构,其诞生自PRISM 项目。

  1993︰DEC 释出 64 位OSF/1 AXP 类Unix 操作系统(后来改名为 Tru64 UNIX)和 OpenVMS 操作系统给 Alpha 系统。

  1994︰Intel 宣布 64 位IA-64 架构的进度表(与 HP 共同开发)作为其 32 位 IA-32 处理器的继承者。以 1998–1999推出时间为目标。SGI 释出 IRIX 6.0,即支持 64 位的 R8000 CPU。

  1995︰Sun 推出 64 位 SPARC 处理器 UltraSPARC。富士通所有的 HAL 计算机系统推出以 64 位CPU 为基础的工作站,HAL 独立设计的第一代 SPARC64。IBM 释出 64 位 AS/400系统,能够转换操作系统、数据库、应用程序的升级。DEC 释出 OpenVMS Alpha 7.0,第一个全 64 位版本的OpenVMS for Alpha。

  1996︰HP 释出PA-RISC 处理器架构的 64 位2.0 版本的实作 PA-8000。 任天堂引入 Nintendo 64 电视游戏主机,以低成本的 MIPS R4000 变体所打造。

  1997︰IBM 释出 RS64 全 64 位 PowerPC 处理器。

  1998︰IBM 释出 POWER3 全 64 位 PowerPC/POWER 处理器。Sun 释出 Solaris7,以完整支持 64 位 UltraSPARC。

  1999︰Intel 释出 IA-64 架构的指令集。AMD 首次公开 64 位集以扩充给 IA-32,称为x86-64(后来改名为 AMD64)。

  2000︰IBM 推出他自己的第一个兼容 ESA/390 的 64 位大型计算机 zSeries z900,以及新的 z/OS 操作系统。紧接着是 64 位Linux on zSeries。

  2001︰Intel 终于推出他的 64 位处理器产品线,标记为 Itanium,主打顶级服务器。它无法满足人们的期待,因一再拖延IA-64 市场而导致失败。Linux 是第一个可执行于该处理器的操作系统。

  2002︰Intel 引入 Itanium 2 作为 Itanium 的继承者。

  2003︰AMD 产出他的 AMD64架构 Opteron 以及 Athlon 64 处理器产品线。Apple 也推出 64 位“G5”PowerPC 970 CPUcourtesy of IBM,并连同升级他的 Mac OS X 操作系统,其增加对 64 位模式的部分支持。若干 Linux发行版本释出对 AMD64 的支持。微软宣布将为 AMD 芯片建立新的 Windows 操作系统。Intel 坚持 Itanium芯片仍维持只有 64 位的处理器。

  2004︰Intel 承认 AMD 在市场上的成功,并着手开发 AMD64 延伸的替代品,称为 IA-32e,稍后改名为EM64T。升级版本的 Xeon 和 Pentium 4 处理器家族支持了新推出的指令。Freescale 宣布 64 位 e700core,以继承 PowerPC G4 系列。VIA Technologies 宣布 Isaiah 64 位处理器。

  2005︰Sun 于 1 月 31 日释出支持 AMD64 和 EM64T 处理器的 Solaris 10。3 月,Intel宣布他的第一个双内核 EM64T 处理器 Pentium Extreme Edition 840 和新的 Pentium D 芯片将于2005 第二季推出。4 月 30 日,微软公开释出提供给 AMD64 和 EM64T 处理器的 Windows XPProfessional x64 Edition。5 月,AMD 引入他的第一个双内核 AMD64 Opteron 服务器CPU,并宣布其桌上型版本,称为 Athlon 64 X2。将原本的 Athlon 64 X2 (Toledo)处理器改为两个内核,并为每个内核的 L2 配上 1 MB 高速缓存内存,以大约 2.332 亿个晶体管组成。它有 199mm&sup2; 那么大。7 月,IBM 宣布他最新的双内核 64 位 PowerPC 970MP (codenamedAntares),由 IBM 和 Apple 使用。微软释出 Xbox 360 游戏主机,其使用由 IBM 生产的 64 位、三内核Xenon PowerPC 处理器。

  2006︰双内核 Montecito Itanium 2 处理器进入生产。Sony、IBM、Toshiba 开始生产用于PlayStation 3、服务器、工作站以及其它应用的 64 位 Cell 处理器。苹果公司在新的 Mac Pro 和 Intel Xserve 计算机中采用 64 位EM64T Xeon 处理器,稍后更新 iMac、MacBook、MacBook Pro 使用 EM64T Core 2 处理器。

目前的 64 位微处理器架构

  属于 64 位的微处理器架构(2006年)有︰

  DEC Alpha 架构(查看 Digital Alpha timeline)

  Intel 的 IA-64 架构(用于 Intel 的 Itanium CPU)

  x86-64 架构,64 位版本的 x86 架构(又称作“x64”)

  AMD 的 AMD64(用于 AMD 的 Athlon 64、Opteron、Sempron、Turion 64 CPU)

  Intel 的 Intel64(用于 Intel 的新型 Pentium 4、Xeon、Core 2 CPU)

  SPARC 架构(从 SPARC V9 开始的 64 位)

  Sun 的 UltraSPARC 架构

  Fujitsu 的 SPARC64 架构

  IBM 的 POWER 架构(从 POWER3 和 RS64 变体开始的 64 位)

  IBM/Motorola 的 PowerPC 架构(从 PowerPC 620 和 PowerPC 970 变体开始的 64 位)

  IBM 的 z/Architecture,used by IBM zSeries 和 System z9大型计算机,ESA/390 架构的 64 位版本

  MIPS 科技公司的 MIPS IV、MIPS V、MIPS64 架构

  HP 的 PA-RISC family(从 PA-RISC 2.0 开始的 64 位)

  大部分 64 位处理器架构可本地执行 32 位版本架构的代码,而无任何效能损失。这种支持通常称为双架构支持或更普遍的多架构支持。

超越 64 位

  直至 2007年,64位字组似乎已满足大部分的运用。不过仍应提到,IBM 的 System/370 及后继者使用 128 位浮点数,且许多现代处理器也内含128 位浮点数寄存器。System/370 及后继者尤其显著,在这方面,他们也使用多达 16 字节的可变长度十进制数(即128位)。

图像

  在数码图像中,64 位为附有 16 位 Alpha 通道的 48 位图像。

目前的 64 位AMD和Intel的处理器

  这里的64位技术是相对于32位而言的,这个位数指的是CPU GPRs(General-PurposeRegisters,通用寄存器)的数据宽度为64位,64位指令集就是运行64位数据的指令,也就是说处理器一次可以运行64bit数据。64bit处理器并非现在才有的,在高端的RISC(ReducedInstruction Set Computing,精简指令集计算机)很早就有64bit处理器了,比如SUN公司的UltraSparcⅢ、IBM公司的POWER5、HP公司的Alpha等。

  64bit计算主要有两大优点:可以进行更大范围的整数运算;可以支持更大的内存。不能因为数字上的变化,而简单的认为64bit处理器的性能是32bit处理器性能的两倍。实际上在32bit应用下,32bit处理器的性能甚至会更强,即使是64bit处理器,目前情况下也是在32bit应用下性能更强。所以要认清64bit处理器的优势,但不可迷信64bit。

  目前主流CPU使用的64位技术主要有AMD公司的AMD64位技术、Intel公司的EM64T技术、和Intel公司的IA-64技术。其中IA-64是Intel独立开发,不兼容现在的传统的32位计算机,仅用于Itanium(安腾)以及后续产品Itanium2,一般用户不会涉及到,因此这里仅对AMD64位技术和Intel的EM64T技术做一下简单介绍。

  AMD64位技术

  AMD64的位技术是在原始32位X86指令集的基础上加入了X86-64扩展64位X86指令集,使这款芯片在硬件上兼容原来的32位X86软件,并同时支持X86-64的扩展64位计算,使得这款芯片成为真正的64位X86芯片。这是一个真正的64位的标准,X86-64具有64位的寻址能力。

  X86-64新增的几组CPU寄存器将提供更快的执行效率。寄存器是CPU内部用来创建和储存CPU运算结果和其它运算结果的地方。标准的32-bitx86架构包括8个通用寄存器(GPR),AMD在X86-64中又增加了8组(R8-R9),将寄存器的数目提高到了16组。X86-64寄存器默认位64-bit。还增加了8组128-bitXMM寄存器(也叫SSE寄存器,XMM8-XMM15),将能给单指令多数据流技术(SIMD)运算提供更多的空间,这些128位的寄存器将提供在矢量和标量计算模式下进行128位双精度处理,为3D建模、矢量分析和虚拟现实的实现提供了硬件基础。通过提供了更多的寄存器,按照X86-64标准生产的CPU可以更有效的处理数据,可以在一个时钟周期中传输更多的信息。

  EM64T技术

  Intel官方是给EM64T这样定义的:EM64T全称Extended Memory 64Technology,即扩展64bit内存技术。EM64T是Intel IA-32架构的扩展,即IA-32e(IntelArchitectur-32extension)。IA-32处理器通过附加EM64T技术,便可在兼容IA-32软件的情况下,允许软件利用更多的内存地址空间,并且允许软件进行32bit线性地址写入。EM64T特别强调的是对32 bit和64 bit的兼容性。Intel为新核心增加了8个64 bitGPRs(R8-R15),并且把原有GRPs全部扩展为64 bit,如前文所述这样可以提高整数运算能力。增加8个128bitSSE寄存器(XMM8-XMM15),是为了增强多媒体性能,包括对SSE、SSE2和SSE3的支持。

  Intel为支持EM64T技术的处理器设计了两大模式:传统IA-32模式(legacy IA-32mode)和IA-32e扩展模式(IA-32emode)。在支持EM64T技术的处理器内有一个称之为扩展功能激活寄存器(extended feature enableregister,IA32_EFER)的部件,其中的Bit10控制着EM64T是否激活。Bit10被称作IA-32e模式有效(IA-32emode active)或长模式有效(long mode active,LMA)。当LMA=0时,处理器便作为一颗标准的32bit(IA32)处理器运行在传统IA-32模式;当LMA=1时,EM64T便被激活,处理器会运行在IA-32e扩展模式下。

  目前AMD方面支持64位技术的CPU有Athlon 64系列、AthlonFX系列和Opteron系列。Intel方面支持64位技术的CPU有使用Nocona核心的Xeon系列、使用Prescott2M核心的Pentium 4 6系列和使用Prescott 2M核心的P4 EE系列。

  64位技术就像一股不可阻挡的浪潮扑面而来,从今年开始,64位技术将逐步渗透进我们的生活,也许明年这个时候,我们已经习惯了在64位操作系统下运行64位程序。

个人工具
名字空间

变换
查看
操作
导航
工具箱