前言

当我们在下载软件的时候,经常会区分这个软件是32位的还是64位的。比如codeblocks的32位和64位安装包名称分别是codeblocks_17.12_i386.tar.xz 以及codeblocks_17.12_amd64.tar.xz 。我们很好奇

  • i386 为什么就代表32位的安装包,也好奇类似x86,x64,x86-64这种种类似的名词究竟是什么
  • 为什么软件要区分32位和64位的安装包

实际上,x86 是一套指令集体系结构(Instruction Set Architecture, ISA)的统称,之所以要区分32位和64位的安装包是因为x86架构下的32位与64位指令集不同。

等等? 什么是ISA?我们先来解释为什么会有ISA。

为什么会有ISA

由于不同的处理器开发团队采用的技术,具体的实现也不尽相同,不同的处理器使用了不同的指令集合,这样在处理器A上编写的程序就不能直接在处理器B上运行,需要重新编写,编译汇编链接成符合处理器B指令集的二进制程序。

这给程序设计,软件开发带来了极大的不便。

由此,人们在在编译器编写者和处理器设计者之间提供了一个抽象层——指令集体系结构(Instruction Set Architecture, ISA),将编程所需要了解的硬件信息从硬件系统中抽象出来。这样,开发出来的软件不经过修改就可以在符合该ISA的计算机上运行了。

ISA是什么

指令集体系结构(ISA),也被叫做“架构/结构”或者“体系结构”, 相当于一个抽象的机器,而不是某种处理器的具体实现。实质上,作为软硬件之间的接口,ISA是一种说明书,它规定了如何使用硬件,这其中就包括指令集,指令集编码,基本数据类型,寄存器,寻址模式,存储体系,异常处理,中断,I/O模型等。

微体系结构是什么

微体系结(架)构(microarchitecture),也叫做计算机组成(computer organization),是ISA在处理器上的具体硬件实现,也就是CPU中的实现处理器各个功能的数字电路。

两者的关系

  • ISA是微体系结构的抽象,微体系结构是ISA在CPU上的具体实现
  • 对于同一个ISA,可以使用不同技术的微体系结构,比如单周期、多周期以及流水线。
  • 对于同一个ISA,其上层软件是相互兼容的。
    • 比如Intel i7每一代微架构都有不同,但对上层软件开发而言并无区别

x86/arm/amd64/i386/x86-64/x64/IA-32/IA-64/MIPS

当我们谈论上述名词时,我们究竟在谈论什么?

先抛出我总结的答案:

  • 当我们关注其硬件实现时,我们所说的x86架构是指的运行x86指令集的处理器架构
    • 即各种数字电路和器件设计
  • 当我们关注其指令集体系结构时,我们所说的x86架构是指一套指令集体系结构
    • 即指令集,指令集编码,基本数据类型,寄存器,寻址模式,存储体系,异常处理,中断,I/O模型等

x86

x86是一套ISA的统称。由于早期intel的CPU编号都是如8086,80286,80386来编号,并且这整个系列的CPU都是指令兼容的,所以都用X86来标识。

常见的x86结构的ISA包括:IA-32(i386), x86-64(x64, amd64, Intel 64)。

IA-32 (i386)

IA-32(Intel Architecture, 32-bit)是32位的x86体系结构。又因为它是第一个支持32位计算的x86结构,故一般用来代指所有的支持32位计算的x86版本。

IA-32, 也被称作i386。

x86-64(x64, amd64, Intel 64)

x86-64 是64位的x86体系结构。由于是基于32位x86结构的64位扩展,也被称作x64(x代表extended)。因为是首先被AMD公司设计的,故也叫amd64。后被英特尔采用,也称作Intel 64。

ARM

arm(Advanced RISC Machine)是一套ISA的统称,包括32位的armV6, armV7以及64位的armV8等,属于精简指令集计算机(RISC)的架构。

IA-64

IA64,使用在Itanium处理器家族上的64位指令集架构。

MIPS

MIPS(Microprocessor without Interlocked Pipelined Stages) 是属于精简指令集计算机(RISC)的指令集架构。

当前的应用

目前最流行的架构是属于复杂指令集计算机(CSIC)类型的x86架构及属于精简指令集计算机(RISC)类型的arm架构。而MIPS则基本用于嵌入式平台中,IA-64则是一个没落版本。

参考资料

后记

最近在复习操作系统和计算机组成原理,看了一些资料,想通过叙述一个可执行文件从编写,编译,链接,装载,执行的故事,以此来检验和总结自己的学习成果。由于在讲故事时涉及到许多补充的知识,所以,尽管我对如何讲好这个故事还没有一个很明确的思路,但是我还是希望马上动手写下自己所学到的,并将这些补充的知识放进番外篇。另外,这些可能也不是一个正式的版本,没有顺序可言,只是我觉得这些东西对讲故事很重要,或是对了解底层的细节很有用,抑或是我觉得这些知识是我以前不知道的,不清楚的,故记录下来。