Operating system API和ABI的概念

Operating system API和ABI的概念,operating-system,Operating System,我把API(应用程序编程接口)和ABI(应用程序二进制接口)搞混了。有人能给我解释一下这两个接口的概念和区别吗?API定义了模块在源代码级别向其客户机提供的对象和方法。如何实例化它的对象?您需要将哪些参数传递给它的方法,它们返回什么?通常,当您想知道哪些库函数可用以及如何使用它们时,您需要询问API ABI是一个较低级别的概念。它定义了模块与其客户端之间传递的位和字节。它们是什么格式的?它们是被推到堆栈上、传入寄存器还是存储在其他地方?当函数返回时是否需要清理堆栈?如果需要,谁负责处理它 完全愚

我把API(应用程序编程接口)和ABI(应用程序二进制接口)搞混了。有人能给我解释一下这两个接口的概念和区别吗?

API定义了模块在源代码级别向其客户机提供的对象和方法。如何实例化它的对象?您需要将哪些参数传递给它的方法,它们返回什么?通常,当您想知道哪些库函数可用以及如何使用它们时,您需要询问API

ABI是一个较低级别的概念。它定义了模块与其客户端之间传递的位和字节。它们是什么格式的?它们是被推到堆栈上、传入寄存器还是存储在其他地方?当函数返回时是否需要清理堆栈?如果需要,谁负责处理它

完全愚蠢但很有启发性的例子:

考虑将两个整数相乘的库函数:

long long multiply(unsigned int multiplicand, long multiplier);
它的API指定使用两个参数(无符号整数和有符号长整数)调用它,并返回有符号双精度长整数

它的ABI可能会指定您这样使用它:

  • 以MSB到LSB的顺序将堆栈上的返回地址作为绝对64位地址推送。函数完成后,程序将继续在该地址执行
  • 将32位值按MSB到LSB顺序推送到堆栈上。它表示无符号被乘数
  • 在累加器寄存器中以MSB到LSB的顺序存储64位值。它以2的补码形式表示有符号乘法器
  • 跳转到相对于程序开头的地址0xADDADD以执行函数
  • 完成后,获取堆栈上的前4个字节,并将值的前4个字节追加到累加器寄存器中,以LSB到MSB的顺序创建带符号的64位乘积,格式为一补。调用者必须从堆栈中删除4个字节,以及4个字节的被乘数和8个字节的返回地址,才能恢复堆栈

如果我是你,我会找到另一个数学图书馆。这个太可怕了!:-)

看看维基百科,然后带着一个具体的问题回来。