• 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. 使用oh-my-zsh后导致的卡顿问题

    现象是每次cd和ll时都会被卡住很长时间根本受不了,最后在官方github查明原因是使用的主题会自动获取git信息,可以使用以下命令禁止zsh自动获取git信息,解决卡顿问题 git config - ...

  2. oracle job的写法

    DECLAREX NUMBER;begin sys.dbms_job.submit(job => x, what => 'begindd_income_risk_control;end;' ...

  3. Postgresql死锁处理

    今天遇到Postgresql的一个问题,部分表记录的update一直无效报错,初步判断为锁表,赶紧进行解决. 1. 查询死锁进程列表 select * from pg_stat_activity wh ...

  4. QuickHit快速击键小程序 --S2.4.5

    我们现在要做一个项目 一个小小的程序 叫做快速击键 很明了的目的 就是在规定时间内,每次出现一组字母的组合,这个字母只能在DFJK中生成 然后输入相应的文字,按回车 自动判断输入的是否正确 在规定时间 ...

  5. DUILIB圆形头象

    #ifndef __UIHEADICON_H__#define __UIHEADICON_H__ /* 名称:圆形头像控件(派生CButtonUI类)*/ class CHeadUI: public ...

  6. dbcp数据源配置杂谈

    <!-- 数据源1 --> #驱动信息(driver, url, username, password)driverClassName=net.sourceforge.jtds.jdbc. ...

  7. 使用spring-data-solr做solr客户端

    solr的客户端基本上只有一个,那就是solrj,spring-data-solr是在solrj的基础上做的封装,使统一成spring-data的风格 官方网站: http://projects.sp ...

  8. 1.jenkins持续集成-jenkins安装

    1.为什们要使用jenkins Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括: 1.持续的软件版本发布/测试项目; 2.监控外部调用执行的工作. 2.安装jen ...

  9. 将三维空间的点按照座标排序(兼谈为std::sort写compare function的注意事项)

    最近碰到这样一个问题:我们从文件里读入了一组三维空间的点,其中有些点的X,Y,Z座标只存在微小的差别,远小于我们后续数据处理的精度,可以认为它们是重复的.所以我们要把这些重复的点去掉.因为数据量不大, ...

  10. Bootstrap插件系列——Bootstrap-table初始化、分页、客户端搜索、服务端搜索

    又好久不写博客,最近项目都是用的bootstrap的样式,不出意外,应该是要在bootstrap的道路上越走越远了,所以下定决心,把bootstrap的插件都好好学学. 昨天写了boostrap-ta ...