Atitit ABI FFI 的区别与联系 attilax总结

FFI stands for Foreign Function Interface. A foreign function interface is the popular name for the interface that allows code written in one language to call code written in another language. The ‘libffi’ library really only provides the lowest, machine dependent layer of a fully featured foreign function interface. A layer must exist above ‘libffi’ that handles type conversions for values passed between the two languages.

大体意思就是libffi用于高级语言之间的相互调用。由于函数指针,参数类型,参数个数,参数的值都可以在运行时指定,所以在脚本语言调用c里面用的比较多,比如Python 的ctypes;也可以调用不同abi(应用程序二进制接口)编译的程序,这个了解的不多。

FFI库允许调用外部C函数以及使用C数据结构.这意味着我们可以通过它来调用一些系统API或DLL的函数,像调用LIBCURL来实现网络功能.等…

ABI:是一个规则或者说标准吧,他规定了数据类型,存放方式,函数/方法(参数,返回值,返回地址,变量的存放位置和格式)等等,例如X86的函数参数存放在DI,SI,DX,CX几个寄存器中,返回值存放在AX中,小端格式存放等等。作用是为了方便同一平台不同系统的软件移植吧。

我自己觉得这个ABI可以把它纳入ISA  指令集架构的范畴了(这个只是我为了方便题主你理解啊,ISA的定义并不包含ABI哈~)。。因为同一个ISA的ABI都相同。。。

我尝试举个通俗点的例子,api有点“前人栽树后人乘凉”的味道(编译器制作初期编写函数,开发者使用时直接调用函数名)。ABI就像是前人留下来的一些定理(你必须按照这定理去做,不然将会有大麻烦)。

应用程序二进制接口(ABI-Application Binary Interface)定义了一组在PowerPC系统软件上编译应用程序所需要遵循的一套规则。主要包括基本数据类型,通用寄存器的使用,参数的传递规则,以及堆栈的使用等等。

而 ABI 是另一种形式的接口,二进制接口。除非你直接使用汇编语言,这种接口一般是不能直接拿来用的。比如,内核系统调用用哪些寄存器或者干脆用堆栈来传递参数,返回值又是通过哪个寄存器传递回去,内核里面定义的某个结构体的某个字段偏移是多少等等,这些都是二进制层面上的接口。这些接口是直接给编译好的二 进制用的。换句话说,如果 ABI 保持稳定的话,你在之前版本上编译好的二进制应用程序、内核模块,完全可以无须重新编译直接在新版本上运行。另一种比较特殊的 ABI 是像 /proc,/sys 目录下面导出的文件,它们虽然不是直接的二进制形式,但也会影响编译出来的二进制,如果它里面使用到它们的话,因此这些“接口”也是一种 ABI。

你平时看到的什么 POSIX 标准啊,C99 标准啊,都是对 API 的规定。而规定 ABI 的标准就不多,而且也没那么强势,Linux 上面的 ABI 标准似乎只有 Linux Foundation 提供的一些标准

好了,从上面我 们可以看出,其实保持一个稳定的 ABI 要比保持稳定的 API 要难得多。比如,在内核中 int register_netdevice(struct net_device *dev) 这个内核函数原型基本上是不会变的,所以保持这个 API 稳定是很简单的,但它的 ABI 就未必了,就算是这个函数定义本身没变,即 API 没变,而 struct net_device 的定义变了,里面多了或者少了某一个字段,它的 ABI 就变了,你之前编译好的二进制模块就很可能会出错了,必须重新编译才行。

嵌入式应用二进制接口

编辑

嵌入式应用二进制接口 EABI: embedded application binary interface指定了文件格式、数据类型、寄存器使用、堆积组织优化和在一个嵌入式软件中的参数的标准约定。开发者使用自己的汇编语言也可以使用EABI作为与兼容的编译器生成的汇编语言的接口。 支持EABI的编译器创建的目标文件可以和使用类似编译器产生的代码兼容,这样允许开发者链接一个由不同编译器产生的库。EABI与关于通用计算机的ABI的主要区别是应用程序代码中允许使用特权指令,不需要动态链接(有时是禁止的),和更紧凑的堆栈帧组织用来节省内存。 广泛使用EABI的有Power PC和ARM。

