64位

64位

计算机架构中的内存地址等的最大宽度
在计算机架构中,64位整数、内存地址或其他数据单元,是指它们最高达到64位(8字节)宽。此外,64位CPU和算术逻辑单元架构是以寄存器、内存总线或者数据总线的大小为基准。64位CPU在1960年代,便已存在于超级计算机,且早在1990年代,就有以RISC为基础的工作站和服务器。2003年才以x86-64和64位PowerPC处理器架构的形式引入到(在此之前是32位)个人计算机领域的主流。“64位”计算机架构一般具有64位宽的整数型寄存器,它可支持(内部和外部两者)64位“区块”(chunk)的整数型数据。
    中文名:64位 外文名:64 bit 别名:

架构影响

处理器中的寄存器通常可分为三种︰整数、浮点数、其它。在所有常见的主流处理器中,只有整数寄存器(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位宽的浮点数寄存器。

优缺点

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

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

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

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

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

数据模型

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

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

必须谨慎使用ptrdiff_t型态(在标准表头中)两个指针相减的结果;太多代码宁可不正确的使用“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位机器内存的较高区域,可能无法满足来自操作系统从设备到大于4GB内存读入数据的要求。因为对于这些地址的指针,将不适合设备的DMA寄存器。这个问题可如下解决,当向设备发出DMA请求时,OS采用与设备相符的内存限制,或者使用IOMMU。

超越

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

图像

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

处理器

这里的64位技术是相对于32位而言的,这个位数指的是CPU GPRs(General-Purpose Registers,通用寄存器)的数据宽度为64位,64位指令集就是运行64位数据的指令,也就是说处理器一次可以运行64bit数据。64bit处理器并非现在才有的,在高端的RISC(Reduced Instruction 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-bit x86架构包括8个通用寄存器(GPR),AMD在X86-64中又增加了8组(R8-R15),将寄存器的数目提高到了16组。X86-64寄存器默认位64-bit。还增加了8组128-bit XMM寄存器(也叫SSE寄存器,XMM8-XMM15),将能给单指令多数据流技术(SIMD)运算提供更多的空间,这些128位的寄存器将提供在矢量和标量计算模式下进行128位双精度处理,为3D建模、矢量分析和虚拟现实的实现提供了硬件基础。通过提供了更多的寄存器,按照X86-64标准生产的CPU可以更有效的处理数据,可以在一个时钟周期中传输更多的信息。

EM64T技术

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

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

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

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

相关词条

相关搜索

其它词条