发布时间:2014-09-05 16:52:26作者:知识屋
这篇文章对最近遇到上的 arm上浮点运算的问题做一个总结。
首先,我们先看一下arm处理器是如何处理浮点运算的。
交叉编译器在编译的时候,对于浮点运行会预 设硬浮点运算FPA(Float Point Architecture),而没有FPA的CPU,比如SAMSUNG S3C2410/S3C2440,会使用FPE(Float Point Emulation 即软浮点),这样在速度上就会遇到极大的限制。也就是说如果有浮点协处理器则交给它去做,如果没有则会产生一个陷阱(trap,处理器响应异常的机制), 而我们事先准备好针对浮点指令的陷阱处理程序就可以通过软件来模拟浮点运算指令。
然后,我们 解释一下OABI和EABI这两个概念。
/********************************************************************************************/以下部分转 载至 linux.chinaunix.net/bbs/thread-1143604-1-1.html">http://linux.chinaunix.net/bbs/thread-1143604-1-1.html . 1.什么是ABI ABI,application binary interface (ABI),应用程序二进制接口。
既然是 接口,那就是某两种东西之间的沟通桥梁,此处有这些种情况:A.应用程序 <-> 操作系统;B.应用程序 <-> (应用程序所用到的)库C .应用程序各个组件之间
类似于API的作用 是使得程序的代码间的兼容,ABI目的是使得程序的二进制(级别)的兼容。
2.什么是OABI 和 EABI OABI中的O,表示 “Old”,“Lagacy”,旧的,过时的,OABI就是旧的/老的ABI. EABI中的E,表示“Embedded”,是一种新的ABI. EABI 有时候也叫做GNU EABI. OABI和EABI都是专门针对arm的CPU来说的。
3.EABI的好处 / 为何要用EABI A.支持软件浮点和硬件实现浮点功 能混用B.系统调用的效率更高C.后今后的工具更兼容D.软件浮点的情况下,EABI的软件浮点的效率要比OABI高很多。
4.OABI和EABI的区别两种ABI在如下方面有区别:A.调用规则(包括参数如何传递及如何获得返回 值)
B.系统调用的数目以及应用程序应该如何去做系统调用C.目标文件的二进制格式,程序库等D.结构体中的 填充(padding/packing)和对齐。
E. OABI:* ABI flags passed to binutils: -mabi=apcs-gnu -mfpu=fpa * gcc -dumpmachine: arm-unknown-linux * objdump -x for compiled binary:
private flags = 2: [APCS-32] [FPA float format] [has entry point] * "file" on compiled Debian binary:ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.2.0, dynamically linked (uses shared libs), for GNU/Linux 2.2.0, stripped * "readelf -h | grep Flags"" Flags: 0x0 EABI:* ABI flags passed by gcc to binutils: -mabi=aapcs-linux -mfloat-abi=soft -meabi=4 * gcc -dumpmachine: arm-unknown-linux-gnueabi * objdump -x for compiled binary:private flags = 4000002: [Version4 EABI] [has entry point] * "file" on compiled binary (under Debian):ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.4.17, dynamically linked (uses shared libs), for GNU/Linux 2.4.17, stripped * "readelf -h | grep Flags"" Flags: 0x4000002, has entry point, Version4 EABI /********************************************************************************************/在虚拟机 中,运行:arm_v5t_le-gcc -dumpmachine,输出:armv5tl-montavista-linuxeabi;运行 arm_v5t_le-readelf -h EXEC | grep Flags,(注:EXEC代表用交叉编译工具编译的可执行文件名),输出: Flags: 0x4000002, has entry point, Version4 EABI.上述结果说 明当前使用的montavista的编译器是符合EABI标准的。
使用EABI(Embedded Application Binary Interface)则可以对此改善处理,arm EABI有许多革新之处,其中最突出的改进就是Float Point Performance,它使用Vector Float Point(矢量浮点),因此可以极大提高涉及到浮点运算的程序。
看到这里,之前遇到的一个问题终于弄明白 了。之前在Makefile中一直包含一个-mabi=apcs-gnu的参数,而apcs-gnu是OABI的参数,因此将OABI的参数传给符合 EABI标准的编译,编译阶段没有报错,但在板上运行时,程序中涉及到浮点数的部分出现了许多莫名的问题。比如printf("%s %f",s,f);这句话输出的浮点数值并不是传给printf的参数,而是一个莫名其妙的数字。解决办法:在Makefile中将 “-mabi=apcs-gnu”去掉,重新编译运行,成功!
linux一键安装web环境全攻略 在linux系统中怎么一键安装web环境方法
Linux网络基本网络配置方法介绍 如何配置Linux系统的网络方法
Linux下DNS服务器搭建详解 Linux下搭建DNS服务器和配置文件
对Linux进行详细的性能监控的方法 Linux 系统性能监控命令详解
linux系统root密码忘了怎么办 linux忘记root密码后找回密码的方法
Linux基本命令有哪些 Linux系统常用操作命令有哪些
Linux必学的网络操作命令 linux网络操作相关命令汇总
linux系统从入侵到提权的详细过程 linux入侵提权服务器方法技巧
linux系统怎么用命令切换用户登录 Linux切换用户的命令是什么
在linux中添加普通新用户登录 如何在Linux中添加一个新的用户
2012-07-10
CentOS 6.3安装(详细图解教程)
Linux怎么查看网卡驱动?Linux下查看网卡的驱动程序
centos修改主机名命令
Ubuntu或UbuntuKyKin14.04Unity桌面风格与Gnome桌面风格的切换
FEDORA 17中设置TIGERVNC远程访问
StartOS 5.0相关介绍,新型的Linux系统!
解决vSphere Client登录linux版vCenter失败
LINUX最新提权 Exploits Linux Kernel <= 2.6.37
nginx在网站中的7层转发功能