计算机体系结构中,64位是指整数内存地址或其他数据单元的宽度是64位元。此外,64位中央处理器 (CPU) 和算术逻辑单元 (ALU) 是基于64位大小的寄存器地址总线数据总线的,支持整数的64比特宽度的算术逻辑运算。使用这种处理器的计算机是64位计算机。

原理解释

编辑

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

处理器中的暂存器通常可分为三种:整数、浮点数、其它。在所有常见的主流处理器中,只有整数暂存器(integer register)才可存放指标值(记忆体资料的位址)。非整数暂存器不能存放指标来读写记忆体,因此不能用来避开任何受到整数暂存器大小所影响的记忆体限制。

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

上限

编辑

理论上限

编辑

64位元最大的记忆体上限是“16 EiB”,即1677万7216 TiB、或171亿7986万9184 GiB。即使是目前世界最大的内存,其容量也远远低于这个上限,故64位元在现实世界中可暂时视做为无限大

记忆体的大小的算法是“2的XX次方”,例如16位元位的内存上限是“2的16次方”即65536=64 KiB,而32位元为“2的32次方”即4,294,967,296 B=4 GiB,以此类推而64位元就是“2的64次方”即17179869184 GiB=16777216 TiB=16384 PiB=16 EiB。

超越64位元

编辑

64位元的上限足足有171亿GiB,这已经完全满足了个人所能用到的全部储存量;不过仍应提到,直至2007年IBM的System/370及后继者使用128位元浮点数,且许多现代处理器也内含128位元浮点数暂存器;System/370及后继者尤其显著,在这方面,他们也使用多达16位元组的可变长度十进制数(即128位元)。

历史发展

编辑

概述

编辑

