本文译至:https://blogs.oracle.com/jtc/entry/is_it_armhf_or_armel

ARM处理器有各种品牌和规格,其中一部分的原因涉及到市场问题,成本,大小和功耗的要求是非常宝贵的。在这个前提下,甚至包含一个浮点单元也被认为是不必要的奢侈品。为了在这些处理器上执行浮点运算,软件模拟是必需的。 

更高端的ARM处理器都捆绑浮点运算硬件的附加功能。这两种架构之间的差异产生了针对ARM的两个不同的EABI(嵌入式应用程序二进制接口):软浮点和VFP(向量浮点)。虽然在软硬浮点之间具备前向兼容性,但不存在后向兼容性。事实上,当为ARM嵌入式Java SE提供二进制文件时,Oracle提供了两个独立的选择:一个软浮点二进制和一个VFP二进制。在Linux社区,基于这两个EABI的发布均称为是基于armel发布的。 

进入armhf后,虽然在性能上迈出了一大步,但VFP EABI在浮点运算时使用了非最优的参数传递方式。在这种情况下,浮点参数在浮点运算单元执行之前必须首先通过整数寄存器传递。新EABI,指的是armhf优化了调用约定,将参数直接传递到浮点寄存器浮点运算。它还包括一个更有效的系统调用约定。最终的结果是用armhf标准编译的程序在一些情况下表现出一定的性能改善,而在浮点密集型应用程序上表现出显著的改进。

同时,armhf代表了另一种二进制不兼容的标准,但是在社区已经获得了相当的牵引力。虽然还相对较早,但从armel到armhf的过渡正在进行中。事实上,Ubuntu已经已经宣布,未来的版本将只构建在armhf标准之上,并有效地淘汰armel。正如Henrik Stahl的博客提到的,Java SE Embedded的一个armhf版本正在进行中,我们已经完成了以基于armhf的JDK8 JavaFX 开发者预览版。 

在此期间,我们将不得不面对armel和armhf之间的不兼容问题。最近,我们已经看到了一些轻率的错误尝试,他们试图在基于armhf 的Linux发行版上运行的ARMv7 VFP的Java SE Embedded。 在诊断过程中,问题就变成了,我怎么能确定我的Linux发行版是基于armel或是armhf?原来这不是像人们想象的那样简单。除了经验和传闻,来确定你是否在armel或armhf运行的一种可能的方式是运行以下晦涩的命令:

pi@raspberrypi:~$ readelf -A /proc/self/exe | grep Tag_ABI_VFP_args

Tag_ABI_VFP_args: VFP registers

如果找到Tag_ABI_VFP_args标签,那么你是在一个armhf系统上运行。如果没有返回,那么它是armel。

为了向你展示一个例子,这里有一个运行Raspbian发行版的树莓派上的结果: 

pi@raspberrypi:~$ readelf -A /proc/self/exe | grep Tag_ABI_VFP_args
  Tag_ABI_VFP_args: VFP registers

这表示是一个armhf发行版,这实际上就是Raspbian。

在原有的,软浮点Debian Wheezy 发行版上,结果如下:

pi@raspberrypi:~$ readelf -A /proc/self/exe | grep Tag_ABI_VFP_args
没有返回表明这的确是armel。 

参考链接:http://blog.csdn.net/robertsong2004/article/details/38776457

05-11 09:33