天天看點

《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%以上。