早在1960年代,64位架构便已存在于当时的超级电脑,且早在1990年代,就有以RISC为基础的工作站伺服器。2003年才以x86-64和64位元PowerPC处理器架构的形式引入到(在此之前是32位元个人电脑领域的主流。

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

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

今天市面上大部分的消费级PC存在著人为的记忆体限制,因受限于实体上的限制,而几乎不太可能需要用到16EB的容量。举例来说,Apple的Mac Pro最多可安装实体记忆体至128GB,而无必要支援超过的大小。最新的Linux核心(版本3.11.2)可编译成最高支援64GB的记忆体。

64位元的大事件革沿

编辑
  • 1961年:IBM发表IBM 7030 Stretch 超级电脑。它使用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释出Solaris 7,以完整支援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,主打顶级伺服器。但因价钱太高(Itanium 9560价钱约为4650美金),因一再拖延IA-64市场而导致失败。Linux是第一个可执行于该处理器的作业系统。
  • 2002年:Intel引入Itanium 2作为Itanium的继承者。
  • 2003年:AMD产出他的AMD64架构Opteron以及Athlon 64处理器产品线。苹果也推出了64位元“G5”PowerPC 970 CPU courtesy of IBM,并连同升级他的Mac OS X作业系统,其增加对64位元模式的部分支援。若干Linux 发行版本释出对AMD64的支援。微软宣布将为AMD晶片建立新的Windows作业系统。Intel坚持Itanium晶片仍维持只有64位元的处理器。
  • 2004年:Intel承认AMD在市场上的成功,并著手开发AMD64延伸的替代品,称为IA-32e,稍后改名为EM64T。升级版本的XeonPentium 4处理器家族支援了新推出的指令。Freescale宣布64位元e700 core,以继承PowerPC G4系列。VIA Technologies宣布64位元的Isaiah处理器[1]
  • 2005年:Sun于1月31日释出支援AMD64和EM64T处理器的Solaris 10。3月,Intel宣布他的第一个双核心EM64T处理器Pentium Extreme Edition 840和新的Pentium D晶片将于2005第二季推出。4月30日,微软公开释出提供给AMD64和EM64T处理器的Windows XP Professional x64 Edition。5月,AMD引入他的第一个双核心AMD64 Opteron伺服器CPU,并宣布其桌上型版本,称为Athlon 64 X2。将原本的Athlon 64 X2(Toledo)处理器改为两个核心,并为每个核心的L2配上1 MB快取记忆体,以大约2.332亿个电晶体组成。它有199 mm²那么大。7月,IBM宣布他最新的双核心64位元PowerPC 970MP(codenamed Antares),由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处理器,稍后更新iMacMacBookMacBook Pro使用EM64T Core 2处理器。
  • 2013年:Apple推出世界上第一款64位智能手机iPhone 5s,采用ARM架构A7处理器;同年晚些时候,Apple推出iPad Air,采用同款处理器,将64位处理器带入移动设备。
  • 2014年:HTC推出世界上第一款以Android系统的64位元处理器手机HTC Desire 820

64位操作系统

编辑

64位操作系统是指特别为64位架构计算机系统而设计的操作系统

64位操作系统的优点,在于能够利用64位处理器的优势,在处理多媒体内容时能够有更佳的表现,可以存取4GB以上的内存

64位操作系统最早在中小型计算机上实现,主要是一些Unix系统,以及RISC平台。此后英特尔惠普公司合作研制的Itanium 64位处理器(Itanium采用特有的IA-64架构,与x86-64不相容)推出后,出现了此平台上的64位Linux微软Windows操作系统(即基于IA-64的Windows XP 64位版)。之后AMD推出了64位的x86-64(AMD将其称为AMD64,随后英特尔也采用该架构但曾一度把它命名为EM64T等等,x86-64的优点是能良好的相容32位元应用软件和32位元作业系统)架构CPU,很快就在Linux平台得到支持,并且微软也提供了x86-64版本的Windows XP操作系统(全称Windows XP Professional x64 Edition),使得Itanium处理器日渐势微,最后Itanium只用于伺服器。最终英特尔决定推出与AMD之前推出的AMD64相容的64位CPU,称为Intel 64、EMT64、EM64T等。Apple切换到英特尔平台后也开始开发64位操作系统。早期的解决方案十分古怪:如Mac OS X Tiger和Mac OS X Leopard以32位系统为核心,支持程序以64位模式运行,导致实际执行效率并不高。而后期的系统趋于完善,如Mac OS X Snow Leopard和更新的系统本身已于64位模式运行,可运行64位程序,也可以用兼容模式运行32位程序。

32位元过渡至64位元

编辑

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)。[2]“客户端”编译器(C1)产生较慢的代码,不过编译较快速。所以尽管在64位元JVM的Java程式在一段很长的周期会执行的较好(一般为长时间运作的“伺服器”应用程式),它的启动时间可能更久。对于短生命期的应用程式(如Java编译器javac)增加启动时间可控制执行时间,使64位元的JVM整体变慢。

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

32位元和64位元的优缺点

编辑

一个常见的误解是:除非电脑安装的记忆体大于4GB,否则64位元架构不会比32位元架构好。这不完全正确:

  • 部分作业系统保留了一部分行程位址空间供作业系统使用,减少使用者程式可用于映射记忆体的位址空间。例如,Windows XP DLL以及userland OS元件映射到每一个行程的位址空间,即使电脑装有4 GB的记忆体,也仅剩下2至3.8 GB(端视其设定)的可用位址空间。这个限制在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)。

因为装置的驱动程式通常执行于作业系统核心(Kernel)的内部,有可能以32位元行程执行核心,同时支援64位元的使用者行程。以在核心里的额外消耗为代价,如此可为使用者提供受益于64位元的记忆体和效能,且不破坏现存32位元驱动程式的二进制相容性。这个机制源于OS X启用64位元行程,同时支援32位元的驱动程式。

大多数32位元软件都在新的64位元作业系统上执行,但是防毒软件会有相容性问题。

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”指“long long”型态,其在所有平台下至少是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位元微处理器架构

编辑

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

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

影像

编辑

在数位影像中,64位元为附有16位元Alpha通道48位元影像。

参见

编辑

参考资料

编辑
  1. ^ VIA Unveils Details of Next-Generation Isaiah Processor Core. VIA Technologies, Inc. [2007-07-18]. (原始内容存档于2007-10-11). 
  2. ^ Frequently Asked Questions About the Java HotSpot VM. Sun Microsystems, Inc. [2007-05-03]. (原始内容存档于2007-05-10). 

本条目部分或全部内容出自以GFDL授权发布的《自由线上电脑词典》(FOLDOC)。