[置顶] Android NDK 1 - 指令集、CPU架构与汇编

时间:2021-05-02 01:28:01

处理器指令集/CPU指令集

CPU指令集是什么?

指令集是使用CPU的API。举个例子类比一下:
a. 假如CPU是SDK,那么该SDK的API就是指令集
b. 假如电视是CPU,那么描述如何使用电视的说明书就是指令集
指令集由指令构成,每个指令定义了CPU能够实现的最基本运算。
我们买CPU就是要知道CPU能够实现哪些运算。
指令集也称为指令集架构、指令集体系、ISA(Instruction Set Architecture)

常见的CPU指令集有哪些?

分类1 按指令集的复杂程度:复杂指令集合精简指令集。
两种指令集最显著的差异是指令的数量不同。前者数量更多,后者更少。
也就是同一个功能使用复杂指令集可能就需要一条指令,而使用精简指令集可能需要多条指令才能够完成。虽然不同的指令集的数量不同,但是大多数CPU产品对外提供的功能(指令集功能集合)是大致相同的。

主要厂商指令集(括号内为指令集类型:精简/复杂)

参考:[1]各大厂商的指令集列表

分类2 按照处理器位数:目前主要是32位和64位

32位和64的见下文

主要厂商CPU位数(括号内为位数)

参考:[2]各大厂商的微处理器列表

常见的指令集与厂商的关系?

参考:[1] 各大厂商的指令集列表

Android开发中常见的指令集体系?

指令集 厂商 位数
x86(x86) Intel 32
x86_64(Intel 64) Intel 64
arm64-v8a(ARMV8-A) AMR 64
armeabi(ARM v5) ARM 32
armeabi-v7a(ARM v7) ARM 32
mips MIPS 32
mips64 MIPS 64

* Intel 64 指令集在 x86基础上扩展的
* armabi 是针对旧的或者普通的ARM v5 CPU
* armabi-v7a 是针对ARM v7 CPU
* arm64-v8a 是针对最新的 ARM v8a CPU的

特别注意:x86指令集有两种CPU位,既有32位的,也有64位的

常见的指令集差异

IA-32与x86的差异

x86指令集包括IA-32、Intel 64以及其他的扩展指令集。
Intel的x86 -> AMD的AMD64(是Intel的x86的64位版,IA-32的超集)-> Intel 64(来源于AMD的AMD64)
需要注意的是IA-64是与Intel 64不同的架构。

x86_64 = x86架构或amd的64位架构,同名词 admd64、intel 64、EM64T
i386 = x86架构的32位架构,还包括 i486/i586/i686

指令集与汇编语言间的关系?

指令集中的指令(也称为机器指令)是二进制形式,由于不便于记忆,所以使用汇编指令对应CPU指令,通过记忆汇编指令来编写程序,等效控制指令的执行。因此,指令集是指令的集合,汇编语言大致可以理解为汇编指令的集合,每条汇编指令对应一个CPU指令。有因为不同厂商的指令集不同,所以不同厂商提供的汇编语言也不同。

32位和64位的CPU、操作系统、应用程序间的差异和关系

32位机和64位机说的是CPU的处理数据的能力(每个CPU时钟周期内,CPU能够处理的数据量(二进制数的位数长度))。该能力影响CPU的运算速度和内存寻址能力。位数更大的机器的运算速度和内存寻址能力更快和更大,比如,64位机有比32位机更快的运算速度,64位机支持比32机更大的内存。

32位操作系统和应用程序指的是该软件能够操作的最大内存地址空间。32位应用程序只能操作最大4GB的内存。

CPU的位数、操作系统的位数、应用程序的位数间的关系

理论上,CPU、操作系统、应用软件的位数要保持一致的。实际上,64位CPU能够运行32位操作系统,反之不行(解释1);64位操作系统能够运行32位软件,反之不行(解释2)。

解释1:CPU的位数与操作系统的位数间的关系
不同位数的CPU的指令集的指令长度是不同的。所以,理论上32位CPU上只能跑32位操作系统、64位CPU上只能跑64位操作系统。
但是为了实现”升级到64位硬件的同时保证之前购买的32位软件仍然能够运行”,所以主要厂商对CPU进行处理,使64位CPU能够运行32位操作系统。

解释2:操作系统的位数与应用程序的位数间的关系
操作系统上的大部分应用是C语言编写的,C语言程序需要经过编译后才能运行。编译过程如下:预处理、编译、汇编和链接。预处理做替换工作,将头文件中的引用用真实的实现代码替换,同时完成其他工作。编译将C语言程序转换为汇编语言程序。汇编将汇编程序转换成机器语言程序,也就是机器指令序列。

