移动处理器与 ABI

版权声明:转载请写明出处,谢谢! https://blog.csdn.net/wilson1068/article/details/87908698

移动处理器与 ABI

ABI

应用程序二进制接口(Application Binary Interface,ABI)描述了应用程序和操作系统之间,一个应用和它的库之间,或者应用的组成部分之间的低接口。

其包含:

  • 数据类型的大小、布局和对齐;
  • 调用约定(控制着函数的参数如何传送以及如何接受返回值),例如:是所有的参数都通过栈传递,还是部分参数通过寄存器传递;哪个寄存器用于哪个函数参数;通过栈传递的第一个函数参数是最先 push 到栈上还是最后;
  • 系统调用的编码和一个应用如何向操作系统进行系统调用;
  • 以及在一个完整的操作系统ABI中,目标文件的二进制格式、程序库等等。

ABI 掩盖了各种细节,例如:

  • 调用约定控制着函数的参数如何传送以及如何接受返回值;
  • 系统调用的编码和一个应用如何向操作系统进行系统调用;
  • 以及在一个完整的操作系统ABI中,对象文件的二进制格式、程序库等

ABI 允许编译好的目标代码在是使用兼容 ABI 的系统中无需改动就能运行。

EABI

嵌入式应用二进制接口(Embedded Application Binary Interface,EABI)指定了文件格式、数据类型、寄存器使用、堆积组织优化和在一个嵌入式软件中的参数的标准约定。

开发者使用自己的汇编语言也可以使用 EABI 作为与兼容的编译器生成的汇编语言的接口。

支持EABI的编译器创建的目标文件可以和使用类似编译器产生的代码兼容,这样允许开发者链接一个由不同编译器产生的库。

EABI 与关于通用计算机的ABI的主要区别是应用程序代码中允许使用特权指令,不需要动态链接(有时是禁止的),和更紧凑的堆栈帧组织用来节省内存。 广泛使用 EABI 的有 Power PC 和 ARM 。

移动处理器

常用 CPU 架构主要有:

  1. ARMv5
  2. ARMv7
  3. ARMv8
  4. x86
  5. x86_64
  6. MIPS
  7. MIPS64

常用 ABI 主要有:

  1. armeabi (逐步减少)
  2. armeabi-v7a (目前大部分机型)
  3. arm64-v8a (越来越多机型支持)
  4. x86 (稀少)
  5. x86_64 (稀少)
  6. mips (稀少)
  7. mips64 (稀少)

大部分 CPU 都支持多种 ABI(当然也有只支持一种 ABI 的),其中的支持情况如下:

CPU \ ABI armeabi armeabi-v7a arm64-v8a mips mips64 x86 x86_64
ARMv5 支持
ARMv7 支持 支持
ARMv8 支持 支持 支持
MIPS 支持
MIPS64 支持 支持
x86 支持(3) 支持(2) 支持(1)
x86_64 支持 支持 支持

对于 x86 的说明:

x86 设备上,选择 ABI 的优先级

  • libs / x86 目录中如果存在 .so 文件的话,会被安装
  • 如果不存在,则会选择 armeabi-v7a 中的 .so 文件
  • 如果也不存在,则选择 armeabi 目录中的 .so 文件

x86 设备能够很好的运行 ARM 类型函数库,但并不保证 100% 不发生 crash,特别是对旧设备,因为是运行在 x86 设备上模拟 arm 的虚拟层上。

ARM 架构属于 RISC 指令集,指令集精简、指令等长,虽然这样的设计可以提高处理效率,但在遇到复杂的指令后,就需要更多的简单指令来堆砌复杂任务;ARM 从来只是设计低功耗处理器。其宗旨是设计低功耗处理器,这是他们的强项。

X86构架是英特尔推出的一种复杂指令集,用于控制芯片的运行的程序,目前该构架的处理器已经广泛运用在 PC 领域,由于 X86 构架的处理器芯片在性能上比较强劲,善于执行复杂工作,所以当英特尔进军移动市场领域后(例如联想 K800 ),就出现了 X86 的架构。X86 构架属于典型的 CISC,指令集丰富,指令不等长,善于执行复杂工作,更强调串行性能,它的整体运算能力要比只为移动而生的 ARM 架构强大,并且在 PC 领域已经广泛应用,拥有深厚的技术背景。英特尔设计超高性能的台式机和服务器处理器,并且的确做的不错。

MIPS 架构是一种高性能的嵌入式 CPU 构架,其出发点是高性能,主要用于路由器、猫等。

armeabi:ARM 架构的默认选项,支持基于 ARMv5TE 的设备,支持软浮点运算,但不支持硬件辅助浮点运算,支持所有的 ARM 设备。

armeabi-v7a:armeabi-v7a 向下兼容,在兼容 armeabi 的基础上,支持基于 ARMv7 的设备,支持硬件 FPU 指令,支持硬件浮点运算,目前大部分机器都属于 armeabi-v7a。

arm64-v8a:arm64-v8a 向下兼容 armeabi 和 armeabi-v7a,最主要的区别在于 arm64-v8a 支持 64 位,在 MIPS64 架构上增加了 ARMv7 架构中已经拥有的的 TrustZone 技术、虚拟化技术及 NEON advanced SIMD 技术等特性(ARM 收购 MIPS)。架构中包含两个执行状态:AArch32(也就是我们常说的 ARMv7)和 AArch64(ARMv8),也就是说64位的 ARM 处理器中同时包含着 32 位的 ARMv7 和 64 位的 ARMv8 两种架构,直接导致每种架构所拥有的晶体管减半。

x86:英特尔推出的32位CPU架构,生成的二进制代码可支持包含基于硬件的浮点运算的 IA-32 指令集,同时,x86 机器基本上可以使用 intel 的 libhounini 项目直接在 x86 机器上运行仅含 armeabi 的动态库代码,也就会说 x86 机器对 armeabi 也能够兼容,不过性能上会有些损耗。

x86_64:英特尔推出的 64 位 CPU 架构,向下兼容 x86。

mipsmips_64: 属于 MIPS 架构,与 x86,x86_64 类似。

猜你喜欢

转载自blog.csdn.net/wilson1068/article/details/87908698