ABI涵盖了各种细节,如:

·

数据类型的大小、布局和对齐;

·

·

调用约定(控制着函数的参数如何传送以及如何接受返回值),例如,是所有的参数都通过栈传递,还是部分参数通过寄存器传递;哪个寄存器用于哪个函数参数;通过栈传递的第一个函数参数是最先push到栈上还是最后;

·

·

系统调用的编码和一个应用如何向操作系统进行系统调用;

·

·

以及在一个完整的操作系统ABI中,目标文件二进制格式、程序库等等。

·

[分享] LuaJIT的FFI调用WINDOWS API功能示例 _ chenall‘s Blog.html

ABI(应用程序二进制接口)_百度百科.html

API、ABI区别 - 阳光-源泉 - 博客园.html

作者:: 绰号:老哇的爪子claw of Eagle 偶像破坏者Iconoclast image-smasher

捕鸟王"Bird Catcher 王中之王King of Kings 虔诚者Pious 宗教信仰捍卫者 Defender Of the Faith. 卡拉卡拉红斗篷 Caracalla red cloak

简称:: Emir Attilax Akbar 埃米尔 阿提拉克斯 阿克巴

全名::Emir Attilax Akbar bin Mahmud bin  attila bin Solomon bin adam Al Rapanui 埃米尔 阿提拉克斯 阿克巴 本 马哈茂德 本 阿提拉 本 所罗门 本亚当  阿尔 拉帕努伊

常用名:艾提拉(艾龙),  EMAIL:[email protected]

头衔:uke总部o2o负责人,全球网格化项目创始人,

uke宗教与文化融合事务部部长, uke宗教改革委员会副主席

,Uke部落首席大酋长,

uke制度与重大会议委员会委员长,uke保安部首席大队长,uke制度检查委员会副会长,

奶牛科技cto ,uke 首席cto

uke波利尼西亚区大区连锁负责人,克尔格伦群岛区连锁负责人,莱恩群岛区连锁负责人,uke汤加王国区域负责人。布维岛和南乔治亚和南桑威奇群岛大区连锁负责人

Uke软件标准化协会理事长理事长 uke终身教育学校副校长

Uke 数据库与存储标准化协会副会长 uke出版社编辑总编

Uke医院方面的创始人

转载请注明来源:attilax的专栏  ?http://www.cnblogs.com/attilax/

--Atiend

 

时间: 2024-10-12 03:24:53

Atitit ABI FFI 的区别与联系 attilax总结的相关文章

Atitit 图像处理 调用opencv 通过java  api   attilax总结

Atitit 图像处理 调用opencv 通过java  api   attilax总结 1.1. Opencv java api的支持 opencv2.4.2 就有了对java api的支持1 1.2. 安装2016-05-19  opencv v2.4.13   267M  ,一个压缩包解压即可1 1.3. Opencv d java 接口api  ,把opencv-2413.jar加入java项目1 1.4. /AtiPlatf_ee/src/com/attilax/img/SfitTes

atitit。流程图的设计与制作 attilax 总结

atitit.流程图的设计与制作 attilax 总结 1. 流程图的规范1 2. 绘图语言2 2.1. atitit.CSDN-markdown编辑器2 2.2. js-sequence-diagrams 2 3. 成员软件 axure  (10M)2 4. visio3 5. 参考3 5.1.1. paip.流程图的图形化编程及源码生成时序图 -?attilax的专栏 - ...3 5.1.2. paip.提升效率---源码生成流程图工具 -?attilax的专栏 - 博客频道...3 1.

Atitit. Object-c语言 的新的特性  attilax总结

