【微知】RDMA IB verbs中的ABI是什么?作用是什么?(application binary interface、规范、兼容)
文章目录
- 背景
- 要点
- 举个Linux操作系统的例子
- 举个Intel芯片规范的例子:
- 比如芯片的ABI定义
- 比如操作系统的ABI
- 举个应用程序的例子
- 综述
背景
在RDMA的IB verbs经常看到ABI version中的ABI是什么?
要点
ABI是什么?
ABI:application binary interface 应用二进制接口。是一种规范。一种机器级别的目标代码层接口规范。比如过程调用用的参数传递使用什么规定寄存器。不同代码段之间的通过ABI约定,比如传参和返回值在哪?内存是否对其等?。CPU、编译器和操作系统供应商都提供自己的ABI。
为什么要ABI?
为了兼容。
兼容哪些?
系统调用,函数调用,二进制格式等
举个Linux操作系统的例子
Linux的API包括一些内核接口和用户态接口。比如用户态glibc。
先看Linux ABI?
举个Intel芯片规范的例子:
比如SystemV在Inter386的ABI描述, http://www.sco.com/developers/devspecs/abi386-4.pdf
可以看到描述了这些规范:
比如函数调用序列,操作系统接口,ELF文件结构
比如芯片的ABI定义
寄存器的约定,比如sp就是栈指针:
比如栈的分布:
比如操作系统的ABI
比如内存中加载段的规范,数据段在哪,代码段在哪。操作系统这样规定了,编译器编译的时候就按照这个规范放到哪儿。操作系统执行的时候也就搬到哪。
比如微软ABI是芯片的一个自己比如对寄存器的用途约定是:
- 调用函数传参通过寄存器RCX、RDX、R8和R9来存储前四个参数。浮点用XMM0、XMM1、XMM2和XMM3寄存器
举个应用程序的例子
以Mellanox网卡驱动中ABI的例子来看,他定义了他的二进制程序的一些规范,比如下面是create cq这个行为传参的规范,未来不同版本的用户态库,内核态响应都按照这个来兼容。
struct mlx5_ib_create_cq {__aligned_u64 buf_addr;__aligned_u64 db_addr;__u32 cqe_size;__u8 cqe_comp_en;__u8 cqe_comp_res_format;__u16 flags;__u16 uar_page_index;__u16 reserved0;__u32 reserved1;
};
但是!用户态verbs自己定义了ABI的版本,如果他的ABI版本提高了,就不能兼容了。不过至少ABI定义了如果你版本相同,就能兼容。
/* Increment this value if any changes that break userspace ABI* compatibility are made.*/
#define MLX5_IB_UVERBS_ABI_VERSION 1
综述
因为有了ABI的规范,于是ELF这些结构也就规范了,比如也就能用相同的readelf命令读取不同平台架构(比如mac、x86、嵌入式平台)的二进制文件。包括不同程序语言之间(比如Python调用C)互相调用都离不开ABI的功能。本文主要以芯片、操作系统、用户程序为切面简单看了下ABI是什么?对理解ABI以及理解计算机体系整个结构有一定的帮助。
参考:
https://en.wikipedia.org/wiki/Application_binary_interface
https://cloud.tencent.com/developer/article/1357674