x86、x32 和 x64 架构之间的区别?

Posted

技术标签:

【中文标题】x86、x32 和 x64 架构之间的区别?【英文标题】:Difference between x86, x32, and x64 architectures? 【发布时间】:2011-11-29 21:42:54 【问题描述】:

请解释x86x32x64之间的区别? x86x32 有点令人困惑,因为大多数时候 32 位程序在 x86 上运行...

【问题讨论】:

x32 是一个正在积极开发的新 ABI。它基本上是在 CPU 上以 x86_64 (x64) 模式运行的 32 位代码,因此它可以访问额外的 8 个寄存器以提高程序速度,同时通过使用 32 位指针保持内存效率。见sites.google.com/site/x32abi 和lwn.net/Articles/456731。 x32 ABI 是 Linux 3.4 的一部分,于 2012 年 5 月 20 日发布 @jww 我没有锤子。另外,我并没有说这不是一个真正的问题,只是说它跑题了。它有点宽泛,可能会更好地询问超级用户。不过,汉斯的答案可以在不重新打开问题的情况下得到改进。 @jww 啊,我明白了。我添加了重新投票。我想 SO 主持一个边界 SO/SU 问题并没有什么坏处。 x86 是指与 intel 386、486 等兼容的架构。x32 和 x64 是误称,通常仅表示“32 位”或“64 位” 【参考方案1】:

Hans 和 DarkDust 的回答涵盖了 i386/i686 和 amd64/x86_64,因此重新审视它们是没有意义的。此答案将重点关注 X32,并提供 X32 移植后学到的一些信息。

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

x32 最多可减少约 30% 的内存使用量和最多约 40% 的速度增加。该架构的用例是:

vserver 托管(内存受限) 上网本/平板电脑(低内存、性能) 科学任务(性能)

x32 是最近添加的。它需要内核支持(3.4 及更高版本)、发行版支持(见下文)、libc 支持(2.11 或更高版本)和 GCC 4.8 及更高版本(改进的地址大小前缀支持)。

对于发行版,它在 Ubuntu 13.04 或 Fedora 17 中可用。内核支持只要求指针在 0x00000000 到 0xffffffff 的范围内。来自System V Application Binary Interface, AMD64 (With LP64 and ILP32 Programming Models),第 10.4 节,p。 132(它唯一的一句话):

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

引导支持的内核时,您必须使用syscall.x32=y 选项。在构建内核时,您必须包含CONFIG_X86_X32=y 选项。 (参考:Debian X32 Port page 和 X32 System V Application Binary Interface)。


以下是在 Debian 人员在测试后报告了我们的一些错误后,我通过最近的移植了解到的一些内容:

系统很像 X86 预处理器定义__x86_64__(和朋友) __ILP32__,但不是__i386__/__i686__(和朋友) 您不能单独使用 __ILP32__,因为它会在 Clang 和 Sun Studio 下意外显示 与栈交互时,必须使用64位指令pushqpopq 从 32 位数据类型填充/配置寄存器后,您可以对它们执行 64 位操作,例如 adcq 小心出现在高 32 位上的 0 扩展。

如果您正在寻找测试平台,那么您可以使用 Debian 8 或更高版本。他们在Debian X32 Port 的wiki 页面包含所有信息。 3 秒游:(1)启动时在内核中启用 X32; (2) 使用debootstrap 安装X32 chroot 环境,(3) chroot debian-x32 进入环境并测试您的软件。

【讨论】:

"一旦从 32 位数据类型填充/配置了寄存器,您就可以对它们执行 64 位操作,例如 adcq"。好的,但这与 x86-64 完全相同。速度提升主要针对具有大量指针数据结构的代码。只有某些类型的 HPC 是这样的。其他科学计算任务需要大量内存和巨型阵列上的大量 FP,而 x32 几乎没有什么区别。代码大小可能与 x86-64 相似或更差,因为它往往需要地址大小前缀。虽然指针操作有时可以避免 REX 前缀。【参考方案2】:

x86 是指 PC 中使用的 Intel 处理器架构。型号是 8088(8086 的 8 位总线版本,用于第一台 IBM PC)、8086、286、386、486。之后他们切换到名称而不是数字,以阻止 AMD 复制处理器名称。 Pentium 等,绝不是 Hexium :)。

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

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

【讨论】:

8086 的 8 位版本 有点误导。 8088 是一个 16 位处理器,这意味着它的寄存器是 16 位宽的。但是,外部数据总线只有 8 位宽。 8086是16位内部和外部数据总线,8088是16位内部数据总线和8位外部数据总线【参考方案3】:

x86 表示与 Intel 80x86 兼容。这曾经包括 8086,一个仅 16 位的处理器。如今,它大致意味着任何具有 32 位 Intel 兼容指令集的 CPU(通常是从 Pentium 开始的任何 CPU)。永远不要阅读正在使用的x32

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

所以大多数时候你可以这样简化:x86 在 32 位模式下是 Intel 兼容的,x64 在 64 位模式下是 Intel 兼容的。

【讨论】:

我认为补充一下 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 的同义词,因为该术语指的是特定且非常不同的事物(请参阅其他答案/cmets)。 @PeterCordes 花了几秒钟才明白 ISA 是 Instruction Set Architecture,而不是 Industry Standard Architecture(总线,因为你在谈论 i386一开始)。【参考方案4】:

由于 64 位版本是 x86 架构,因此首先被称为 x86-64,这将是最合适的名称,IMO。此外,x32 是一个东西(如前所述)——然而,'x64' 不是它的延续,所以(理论上)误导(即使很多人会知道你在说什么),因此应该只被认为是一种营销事物,而不是“官方”架构(同样,IMO——显然,其他人不同意)。

【讨论】:

以上是关于x86、x32 和 x64 架构之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Side-by-Side 程序集加载 x64 或 x32 版本的 DLL

为什么Windows 32位称为Windows x86而不是Windows x32?

QT 5.6.1 应用程序在退出插槽后仅在 x86 架构而不是 x64 上崩溃

可执行dll加载(x32,x64):选择正确的

IA32 IA64 X64 的区别

linux和ubuntu区别是什么?有什么关系?