ABI和EABI和OABI

ABI和EABI和OABI

http://en.wikipedia.org/wiki/Application_binary_interface

  1. ABI(Application binary interface)应用程序二进制接口
    1. 在计算机软件中,ABI在一个计算机应用程序和操作系统或者另一个应用程序之间做低级接口。
    2. 这个接口包含了以下内容:

·data typesize and alignment

·calling convention(调用规范)

·how an application should make system calls to theoperating system and, if the ABI specifies direct system calls rather thanprocedure calls to system call stubs, the system call numbers

·and in the case of a complete operating system ABI,the binary format of object files, program libraries and so on.

  1. ABI不同于API(application)API是用来定义被调用库的规范,可被操作的数据结构,and/or 一些使用特殊API的应用程序的架构的工程类

 

  1. OABIEABI

什么是EABI?

Embedded application binaryinterface, 即嵌入式应用二进制接口,是描述可连接目标代码,库目标代码,可执行文件影 像,如何连接,执行和调试,以及目标代码生成过程,和c, c++语言接口的规范,是编译连接工具的基础规范,也是研究它们工作原理的基础,可惜armEABI迄今为止没有完全订好。作为EABI的组成部分有过 程调用规范,可执行文件格式规范,c/c++ ABI规范和调试格式规范。

EABI ,说的是这样的一种新的系统调用方式

mov r7, #num

swi 0x0

原来的系统调用方式是这样,

swi (#num | 0x900000) (0x900000是个magic值)

也就是说原来的调用方式(Old ABI)是通过跟随在swi指令中的调用号来进行的,现在的是根据r7中的值。

现在看两个宏,一个是

CONFIG_OABI_COMPAT 意思是说和old ABI兼容

另一个是

CONFIG_AEABI 意思是说指定现在的方式为EABI

这两个宏可以同时配置,也可以都不配,也可以配置任何一种。

我说一下内核是怎么处理这一问题的。

我们知道,sys_call_table在内核中是个跳转表,这个表中存储的是一系列的函数指针,这些指针就是系统调用函数的指针,如(sys_open).系统调用是根据一个调用号(通常就是表的索引)找到实际该调用内核哪个函数,然后运行该函数完成的。

首先,对于oldABI,内核给出的处理是给它建立一个单独的system calltable,sys_oabi_call_table,这样,兼容方式下就会有两个system call table, oldABI方式的系统调用会执行old_syscall_table表中的系统调用函数,EABI方式的系统调用会用sys_call_table 的函数指针。

配置无外乎以下4中

第一 两个宏都配置 行为就是上面说的那样

第二 只配置CONFIG_OABI_COMPAT , 那么以oldABI方式调用的会用sys_oabi_call_table,以EABI方式调用的 用sys_call_table,和1实质相同,只是情况1更加明确。

第三 只配置CONFIG_AEABI 系统中不存在 sys_oabi_call_table, 对oldABI方式调用不兼容。只能 以EABI方式调用,用sys_call_table

第四 两个都没有配置 系统默认会只允许oldABI方式,但是不存在old_syscall_table,最终会通过sys_call_table 完成函数调用

 

源文档 <http://baike.baidu.com/view/3547622.htm>


你可能感兴趣的:(ABI和EABI和OABI)