Atitit. Object-c语言 的新的特性  attilax总结 1.1. Object-C语言由 Brad J.Cox于20世纪80年代早期设计,1 1.2. Object-C新增的数据结构:1 1.3. 类扩展1 1.4. 动态特性 Object-C中一个强大的特性就是它的动态因素.2 1.5. 多重继承的偏方  一个类可以实现若干的协议,从这个角度实现了类的多重继承.2 1.6. 实体方法   静态函数  减号“-”  加号“+” 声明2 1.7. 调用方法:Objective-C里

Atitit.数据库存储引擎的原理与attilax 总结

Atitit.数据库存储引擎的原理与attilax 总结 1. 存储引擎是什么1 2. 其它数据库系统(包括大多数商业选择)仅支持一种类型的数据存储2 3. 表的存储有三个文件:结构+数据+索引2 4. 页和字段2 5. 数据存取的选择:行存储还是列存储?3 6. 常见的存储引擎3 6.1. 简单类型MyISAM.3 6.2. 复杂类型,支持事务与外键 MySQL存储引擎[InnoDB.3 6.3. InnoDB数据存储结构3 6.4. Memory](Heap) 存储引擎5 6.5. NDBC

atitit.微信支付的教程文档 attilax总结

atitit.微信支付的教程文档 attilax总结 1. 支付流程概览 1 2. 设置支付起始目录   host/app/paydir/ 1 3. 设置oauth验证域名 1 4. 测试目录 可以使用ip,但必须80端口好像. 1 5. 发起测试支付,菜单  host/fromother.jsp 2 6. Start.jsp 2 7. 获取openid的page接口,并制定回调接口 2 8. 开始支付页面 3 9. 生成js调用支付接口 4 10. 注意事项 5 10.1. 预支付的签名and

Atitit。激活某个程序的api attilax总结

Atitit.激活某个程序的api attilax总结 1. 设置当前某窗口为当前窗口,有几个步骤要做:1.得到窗口句柄FindWindow2.切换键盘输入焦点AttachThreadInput3.显示窗口ShowWindow(有些窗口被最小化/隐藏了)4.更改窗口的Zorder,SetWindowPos使之最上,为了不影响后续窗口的Zorder,改完之后,再还原5.最后SetForegroundWindow这样应该可以保窗体跑到前台吧?? 作者:: 老哇的爪子 Attilax 艾龙,  EMA

Atitit. 构造ast 语法树的总结attilax oao

Atitit. 构造ast 语法树的总结attilax oao 1. 能那更加有意义的名字来命名ast节点... 1 2. 如何命名表达式名称..使用实际对象名称,而不是操作符号表达式更好 1 2.1. 参考在的ast view 一类的实现... 1 3. ast view (自是个160k的jar ) 2 3.1. 多条语句ast结构 2 3.2. 变量定义 int b,c; 的ast结构 2 3.3. 方法调用meth1(a=1,b=2,c=3);  的ast结构 2 3.4. 注解的ast

Atitit.ati dwr的原理and设计 attilax 总结 java php 版本

Atitit.ati dwr的原理and设计 attilax 总结 java php 版本 1. dwr的优点相对于ajax来说.. 1 2. DWR工作原理 1 3. Dwr的架构 2 4. 自定义dwr还是native dwr 2 5. ApiHandler的标准化method 2 6. Invok..  Dwr.exe() 2 7. api.jsp 3 8. prj.Wxb distribu   api.jsp 3 9. ----------code 4 10. ApiHandler 4

Atitit图像识别的常用特征大总结attilax大总结

1.1. 常用的图像特征有颜色特征.纹理特征.形状特征.空间关系特征. 1 1.2. HOG特征:方向梯度直方图(Histogram of Oriented Gradient, HOG)1 1.3. (二)LBP特征 LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子4 1.4. :它具有旋转不变性和灰度不变性等显著的优点.它是首先由T. Ojala, M.Pietik?inen, 和D. Harwood 在1994年提出,用于纹理特征提取.而且