在 Linux 系统环境下经常遇到一些后缀:i386、i486、i586、 i686、 x86、x86_64、amd_64,许多朋友对这些后缀的含义一头雾水,这里就统一为大家详细介绍一下。介绍这些后缀含义之前,需要先来了解一下CPU 的一些关键发展历,可选择性阅读加粗字体部分。
x86 架构首度出现在 1978 年推出的 Intel 8086 CPU(有不少理工科朋友在微机原理和单片机课程上都学习过这款经典的 CPU 吧)。Intel 之后又推出了包括 80186、80286、80386 以及 80486。在设计上,Intel 后续推出这些处理器所使用的指令集都是在 8086 CPU 的基础上添加新指令进行改进的,因此,可以说都是向下兼容的(Backward Compatible),即能在 8086 上运行的程序在后面的 80486 上也一定能运行。由于这些 CPU 多数都是以 86 结尾,所以把这一系列的指令集称之为 x86 指令集( 8088 CPU 除外,但它也是 x86),对应的 CPU 架构称为 x86 架构(字母 x 代表可以是不同的数字)。准确的来讲,x86 这一术语并不是指的某一个(具体 CPU 使用的)具体的指令集,而是在 8086(的指令集)基础上发展而来的所有指令集的泛称。
在 80486 以后 Intel 推出的绝大多数 CPU 都是“x86”的,包括 Pentium(奔腾) 、Pentium Pro 、Pentium MMX ,Pentium II ,还有后面的 Pentium III、Pentium 4 、Pentium M、Pentium D 、Celeron(赛扬)全系列、Core(酷睿)全系列,x86 系列的 Xeon(至强)。Intel 以外最成功的制造商为 AMD,其早先产品 Athlon(速龙)系列处理器的市场份额仅次于 Intel Pentium,AMD 还推出过 Duron(毒龙)系列、Sempron(闪龙)系列、Opteron(皓龙)系列、 Turion(炫龙)系列、Phenom(官方中文名称为“羿龙”,而台湾则译为“飞龙”,俗称“肥龙”)系列、FX(推土机)系列、APU(集成了较强的 GPU) 系列、以及跨越性的 Ryzen(锐龙)系列等桌面处理器。AMD 的这些处理器也都是“x86”的。其他公司也有制造 x86 架构的处理器,还有 Cyrix(现为威盛电子所收购)、NEC 集团、IBM、IDT 以及 Transmeta。
Xeon(至强)CPU 是 Intel 专为服务器准备的 CPU,除个别型号外,基本都屏蔽了集成显卡,相比于桌面 CPU频率稍低,特点是单颗 CPU 核数多、运行稳定。至强 CPU 可以分为 E3、E5、E7 等大系列,每个大系列有分为几个小系列。一般服务器主板上面都安装了多颗至强处理器。
x86 架构就是桌面级 CPU 的标准,你能买到的品牌或者组装的 PC,几乎没有不是 x86 CPU 的。不过虽说都是 x86 的,但使用的指令集都是兼容 8086 的,除 8086 指令集之外的其他指令支持情况就不一样了,其内部实现的微体系结构显然也是各自不同,就好比 Linux 和 Unix 虽然都是 POSIX 兼容的 OS,都有 fork POSIX 的调用,但是这个调用的实现确实各不相同。
从 1985 年 80386 开始,Intel 通过对 x86 架构进行 32 位的扩展,实现了 32 位 CPU,而之前的都是 16 位。 Intel 把支持32 位的 x86 指令集架构命名为 IA-32(Intel Architecture 32 bit)。实际上由于当时 32 位 x86 处理器的统治性,术语“x86”几乎等于 IA-32,即 32 位的 x86 或 x86-32,通称所说的 x86 一般都是指 IA-32 构架的 CPU。例如 Windows 和 Linux 的 32 位发行版的命名都是使用 x86,而不是 x86-32 或 IA-32。这里还是要强调 x86 是一系列架构的泛称,对 16 位、32 位和 64 位的指令集都有支持。
科技是不断发展的。在 64 位需求更加强劲的企业服务器和高性能计算市场上,Intel 于 1994 年开始和惠普合作开发了一款与 x86 架构完全没关系的全新的 IA-64 架构。IA-64 基于显式并行指令运算(EPIC),天生就是 64 位,并不兼容 IA-32。2001 年第一款 IA-64 架构的处理器 Itanium(安腾)发布,后来 Intel 把 IA-64 也干脆改称为 Intel Itanium 架构。安腾也是挺惨淡的,因为是全新设计的 CPU,没有编译器,也不支持 Windows(微软把 Intel 给忽悠了,承诺了会出安腾版 Windows Server 版,但是迟迟拿不出东西。话说,微软后来不是也坑了诺基亚吗)。由于 Intel 64 位处理器 Itanium(安腾)的不给力,1999 年,AMD 宣布了 x86-64 架构,简称“x64”,其实现方式与之前的 80386 对 16 位扩展的思路一致,x86-64 架构继续对 IA-32 扩展,增加 64 位通用寄存器、证书预算单元和逻辑操作,支持 64 位虚地址,关键是向前兼容 IA-32。2003 年第一款 x86-64 处理器 AMD Operon 发布,同时 AMD 也将 x86-64 正式命名为 AMD64,由于兼容 IA-32,很快就得到了用户的认同。以前都是 AMD 小弟追随者 Intel 大哥的脚步,如今 AMD 却率先实现了 64 位民用桌面级 CPU 并抢占了市场。其实 Intel 也有其 64 位 x86 CPU 的计划,但是由于对于这个市场的不重视,认为需求不足,一直不见面世(话说,Intel 对智能手机崛起的移动互联网时代也重视不足,虽然后来奋起直追,但还是让 ARM 架构占据了天下)。在 2004 年的 IDF 上,Intel 承认其 64 位 x86 计划,命名为 IA-32e,即 IA-32 extension,IA-32e 之后又改成 EM64T(Extended Memory 64 Technology) ,最终命名为 Intel64(大概是不愿意承认 AMDx64)。起初,EM64T 并不兼容 AMD64 的指令集,但是由于 AMD 在 64 位技术中的领先地位,Intel 2005 年不得不宣布将完全兼容 AMD64。实际上 EM64T 与 AMD64 几乎相同。也就是说 x86_64,、x64、AMD64、Intel64(几乎看不到这个词)基本上是同一个东西。
“i386”和“i486”显然就是 Intel 80386 和 80486 处理器的别名,其他“i某86”也是当时某代 CPU 的别名。由于不能使用数字作为注册商标,而且也需要一个正式的名称命名,于是,后来推出的 CPU 从 586 开始就变为 Pentium 了,这时候 i586 就成为了最原始 Pentium 的微处理架构“P5”的别名,同样的 i686 对 P6(Pentium Pro 使用),i786 对应 P68 或 NetBurst 架构(i786 是一个隐藏的体系,听说只能用在 Pentium 4 以后的 Intel CPU 上面。但是很多软件没有针对这个架构编写,所以除非自己基于 i786 编译,不然网上没有 i786 的软件)。
下面是英特尔和 AMD 发布处理器的一些时间节点:
- June 8, 1978 – 8086 => 16 位
- October 17, 1985 –Intel 80386 => 第一款 i386 CPU,第一款 IA-32 架构(32 位) CPU
- April 10, 1989 – Intel 80486 => 第一款 i486 CPU
- March 22, 1993 – Intel Pentium => 第一款 i586 CPU
- May 7, 1997 – Intel Pentium II => 第一款 i686 CPU
现在装的 64 位版本操作系统从没有说是面向 Intel 还是 AMD 的。不过在称谓上,大多数厂商还是使用 x86-64、或 x86_64,或 x64 来称呼此架构,从而保持中立。随着 CPU 的发展,软件包为了能发挥好 CPU 的全部性能,就加入当时 CPU 对应指令集支持。因此就产生了各种不同的软件包。软件包的名称中的使用“i某86”即是说该软件包适用于这一代的 CPU,即该软件包适用于对应 CPU 使用的指令集。
- i386 对应 IA-32,并且由于兼容性肯定也适用于 i486~i686,几乎兼容所有的 x86 平台;
- i586 对应 Intel Pentium、Intel Pentium MMX、AMD K6 级别的 CPU;
- i686 不仅适用 Pentium Pro,也适用 AMD K7 架构的 Athlon;
- amd64 对应 64 位的操作系统和 CPU(谁让 AMD 先推出了 64 位 x86 CPU 呢)。
32 位操作系统最多一次性读取 4 GB 内存,也就是说 32 位操作系统没必要使用超过 4GB 的内存,多了浪费。自 1995 年 Windows 95 开始支持 32 位软件以来,多数软件和操作系统的代码都是兼容 32 位的。但现如今,我们的电脑几乎都是 64 位处理器,现今一些大型软件(尤其是大型单机游戏)需要超过 4GB 的内存才能运行,所以这种情况下安装 64 位操作系统是必须的,除非你想研究一些老旧的 32 位操作系统,或者需要运行一些无后续更新的、无法在 64 位系统上运行的 32 位软件(这种需求可以在 64 位操作系统上使用虚拟机来实现,没必要实际安装一个 32 位操作系统)。
64 位的操作系统需要使用 64 位的指令集,所以,必须安装在 64 位的处理器上,64 位的软件则必须运行在 64 位的操作系统上。由于可以向后兼容,64 位处理器上可以安装 32 位的操作系统,64 位操作系统上也可以安装运行 32 位的应用软件(需要额外安装对应的 32 位支持库,一般 64 位操作系统已经默认提供)。但 32 位处理器上不可以安装 64 位的操作系统,32 位的操作系统上也不可以安装 64 位应用软件。
显然,在某位数的 CPU 上运行相同位数的操作系统,并且在相同位数的操作系统上运行相同位数的应用软件才能使效率达到最高,但这个过程不是一蹴而就的。更多位数的 CPU 刚出现时,运行的操作系统仍是低位数的,应用软件也是低位数的,对应高位数的操作系统的出现需要一个过渡的过程,即使出现了对应位数的操作系统,对应位数的应用软件的出现也需要一定的过渡,所以操作系统也需要兼容低位数的应用软件。运行在 32 位处理器上的 Windows 操作系统从 16 位更新到 32 位经历了 10年(从 1985 到 1995)之久。所以,操作系统开发商在 64 位处理器出现后就会尽快推出了 64 位的操作系统,但是刚开始却没有足够的 64 位软件。所以,在 64 位处理器出现 10 年后,使用 64 位 Windows 的用户才刚刚超过了 使用 32 位 Windows 的用户。所以也就有了文章标题中的那一系列名词。
一般来说,等级愈高的 CPU 可兼容较低等级的软件包文件。你可以通过查看Linux 系统中的 /proc/cpuinfo
文件来获取你的 CPU 等级。所以,i686 的软件包能在 Pentium II 以后的 CPU 上运行,但基本不能在此之前的 CPU(如 Intel 80486)上运行,而 i386 的软件包既可在较早推出的 i386 CPU 的电脑上运行,也可在后面所有的 CPU 上运行。据许多资料介绍,在一般情况下,在 i686 的电脑上运行 i386 与 i686 的软件在性能上基本没有大的区别。通常情况下,如果一个包同时有 i686 和 i386 版本,通常 i686 的效率会更高。只有 i386 版本的话,可能是该程序对于效率并无需求。虽然某个软件包的版本很多(可能有i386、i686、amd64等),不过目前的新机器都是 64 位的 CPU 和 x86_64 版本的操作系统了,由于可以向后兼容,这些不同版本的软件包应该都可以使用。现在发行的许多软件包,一般也就提供 i386 和 x86_64(或者为amd64) 两个版本,即 32 位版本和 64 位版本,有些甚至已经不提供 i386 版本了。除非一些特殊场合,比如为了使用一些老版程序。有些功能没有 x86_64 版本,那也只好用 i某86
的了。
除了前面介绍的软件包以外,还有一下几种后缀的软件包:
-
*.athlon.rpm
,这种软件包装在 AMD CPU 上的系统上更能发挥好 AMD 的 CPU 的性能; -
*.noarch.rpm
,这种软件包跟硬件体系结构无关,可以在各个不同的 CPU 上均可使用; -
*.src.rpm
,这种软件包是源程序包,不能直接安装运行的,先要通过编译。在编译时会根据 CPU 的类型来产生相应后缀的软件包。编译内核也是如此。
显然,某位数的 CPU 上运行相同位数的操作系统,并且相同位数的操作系统上运行相同位数的应用软件才能使效率达到最高,但这个过程不是一蹴而就的。更多位数的 CPU 刚出现时,运行的操作系统仍是低位数的,应用软件也是低位数的,对应高位数的操作系统的出现需要一个过渡的过程,即使出现了对应位数的操作系统,对应位数的应用软件的出现也需要一定的过渡,所以操作系统也需要兼容低位数的应用软件。运行在 32 位处理器上的 Windows 操作系统从 16 位更新到 32 位经历了 10年(从 1985 到 1995)之久。所以,操作系统开发商在 64 位处理器出现后就会尽快推出了 64 位的操作系统,但是刚开始却没有足够的 64 位软件。所以,在 64 位处理器出现 10 年后,使用 64 位 Windows 的用户才刚刚超过了 使用 32 位 Windows 的用户。
32 位操作系统最多一次性读取 4 GB 内存,也就是说 32 位操作系统没必要使用超过 4GB 的内存,多了浪费。自 1995 年 Windows 95 开始支持 32 位软件以来,多数软件和操作系统的代码都是兼容 32 位的。但现如今,我们的电脑几乎都是 64 位处理器,现今一些大型软件(尤其是大型单机游戏)需要超过 4GB 的内存才能运行,所以安装 64 位操作系统是必须的,除非你想研究一些老旧的 32 位操作系统,或这需要运行一些无后续更新的、无法在 64 位系统上运行的 32 位软件,但这种需求可以在 64 位操作系统上使用虚拟机来实现。
64 位的操作系统需要使用 64 位的指令集,所以,必须安装在 64 位的处理器上,64 位的软件则必须运行在 64 位的操作系统上。出于兼容性考虑,64 位处理器上可以安装 32 位的操作系统,64 位操作系统上也可以安装运行 32 位的应用软件(需要额外安装对应的 32 位支持库,一般 64 位操作系统已经默认提供)。但 32 位处理器上不可以安装 64 位的操作系统,32 位的操作系统上也不可以安装 64 位应用软件。
虽然应用软件的版本很多,不过目前的新机器都是 64 位的 CPU了,都可以使用 x86_64 版本的操作系统和软件包了,而且也应该使用这个版本。现在的发行包,一般也就提供 i386 和 x86_64 两个版本,即 32 位版本和 64 位版本,有些甚至已经不提供 i386 版本了。除非一些特殊场合,比如为了使用一些老版程序。有些功能没有 x86_64 版本,那也只好用 i某86
的了。