• 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

MIPS ABI n32意味着什么?的更多相关文章

  1. SGI地址模式: O32, N32和N64

    背景 MIPS R10000芯片支持MIPS ABI.遵循这一标准的程序能够运行在遵循这一标准的任何处理器/系统上.目前,主要的支持者有SGI,西门子,Nixdof, Tandem, Pyramid, ...

  2. [解决] No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android

    前端时间项目组让我改一个比较老的项目,说是用Android Studio2.3版本可以直接运行,于是我下载了一个2.3.2的,结果出现了一堆问题,总结下: 首先导入项目后build完直接报出:No t ...

  3. 非法指令(Illegal Instruction)问题定位

    关键词:Illegal Instruction.SIGILL等. 进程在运行过程中会收到SIGILL信号,此类错误是由操作系统发送给进程的. SIGILL是某个进程中的某一句不能被CPU识别指令,这些 ...

  4. 一起聊聊 Swift 3.0

    Swift3.0将会给我们带来哪些改变: 1. 稳定二进制接口(ABI) ABI是什么呢?API大家都知道是应用程序接口 API只是提供函数签名 而ABI是系统和语言层面的 如果ABI稳定 意味着以后 ...

  5. 使用ndk standalone工具链来编译某个平台下的库

    地址: http://www.kandroid.org/ndk/docs/STANDALONE-TOOLCHAIN.html It is now possible to use the toolcha ...

  6. 《Android应用性能优化》1——代码

    1.Java代码优化 1.1 代码执行 通常情况下,不必看应用的字节码.在平台是Android2.2(Froyo)和更高版本的情况下尤其如此,因在Android2.2中引入了实时(JIT)的编译器.D ...

  7. 北航操作系统实验2019:Lab4-1流程梳理

    北航操作系统实验2019:Lab4-1流程梳理 前言 操作系统的实验课实在令人头秃.我们需要在两周时间内学习相关知识.读懂指导书.读懂代码.补全代码.处理玄学bug和祖传bug,以及回答令人窒息的思考 ...

  8. 体系编程、SOC编程那些事儿

    转:https://blog.csdn.net/yueqian_scut/article/details/49968897 笔者将从芯片IC的系统设计的角度去诠释如何掌握体系编程和SOC编程.笔者有超 ...

  9. Android so库文件的区节section修复代码分析

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/78818917 一.Android so库文件的节表secion修复方案整理 1.简 ...

随机推荐

  1. iOS开发XCODE5 SVN配置 使用办法 (转) 收藏一下

    标签: xcode5svn xcodesvn使用 xcode自带的svn xcodesvn版本操作 xcode自带svn版本   这两天响应老板要求,把所有代码放到公司的SVN服务器上,按照我的想法肯 ...

  2. asp.net Ajax刷新和无刷新的区别

    无刷新按钮btnShua 刷新按钮btnWu label控件和calendar控件在updatePanel中显示 两个button按钮在div中 <%@ Page Language=" ...

  3. PPTP VPN 限制一个账号只允许一个用户来登录

    创建auth-up文件 vi /etc/ppp/auth-up chmod a+x /etc/ppp/auth-up auth-up脚本内容如下 #!/bin/sh # get the usernam ...

  4. Python中的range函数用法

    函数原型:range(start, end, scan): 参数含义:start:计数从start开始.默认是从0开始.例如range(5)等价于range(0, 5); end:技术到end结束,但 ...

  5. javascript的数值转换

    在javascript中数值转换,最要的一点是函数第一个字母必须要大写.js中的函数有string字符型.number数值型.null空型.boolean布尔型.undefined未定义. 具体的转换 ...

  6. jquery 中substring,substr,split的用法

    substring 方法 返回位于 String 对象中指定位置的子字符串. strVariable.substring(start, end) 参数 start 指明子字符串的起始位置,该索引从 0 ...

  7. linux命令(3):pwd命令

    Linux中用 pwd 命令来查看”当前工作目录“的完整路径. 简单得说,每当你在终端进行操作时,你都会有一个当前工作目录. 在不太确定当前位置时,就会使用pwd来判定当前目录在文件系统内的确切位置. ...

  8. shift

    -------siwuxie095 shift 更改批处理文件中可替换参数的位置 语法: SHIFT [/n] 如果命令扩展被启用,SHIFT 命令支持 /n 命令行开关:该命令行开关告诉 命令从第 ...

  9. PHP读取CSV数据写入数据库

    /*读取csv文件*/ public function testCsv(){ $fileName = "tel.csv"; $fp=fopen($fileName,"r& ...

  10. java 删除所有HTML工具类

    import java.util.regex.Matcher;import java.util.regex.Pattern; public class HtmlUtil { private stati ...