ABI和EABI和OABI
http://en.wikipedia.org/wiki/Application_binary_interface
·data type,size 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.
什么是EABI?
Embedded application binaryinterface, 即嵌入式应用二进制接口,是描述可连接目标代码,库目标代码,可执行文件影 像,如何连接,执行和调试,以及目标代码生成过程,和c, c++语言接口的规范,是编译连接工具的基础规范,也是研究它们工作原理的基础,可惜arm的EABI迄今为止没有完全订好。作为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>