ABI(Application Binary Interface)

本文深入解析ABI(应用二进制接口)与API(应用程序编程接口)的区别与联系,重点介绍了ABI如何规范二进制代码之间的调用规则,包括参数传递、寄存器及堆栈使用等方面。
部署运行你感兴趣的模型镜像
ABI 是系统与应用之间的协议. 一个BINARY(EXEC, LIB)必需符合ABI才能在相应的系统上运行.
比如我在PC上用不管什么样的COMPILER, 只要产生符合LINUX的ELF文件, 用相应的INSTRUCTION SET(比如INTEL, PPC, SPARC). 就可以在一个LINUX机器上运行. 调用系统或别人的LIB.
ABI定义了BINARY的文件格式, 内容, 以及装载/卸载程序的要求, 函数调用的参数传递规则, 寄存器, 堆栈的使用等.

      abi(应用二进制接口)我的理解就是机器代码一层的接口。先说一下api(特指系统调用),
api基本上是和机器硬件平台无关但是和操作系统密切相关的接口,一个api调用定义了一个对内核的操作,以及操作的参数。C语言会议函数的形式调用 api。
   
    abi,是比api更贴近硬件的一层接口,它规定的是二进制代码之间的调用规则。举个例子来说吧!
一个应用程序,调用了.so库中的函数或者系统调用,如果它的编译器可以找到被调用函数或者系统
调用的话,则编译可以同过,也就是说,它是用的api是正确的。但是,这个调用离成功还很远。。。。。
   
    首先,如果编译出来的代码和运行库函数和系统调用的代码不是一个硬件平台的,则这个应用根本就不能和被调用代码运行在一起,则调用不会成功。
   
    即使库函数、系统调用和是运行在同一硬件平台上的调用也不一定会趁成功。因为程序最终是被编译成二进制代码的,并且是要加载到内存中运行的。那么,在调用 库函数或者系统调用的时候,应用要先要以库函数或者系统调用指定的方式和位置(内存或者寄存器)设置参数,然后通过中断或者其他方式跳转到被调用代码的起 始处进行执行,被调用代码从指定位置去到参数,处理完毕之后再将结果放到指定的位置,最后应用再到指定的地方取回结果,调用完毕!

    我认为这个过程中,存放参数和结果的位置属于abi规定的范围,被调用程序的跳转地址或者中断号码也是abi规定的范围。如果存取参数、结果的位置没有明 确的规范,或者调用、被调用双方没有遵照统一个规范,那么这个调用能够根本就不可能成功;如果系统提供的库函数路径不正确,调用也不会成功;如果中断代码 使用错误,调用也不会正确。abi 就是在这个层次上对应用程序的一个规范。

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

## ✅ 回答: **Embedded Application Binary Interface(嵌入式ABI,简称 EABI)** 是一种为嵌入式系统定义的二进制接口规范,用于规定编译器生成的可执行文件如何在特定处理器架构下运行,包括函数调用约定、寄存器使用、堆栈布局、数据类型大小、异常处理机制等内容。 它特别适用于没有操作系统的裸机系统(bare-metal)或实时操作系统(RTOS)环境。 --- ## 🔍 为什么需要 EABI? 在嵌入式开发中,多个编译器(如 GCC、IAR、Keil)可能为同一个处理器架构(如 ARM Cortex-M)生成代码。为了确保这些编译器生成的代码可以互相兼容(如链接在一起),需要一个统一的接口标准。EABI 就是这个标准。 --- ## ✅ EABI 的主要组成部分(以 ARM EABI 为例): ### 1. **数据类型大小和对齐规则** - `char`:1 字节 - `short`:2 字节 - `int`:4 字节 - `long`:4 字节 - `long long`:8 字节 - `float`:4 字节(IEEE 754 单精度) - `double`:4 或 8 字节(取决于配置) > **注意**:ARM EABI 支持软浮点(soft-float)和硬浮点(hard-float)两种模式。 --- ### 2. **调用约定(Calling Convention)** - 函数参数通过寄存器(R0-R3)传递,超过部分使用栈。 - 返回值通过 R0 返回(结构体返回通过隐式参数)。 - R4-R11 需要调用者保存。 - R0-R3、R12、LR、PC、CPSR 是调用者可破坏的寄存器。 --- ### 3. **堆栈对齐规则** - 堆栈必须 8 字节对齐(某些架构下为 4 字节)。 - 函数入口需确保堆栈对齐。 --- ### 4. **异常处理和栈展开(Exception Handling / Stack Unwinding)** - 支持 `.cfi_*` 指令(Call Frame Information),用于调试和异常处理。 - 异常栈展开机制(用于 RTOS、中断、异常恢复)。 --- ### 5. **符号命名规则** - C 函数名在汇编中通常以下划线开头(如 `_main`)。 - C++ 支持名称修饰(name mangling)。 --- ## ✅ ARM EABI 的常见变种: | EABI 类型 | 描述 | |-----------|------| | `arm-none-eabi` | 用于裸机开发(无操作系统),支持 Cortex-M 系列 | | `arm-linux-gnueabi` | 用于 Linux 系统,支持软浮点 | | `arm-linux-gnueabihf` | 用于 Linux 系统,支持硬浮点(硬件FPU) | 例如: ```bash arm-none-eabi-gcc # Cortex-M 裸机开发 arm-linux-gnueabi-gcc # ARM Linux 应用程序(软浮点) arm-linux-gnueabihf-gcc # ARM Linux 应用程序(硬浮点) ``` --- ## ✅ EABI 对开发的影响 | 项目 | 说明 | |------|------| | 编译器选择 | GCC、IAR、Keil 等都支持 EABI | | 工具链一致性 | 必须确保编译器、库、链接器使用相同 EABI 版本 | | 调试支持 | EABI 支持 `.cfi` 调试信息,便于调试器解析栈帧 | | 性能优化 | EABI 规定了寄存器使用和函数调用方式,影响代码效率 | --- ## ✅ 示例:使用 EABI 编译裸机程序(Cortex-M4) ```bash arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -mfloat-abi=soft -o main.elf main.c ``` - `-mcpu=cortex-m4`:目标 CPU - `-mthumb`:使用 Thumb 指令集(Cortex-M 只支持 Thumb) - `-mfloat-abi=soft`:使用软浮点(适合无 FPU 的芯片) --- ## ✅ 总结 | 内容 | 说明 | |------|------| | EABI 是什么 | 嵌入式系统下的二进制接口规范 | | 作用 | 保证编译器、库、链接器之间的兼容性 | | 主要内容 | 数据类型大小、调用约定、堆栈对齐、异常处理等 | | ARM EABI 变种 | `arm-none-eabi`(裸机)、`gnueabi`(Linux 软浮点)、`gnueabihf`(Linux 硬浮点) | | 使用场景 | Cortex-M 裸机开发、RTOS、嵌入式 Linux | --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值