1、什麼是abi
類似於api的作用是使得程式的**間的相容,abi目的是使得程式的二進位制(級別)的相容。
2、arm abi的種類及發展歷程
目前就我了解的資料來看,armabi一共經歷了以下幾個階段:
armoabi –> armeabi –>armel –> armhf
2.1 什麼是oabi 和 eabi
oabi中的o,表示「old」,「lagacy」,舊的,過時的,oabi就是舊的/老的abi。
eabi中的e,表示「embedded」,是一種新的abi。
eabi有時候也叫做gnu eabi。
oabi和eabi都是專門針對arm的cpu來說的。
2.2 eabi的好處 / 為何要用eabi
a。支援軟體 浮點和硬體實現浮點功能混用
b。系統 呼叫的效率更高
c。今後的工具更相容
d。軟體浮點的情況下,eabi的軟體浮點的效率要比oabi高很多。
2.3 oabi和eabi的區別
兩種abi在如下方面有區別:
a。呼叫規則(包括引數如何傳遞及如何獲得返回值)
b。系統呼叫的數目以及應用程式應該如何去做系統呼叫
c。目標檔案 的二進位制格式,程式庫等
d。結構體中的 填充(padding/packing)和對齊
2.4 armel和armhf又是什麼
在ubuntu 12.04和debian裡,除了arm, armel,還出現了乙個名為armhf的版本。這個東西是什麼?
眾所周知,armel是目前主要的arm abi。armhf則是armel的乙個變種,主要區別在浮點計算上。這個下文再詳細 進行述說。
2.5 總結:
由上可知, 這四種abi的版本, 按發展來說是 oabi –> eabi –> armel –> armhf
沒查到 armeabi和armel是什麼關係,是不是同乙個概念。 這裡咱們暫且把它們兩個理解成同乙個。可以參考以下的鏈結自己去看看。
3、arm晶元中的浮點運算
3.1 fpu是什麼
fpu就是cpu中的浮點運算單元, 現代的cpu一般都會整合fpu以提高浮點計算的能力。
3.2 訪問fpu暫存器
訪問fpu暫存器是通過控制cortex-a9的兩個系統控制協處理器暫存器來實現的
非安全模式下訪問控制暫存器(nsacr)
協處理器訪問控制暫存器(cpacr)
3.3 如何執行浮點類的運算呢
1、首先需要開啟arm晶元上的fpu模組
2、編譯選項要把fpu的特性加上,例如cflags= -mfloat-abi=hard -mfpu=vfpv3
3.4 三種浮點運算編譯選項
在編譯帶有浮點引數的函式時,有三種可能的編譯選項:
-mfloat-abi=soft
-mfloat-abi=softfp
-mfloat-abi=hard
"soft"選項:表明不使用fpu硬體,而是使用gcc的整數算術運算來模擬浮點運算。
"softfp"選項:表明要使用fpu硬體來做浮點運算,只是,函式的引數傳遞到整數暫存器(r0-r3)中,然後再傳遞到fpu中。
"hard"選項:表明要使用fpu硬體來做浮點運算,並且,函式的引數直接傳遞到fpu的暫存器(s0、d0)中。
3.5 hardfp abi和hardfloat運算不是一回事
hardfp abi也稱為vfp模式的abi;只是一種編譯規則;而hardfloat運算則表示用fpu來做浮點運算。
soft abi和softfp abi這兩者統稱為標準模式abi。
因此,在涉及到浮點函式呼叫時,
而-mfloat-abi=softfp/soft與-mfloat-abi=hard,是互不相容的。
4、armel和armhf的區別(主要是浮點運算上)
4.1 什麼是armhf
在ubuntu 12.04和debian裡,除了arm, armel,還出現了乙個名為armhf的版本。這個東西是什麼?
眾所周知,armel是目前主要的arm abi。armhf則是armel的乙個變種,主要區別在浮點計算上。
在armel中,關於浮點數計算的約定有三種。以gcc為例,對應的-mfloat-abi引數值有三個:soft,softfp,hard。soft是指所有浮點運算全部在軟體層實現,效率當然不高,適合於早期沒有浮點計算單元的arm處理器;softfp是目前armel的預設設定,它將浮點計算交給fpu處理,但函式引數的傳遞使用通用的整型暫存器而不是fpu暫存器;hard則使用fpu浮點暫存器將函式引數傳遞給fpu處理。
需要注意的是,在相容性上,soft與後兩者是相容的,但softfp和hard兩種模式不相容。預設情況下,armel使用softfp,因此將hard模式的armel單獨作為乙個abi,稱之為armhf。
4.2 hard模式的價值
使用softfp模式,會存在不必要的浮點到整數、整數到浮點的轉換。而使用hard模式,在每次浮點相關函式呼叫時,平均能節省20個cpu週期[1]。對arm這樣每個週期都很重要的體系結構來說,這樣的提公升無疑是巨大的。
在完全不改變原始碼和配置的情況下,在一些應用程式上,使用armhf能得到20——25%的效能提公升[2]。對一些嚴重依賴於浮點運算的程式,更是可以達到300%的效能提公升[3]。
使用armhf的開啟需要硬體的支援,在debian的wiki上要求armv7cpu、thumb-2指令集以及vfp3d16浮點處理器[4]。
在gcc的編譯引數上,使用-mfloat-abi=hard -mfpu=vfp即可。
在工具上,codesourcery最早支援hard模式。也可已自己編譯工具鏈[5]。
4.3 linux with armfp的歷史
2023年5月20日,konstantinos margaritis發文稱將ubuntu larmic移植為hard模式[6]。這一訊息後來在powerdeveloper上引發關於效能提公升的討論[7]。
2023年7月6日,hector oron將他與konstantinos的郵件討論記錄發往debian-arm郵件列表[8],將其稱之為armelfp,引起社群重視,並得到armhf這個正式名稱。
2023年7月18日,非官方的debian-armhf移植工作開始[9]。
2023年11月24日,該移植開始成為debian官方活動。
目前,debian倉庫中超過90%的軟體已經移植完畢[10]。
debian預計在wheezy (7.0)發布armhf的正式版。而ubuntu也計畫在precise pangolin 12.04 lts中發布乙個armhf版。
此外,對此前提到過的toshiba ac100,目前已經有了armhf的debian和ubuntu映象可以安裝試用[11, 12]。
4.4 armel和armhf
arm體系中有的有fpu,有的arm沒有fpu,所以有了armel和armhf兩種使用fpu的方式了。
armhf比armel硬體要求(確切的是指fpu硬體)高一點。
如果有fpu硬體,達到要求的標準了就可以通過gcc的選項-mfloat-abi來指定使用哪種,
如下三種值:
soft: 是不用fpu計算,即使有fpu浮點運算單元也不用。
softfp: armel是softfp,用fpu計算,但是傳引數用普通暫存器傳,這樣中斷的時候,只需要儲存普通暫存器,中斷負荷小,但是引數需要轉換成浮點的再計算。
hard: armhf是hard,用fpu計算,傳引數用fpu中的浮點暫存器傳,省去了轉換效能最好,但是中斷負荷高。
5、總結
armoabi:最老的abi, 根本就沒有fpu.
armeabi: 有三種使用fpu的模式 (soft, softfp, hard)
其中使用softfp模式的又叫armel.
使用hard模式的又叫armhf.
疑問:armeabi是不是就是armel? 還是armeabi根據使用浮點單元的不同而分為兩種armel和armhf?
ARM 浮點運算,軟浮點,硬浮點
很多時候我們要處理的資料,不僅僅是整數和字串,還有浮點數即小數。在多 資料處理方面表現的更多。是不是所有的cpu都支援,浮點運算呢?答案 不是。我們常常聽到贏浮點和軟浮點,這些到底說的是什麼呢?下面我們就來一 竟吧。在這裡我們說的是arm核浮點運算。1 硬浮點 hard float 編譯器將 直接編...
ARM 浮點運算
很多時候我們要處理的資料,不僅僅是整數和字串,還有浮點數即小數。在多 資料處理方面表現的更多。是不是所有的cpu都支援,浮點運算呢?答案 不是。我們常常聽到贏浮點和軟浮點,這些到底說的是什麼呢?下面我們就來一 竟吧。在這裡我們說的是arm核浮點運算。1 硬浮點 hard float 編譯器將 直接編...
ARM 浮點運算
很多時候我們要處理的資料,不僅僅是整數和字串,還有浮點數即小數。在多 資料處理方面表現的更多。是不是所有的cpu都支援,浮點運算呢?答案 不是。我們常常聽到贏浮點和軟浮點,這些到底說的是什麼呢?下面我們就來一 竟吧。在這裡我們說的是arm核浮點運算。1 硬浮點 hard float 編譯器將 直接編...