MIPS ABI n32意味着什么?

时间:2021-08-20 10:42:08
  • ABI是应用程序二进制接口的简称,用于标识处理器的工作模式及规范目标文件的编码格式。

MIPS指令集架构自MIPS3起正式支持64位工作模式,故编码可以遵从o32(o意思是old)、n32(n意思是new)与n64等ABI。

  • o32与n64即纯粹的32位与64位模式,二者除指针与变量类型的长度差异外,n64还用寄存器来传递更多的参数,性能有所提高。

性能方面,64位环境并不一定优于32位环境。
前者在带来更大地址空间的同时,也带来了成倍增长的系统开销。
例如,指针与变量类型的长度变化几乎等同于去掉了处理器上一半的缓存,这对某些运算模型的影响是致命的。

  • MIPS N32 ABI在保留 MIPS N64 ABI 的几乎所有特性的情况下(主要是寄存器和堆栈中的函数参数传递约定),

重点在于仅将long long与double类型编译为64位,

其余指针与变量类型设定与o32相同(例如,指针和long int是32位的),

虽然它是 32位 的,但和 MIPS O32 ABI 的差异是非常之大了,因此更接近MIPS N64 ABI 。

理由是在一个 32位地址空间足够的使用的应用程序上使用 64位 的指针不会带来任何好处。

无论是32还是n64都是应用于64位MIPS,他们所使用的寄存器宽度都是64位。

在堆栈中,n32/n64使用8个字节存放一个函数参数,这样是为了和寄存器的宽度保持一致。

堆栈参数结构规定需要对其到double(或long long)数据类型的宽度,

因此MIPS N32和N64要求栈对齐到 16 字节。

数据类型只有当自然对齐的情况,才可以用标准的 MIPS 指令直接处理。

  • N32 ABI能够提供大约25%的性能,很多客户选择N32来编写应用程序。

除了算法上的提升,因为N32使用了处理器的一部分64位特性,也保证了性能的提升。
因为N32仍然保留了32位模式,很多O32代码只需要重新编译为N32就可以获得性能提升。
实际上,N32对代码的要求比较严格,将基于O32的代码转换为N32代码通常要进行修改,然后才能成功编译。
N32 ABI和O32 ABI并不是二进制兼容的。O32编译的应用程序模块不能链接到N32编译的应用程序模块。
整个应用程序必须使用相同的编译设置。

  • 用file命令可以看到ELF可执行文件的ABI:

file /bin/bash
/bin/bash: ELF 32-bit LSB executable, MIPS, N32 MIPS64 rel2 version 1 (SYSV),
dynamically linked (uses shared libs), for GNU/Linux 3.4.0,
BuildID[sha1]=5563e09f3739cb705281c20dfb67134107fb4ab3, stripped