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位内核下运行。
软件目录名称
许多项目会选择使用i386与x86-64或amd64。这是我推荐的最少歧义的方式。(如果您不在乎与旧版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等,但通常只在源文件中存在。)