标签:
MIPS指令集架构自MIPS3起正式支持64位工作模式,故编码可以遵从o32(o意思是old)、n32(n意思是new)与n64等ABI。
性能方面,64位环境并不一定优于32位环境。
前者在带来更大地址空间的同时,也带来了成倍增长的系统开销。
例如,指针与变量类型的长度变化几乎等同于去掉了处理器上一半的缓存,这对某些运算模型的影响是致命的。
MIPS N32 ABI在保留 MIPS N64 ABI 的几乎所有特性的情况下(主要是寄存器和堆栈中的函数参数传递约定),
重点在于仅将long long与double类型编译为64位,
其余指针与变量类型设定与o32相同(例如,指针和long int是32位的),因此更接近MIPS N64 ABI 。
理由是在一个 32-bit 地址空间足够的使用的应用程序上使用 64-bit 的指针不会带来任何好处。
虽然它是 32-bit 的,但和 MIPS O32 ABI 的差异是非常之大了,这也应该将它归类到 MIPS64 家族中。
无论是32还是n64都是应用于64位MIPS,他们所使用的寄存器宽度都是64位。
在堆栈中,n32/n64使用8个字节存放一个函数参数,这样是为了和寄存器的宽度保持一致。
堆栈参数结构规定需要对其到double(或long long)数据类型的宽度,
因此MIPS N32和N64要求栈对齐到 16 字节。
数据类型只有当自然对齐的情况,才可以用标准的 MIPS 指令直接处理。
除了算法上的提升,因为N32使用了处理器的一部分64位特性,也保证了性能的提升。
因为N32仍然保留了32位模式,很多O32代码只需要重新编译为N32就可以获得性能提升。
实际上,N32对代码的要求比较严格,将基于O32的代码转换为N32代码通常要进行修改,然后才能成功编译。
N32 ABI和O32 ABI并不是二进制兼容的。O32编译的应用程序模块不能链接到N32编译的应用程序模块。
整个应用程序必须使用相同的编译设置。
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
标签:
原文地址:http://www.cnblogs.com/yorkwoo/p/4709772.html