移动处理器与 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 架构主要有:
- ARMv5
- ARMv7
- ARMv8
- x86
- x86_64
- MIPS
- MIPS64
常用 ABI 主要有:
- armeabi (逐步减少)
- armeabi-v7a (目前大部分机型)
- arm64-v8a (越来越多机型支持)
- x86 (稀少)
- x86_64 (稀少)
- mips (稀少)
- 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。
mips 和 mips_64: 属于 MIPS 架构,与 x86,x86_64 类似。