x86、x32和x64体系结构之间的差异?

x86、x32和x64体系结构之间的差异?,x86,64-bit,x86-64,cpu-architecture,abi,X86,64 Bit,X86 64,Cpu Architecture,Abi,请解释x86、x32和x64之间的区别?当谈到x86和x32时,它有点令人困惑,因为大多数时候32位程序都在x86上运行 x86表示与英特尔80x86兼容。这曾经包括8086,一个16位的处理器。现在,它大致上是指任何具有32位英特尔兼容指令集(通常是从奔腾开始的任何指令集)的CPU。切勿阅读正在使用的x32 x64表示兼容x86但也具有64位模式的CPU(通常是指AMD引入的64位指令集;英特尔提出的64位模式的想法完全是愚蠢的,幸运的是,英特尔承认了这一点,现在正在使用AMDs变体) 因此,

请解释
x86
x32
x64
之间的区别?当谈到
x86
x32
时,它有点令人困惑,因为大多数时候32位程序都在x86上运行

x86
表示与英特尔80x86兼容。这曾经包括8086,一个16位的处理器。现在,它大致上是指任何具有32位英特尔兼容指令集(通常是从奔腾开始的任何指令集)的CPU。切勿阅读正在使用的
x32

x64
表示兼容x86但也具有64位模式的CPU(通常是指AMD引入的64位指令集;英特尔提出的64位模式的想法完全是愚蠢的,幸运的是,英特尔承认了这一点,现在正在使用AMDs变体)


因此,大多数情况下,您可以这样简化:
x86
在32位模式下与英特尔兼容,
x64
在64位模式下与英特尔兼容。

x86指的是PC中使用的英特尔处理器体系结构。型号为8088(8086的8位总线版本,在第一台IBM PC中使用)、8086、286、386、486。之后,他们切换到名称而不是数字,以阻止AMD复制处理器名称。奔腾等,从来没有一个六:)

x64是支持64位代码的x86指令集扩展的体系结构名称。安腾由AMD发明,后来被英特尔复制,当时他们无法拥有自己的64位arch来竞争,安腾表现不佳。它的其他名称是x86_64,AMD的原始名称,常用于开源工具。amd64是AMD的下一个名字,也是微软常用的工具。英特尔自己的名字(EM64T和“英特尔64”)从未流行起来


x32是一个与硬件无关的模糊术语。它往往被用来表示“32位”或“32位指针体系结构”,Linux有一个名称为“32位指针体系结构”的ABI。

Hans和DarkDust的答案涵盖了i386/i686和amd64/x86_64,因此重新访问它们毫无意义。此答案将重点介绍X32,并提供在使用X32端口后了解到的一些信息

x32是用于amd64/x86_64 CPU的ABI,使用32位整数、长整数和指针。其想法是将32位数据类型中较小的内存和缓存占用与较大的x86_64寄存器集相结合。(参考:)

x32可以提供高达30%的内存使用减少和高达40%的速度提高。体系结构的用例包括:

  • 虚拟服务器主机(内存绑定)
  • 上网本/平板电脑(低内存、高性能)
  • 科学任务(绩效)
x32是最近才添加的。它需要内核支持(3.4及以上)、发行版支持(见下文)、libc支持(2.11或以上)和gcc4.8及以上(改进的地址大小前缀支持)

对于发行版,它在Ubuntu 13.04或Fedora 17中提供。内核支持只要求指针在0x00000000到0xFFFFFF之间。第10.4节第。132(这是唯一的一句话):

10.4内核支持
内核应该将从系统调用返回的堆栈和地址限制在0x00000000到0xFFFFFF之间

在使用支持引导内核时,必须使用
syscall.x32=y
选项。构建内核时,必须包含
CONFIG\u X86\u X32=y
选项。(参考:和)


以下是在Debian人员在测试后报告了我们的一些bug之后,我通过最近的一个端口学到的一些知识:

  • 该系统非常类似于X86
  • 预处理器定义
    \uuuux86\u64\uuuuu
    (和朋友们)
    \uuuuuiP32\uuuuuuuu
    ,但不定义
    \uuuuui386\uuuuuuuu
    (和朋友们)
  • 您不能单独使用
    \uuuuuiLP32\uuuuuuu
    ,因为它意外地出现在Clang和Sun Studio下
  • 与堆栈交互时,必须使用64位指令
    pushq
    popq

  • 从32位数据类型填充/配置寄存器后,可以对其执行64位操作,如
    adcq
  • 注意在高32位上出现的0扩展

如果您正在寻找一个测试平台,那么您可以使用Debian8或更高版本。他们位于的wiki页面包含所有信息。3秒钟的行程:(1)在引导时在内核中启用X32;(2) 使用
debootstrap
安装X32 chroot环境,以及(3)
chroot debian-X32
进入环境并测试您的软件。

因为64位版本是
x86
体系结构,因此最初被称为
x86-64
,这也是最合适的名称,依我看,
x32
是一种东西(如前所述)-“x64”不是这种东西的延续,(理论上)误导也不是这种东西的延续(尽管很多人都知道你在说什么),因此应该只被视为一种营销东西,而不是一种“官方”架构(同样,IMO–显然,其他人不同意).

我认为有必要补充一点,x64也称为x86-64和AMD64。“x64”仅在Windows世界中使用。在Linux术语中,i386是32位ISA,amd64是64位ISA,也称为x86-64。x86是超集,因此x86-32(i386)和x86-64(amd64)是x86的两种风格。x32不应被用作32位x86的同义词,因为该术语指的是一些特定且非常不同的东西(请参阅其他答案/评论)。@PeterCordes花了几秒钟才理解ISA是指令集体系结构,而不是行业标准体系结构(总线,因为您刚开始谈论的是i386).8位版本的8086有点误导。8088是一个16位处理器,这意味着它的寄存器是16位宽的。然而,外部数据总线只有8位宽。8086是一个16位内部和外部数据总线,8088是16位内部数据总线,8位外部数据总线32是一个新的ABI