为什么编译过程除了语言的翻译转换外,还需要链接?

编译的最后一个阶段是链接,链接的作用是将程序代码与操作系统中自带的动态链接库和系统API进行关联。只有关联后程序才能运行。

因为操作系统自带的库和系统API与操作系统的位数通常是一致的,比如,32位操作系统仅自带32位系统库和系统API。但是实际上64位的Windows操作系统除了自带了64位的系统库和API,还携带了32位的系统库和API,所以在64位的Windows系统上可以运行32位的应用程序。

总之,CPU对操作系统的位数支持由CPU厂商支持,操作系统对应用程序的位数支持由操作系统厂商支持。理论上,CPU、操作系统和应用程序的位数是一致的。

32位机和64位机的内存寻址能力计算

汇编语言(王爽 第2版)一个CPU有N个地址线,那么就可以寻址2的N次方个内存单元。
32位机的CPU有32根地址总线,所以寻址能力是 2^32=4GB个存储单元(每个存储单元存储的信息量是1B(=8bit)),所以32位CPU能够寻址4GB内存。但是,64位机并不是64根地址总线,而是40根地址总线,所以支持的内存大小是 1T。

如何查看设备的指令集?

// TODO

CPU一条指令的执行时间

参考:CPU的工作过程

下面列出计算机工作中的一些数据

  • 一级缓存引用时间 0.5纳秒
  • CPU中的误预测 0
  • 二级缓存引用时间 7纳秒
  • 内存引用时间 100纳秒
  • 互斥锁定/解锁 100纳秒
  • 使用Zippy压缩1Kb数据的时间 1万纳秒
  • 通过1Gbps网络发送2Kb数据的时间 2万纳秒
  • 从内存中顺序读取 1MB数据的 25万纳秒
  • 数据中心数据交互 50万纳秒
  • 硬盘搜索 1亿纳秒
  • 从网络顺序读取 1MB 数据的时间 1亿纳秒
  • 从硬盘顺序读取 1MB 数据的时间 3亿纳秒
  • 从加拿大发送数据到荷兰并返回数据包的事件 150亿纳秒

  • [置顶]        Android NDK 1 - 指令集、CPU架构与汇编

第一个64位操作系统是如何编译出来的

因为64位的软件需要64位的编译器编译,而64位的编译器需要64位的编译器,这样无限循环。
所以,最初的64位编译器是通过32位编译器软件生成的,从而再能够编译64位的操纵系统。

处理器架构/CPU架构

处理器架构是什么?与CPU指令集间的关系?

处理器的架构是CPU指令集的实现(实现CPU指令集描述的功能)。
比如,CPU如何执行指令、如何分发指令、如何预测分支、流水线中的指令如何退回、如何恢复等,这些都是处理器架构需要解决的问题。
同一指令集可以有不同的处理器架构。
处理器的架构(也称为“微架构”)。

也正因如此,在芯片生成和设计领域,出现了指令集的设计和生产的分离。

处理器的实现

处理器的实现与处理器的架构间的关系?

处理器架构可以看成是处理器的实现/处理器的指令集的实现的逻辑实现。在逻辑上应该如何实现该CPU指令集描述的功能。
处理器实现描述的是如何使用具体的数字电路来实现处理器的架构。

处理器的实现、架构、指令集间的关系?

不同的实现 > 不同的架构 > 不同的指令集

不同的指令集可以采用不同的架构,不同的架构可以使用不同的物理实现。

应用程序兼容

Linux程序不能运行在Window平台上的原因?

根据前面的描述,即使编译的Linux的程序的CPU架构、CPU位数与所运行的Window平台是相同的,还存在系统库函数差异以及可执行文件的格式差异的问题。

为什么Linux的程序可以运行在Mac或Unix机器上?

因为大部分Linux系统兼容POXIS标准,如果该程序使用的是标准库中的函数,那么就可以兼容其他平台。

JVM 的跨平台特性

参考

  1. 各大厂商的指令集列表
  2. 各大厂商微处理器列表
  3. 64 位软件和 32 位有什么具体区别?
  4. 处理器架构、指令集和汇编语言间的关系?
  5. 读图学C语言:编译时发生了什么
  6. 为什么Linux和Window的可执行文件不能通用?
  7. 为什么不同系统不能兼容同一个已编译的可执行二进制文件?
  8. CPU的工作过程