abi,是比api更贴近硬件的一层接口,它规定的是二进制代码之间的调用规则。举个例子来说吧!一个应用程序,调用了.so库中的函数或者系统调用,如果它的编译器可以找到被调用函数或者系统调用的话,则编译可以同过,也就是说,它是用的api是正确的。但是,这个调用离成功还很远。。。。。 首先,如果编译出来的代码和运行库函数和系统调用的代码不是一个硬件平台的,则这个应用根本就不能和被调用代码运行在一起,则调用不会成功。
即使库函数、系统调用和是运行在同一硬件平台上的调用也不一定会趁成功。因为程序最终是被编译成二进制代码的,并且是要加载到内存中运行的。那么,在调用
库函数或者系统调用的时候,应用要先要以库函数或者系统调用指定的方式和位置(内存或者寄存器)设置参数,然后通过中断或者其他方式跳转到被调用代码的起
始处进行执行,被调用代码从指定位置去到参数,处理完毕之后再将结果放到指定的位置,最后应用再到指定的地方取回结果,调用完毕!
我认为这个过程中,存放参数和结果的位置属于abi规定的范围,被调用程序的跳转地址或者中断号码也是abi规定的范围。如果存取参数、结果的位置没有明
确的规范,或者调用、被调用双方没有遵照统一个规范,那么这个调用能够根本就不可能成功;如果系统提供的库函数路径不正确,调用也不会成功;如果中断代码
使用错误,调用也不会正确。
为了方便能看明白,我用使用比较广泛的C语言和X86架构去举例API:程序员编程时用到的库函数像C的stdio.h中的printf()函数。api可以大大提高程序的开发效率,缩短源码。你在编程时直接引入库文件#include<stdio.h>调用printf()即可。不用再自己写printf()函数的具体实现代码。
ABI:是一个规则或者说标准吧,他规定了数据类型,存放方式,函数/方法(参数,返回值,返回地址,变量的存放位置和格式)等等,例如X86的函数参数存放在DI,SI,DX,CX几个寄存器中,返回值存放在AX中,小端格式存放等等。作用是为了方便同一平台不同系统的软件移植吧。
我自己觉得这个ABI可以把它纳入ISA 指令集架构的范畴了(这个只是我为了方便题主你理解啊,ISA的定义并不包含ABI哈~)。。因为同一个ISA的ABI都相同。。。
我尝试举个通俗点的例子,api有点“前人栽树后人乘凉”的味道(编译器制作初期编写函数,开发者使用时直接调用函数名)。ABI就像是前人留下来的一些定理(你必须按照这定理去做,不然将会有大麻烦)。
~~~~~~~~~~~~~~~~~有问题可以继续提问,
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)