天天看点

《Linux设备驱动开发详解 A》一一3.6 工具链

本节书摘来华章计算机出版社《linux设备驱动开发详解 a》一书中的第3章,第3.6节,作者:宋宝华 更多章节内容可以访问云栖社区“华章计算机”公众号查看。1

《Linux设备驱动开发详解 A》一一3.6 工具链

图3.12  crosstool-ng的配置菜单

一个典型的arm linux工具链包含arm-linux-gnueabihf-gcc(后续工具省略前缀)、strip、gcc、objdump、ld、gprof、nm、readelf、addr2line等。用strip 可以删除可执行文件中的符号表和调试信息等来实现缩减程序体积的目的。gprof在编译过程中在函数入口处插入计数器以收集每个函数的被调用情况和被调用次数,检查程序计数器并在分析时找出与程序计数器对应的函数来统计函数占用的时间。objdump是反汇编工具。nm则用于显示关于对象文件、可执行文件以及对象文件库里的符号信息。其中,前缀中的“hf”显示该工具链是完全的硬浮点,由于目前主流的arm芯片都自带vfp或者neon等浮点处理单元(fpu),所以对硬浮点的需求就更加强烈。linux的浮点处理可以采用完全软浮点,也可以采用与软浮点兼容,但是使用fpu硬件的softfp,以及完全硬浮点。具体的abi(application binary interface,应用程序二进制接口)通过-mfloat-abi=参数指定,3种情况下的参数分别是-mfloat-abi=soft/softfp/hard。

在以前,主流的工具链采用“与软浮点兼容,但是使用fpu硬件的softfp”。 softfp使用了硬件的fpu,但是函数的参数仍然使用整型寄存器来传递,完全硬浮点则直接使用fpu的寄存器传递参数。

下面一段程序:

对其使用arm-linux-gnueabihf-gcc编译并反汇编的结果是:

000 08394 :

关注其中加粗的行,可以看出前面的汇编使用s0和s1传递参数,后者则仍然使用arm的r0和r1。测试显示一个含有浮点运算的程序若使用hard abi会比softfp abi快5%~40%,如果浮点负载重,结果可能会快200%以上。