如何正确称呼针对x86相关CPU的32位和64位程序版本?

9
这个问题涉及到32位和64位x86的术语。
如果我有两个目录,一个是32位Windows的源代码,另一个是64位Windows的源代码,那么这些文件夹的名称更正确的应该是:
- x86-64和x64? - 还是IA-32和x64?
我已经阅读了一些网络资源,但无法理解。只是为了记录:
2个回答

22

x86可以是一个广泛的术语,涵盖所有向后兼容8086的CPU,以及包括x86-64在内的所有架构扩展。

请注意,IA-64根本不是x86,它是Itanium(一种具有显式推测/并行性的64位VLIW架构)。它也是由英特尔设计的,但与兼容性或设计方面的x86完全无关。(早期的IA-64 CPU还集成了x86核心,以实现兼容性。当时英特尔正在推动IA-64,而AMD则在推动AMD64 / x86-64)

英特尔有时将其CPU称为具有IA核心+集成GPU和IA核心外部的其他逻辑。(IA =英特尔架构= x86)。


32位x86(不包括16位或64位)可以被称为:

  • IA-32(有时由英特尔使用)
  • i386或i686(在Linux上常见)
  • (仅限Windows):x86。是的,真的:在Windows世界中,“x86”特指32位。这就是为什么你有一个名为该名称的Program Files (x86)目录。这个选择会导致每个人都有潜在的术语混淆,因为“x86”仍然是最好的一般性引用体系结构的方式,而不是ARM或MIPS。
  • 很少使用:x86-32。我所知道的任何硬件或软件供应商都没有正式使用此术语,但它是一个有用的术语,不会产生歧义。

永远不要称其为x32。x32是x86-64 System V ABI的ILP32变体:64位模式下的32位指针。https://en.wikipedia.org/wiki/X32_ABI


64位x86更容易具体指代(不包括32位和16位):

  • x86-64或x86_64(破折号和下划线在文本中并不重要。大多数人使用破折号,但在大多数语言中只有_可以作为函数/变量名的一部分。)
  • AMD64或amd64
  • (仅限Windows)x64
  • IA-32e或Intel64(主要仅在Intel CPU架构文档中记录Intel对x86-64的实现,这些不太流行,我没有在软件目录名称或配置选项中看到它们)。 “e”代表“扩展”,显然。https://en.wikipedia.org/wiki/X86-64#Intel_64有一个历史部分提到了命名。 Intel和AMD x86-64实现之间有非常小的差异,主要只影响内核,而不是用户空间。

不是IA-64,那是一个单独的架构。

当然,如果您想追求严谨,x86-64 CPU需要支持遗留模式,因此您可以在x86-64 CPU上运行纯32位操作系统,它仍然是一个64位CPU。

使用64位内核运行32位用户空间时,CPU处于“兼容性”模式,这与32位保护模式非常相似,除了页面表格式具有52位物理地址。(比基于PAE页面表的x86-64页面表格式的36位物理地址宽度更大。)除了使用系统调用向内核询问操作系统特定信息之外,用户空间很难区分在32位内核下运行还是在64位内核下运行。


软件目录名称

许多项目会选择使用i386x86-64amd64。这是我推荐的最少歧义的方式。(如果您不在乎与旧版PPro CPU的兼容性,也可以选择i686。)

有些项目,例如拥有针对多种架构手写汇编代码的GNU多精度库(GMP),使用“x86”和“x86_64”。https://gmplib.org/repo/gmp/file/tip/mpn

(GMP为不同的x86 CPU 版本手动调整了同一函数的多个版本。在“x86”中,有子目录包含针对 Pentum、Core 2、Haswell 等不同版本的函数,或者利用指令集扩展,如BMI2。这是不寻常的,大多数项目不会这么具体。有些项目可能会有一些内容来利用AVX或AVX512,或者SSE4.1等,但通常只在源文件中存在。)


还有相关的内容:serverfault关于微软使用“x86”= IA-32而不是x86-64的问答:为什么x86代表32位,而x64代表64位? - Peter Cordes

5
  • x86-32 版本适用于兼容 Intel 32 位处理器。
  • x86-64 版本适用于兼容 Intel 64 位处理器。
  • IA-64 版本适用于特定的 64 位 Intel Itanium 微处理器。

有时也被称为:

  • x86-32 有时被称为 IA-32、i386 或 i686、x86(参见注释1)、x32(参见注释2)。
  • x86-64 有时被称为 AMD64、Intel 64、x64。

注释1:严格来说,这不是正确的,因为

x86 涵盖所有与 8086 向后兼容的 CPU,以及所有架构扩展,包括 x86-32 和 x86-64。

尽管如此,在 Windows 环境下经常使用这个缩写。

注释2:不应该使用 x32 ABI 以避免混淆。

来源:


1
没错,x86-32有时会用到,但在任何供应商的文档中都没有提及。然而,它非常明确,并且不像i386那样意味着要避免使用SSE2或其他从386之后的x86扩展。 - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接