淺談linux kernel對于浮點(diǎn)運(yùn)算的支持
目前大多數(shù)CPU都支持浮點(diǎn)運(yùn)算單元FPU,F(xiàn)PU作為一個單獨(dú)的協(xié)處理器放置在處理器核外,但是對于嵌入式處理器,浮點(diǎn)運(yùn)算本來就少用,有些嵌入式處理器就會去掉浮點(diǎn)協(xié)處理器。
X86處理器一般都是有FPU的。而ARM PPC MIPS處理器就會出現(xiàn)沒有FPU的現(xiàn)象。
linux kernel如何處理浮點(diǎn)運(yùn)算,我們就分為帶FPU的處理器和不帶FPU的處理器來討論。
(以下為個人知識總結(jié),研究不深,錯誤之處希望大家指正,共同學(xué)習(xí))
一 對于帶FPU的處理器
1 對于linux kernel來說,kernel本身編譯默認(rèn)使用了-msoft-float選項,默認(rèn)編譯為軟浮點(diǎn)程序,軟浮點(diǎn)含義是有g(shù)cc編譯器模擬浮點(diǎn)運(yùn)算(glibc庫提供),將浮點(diǎn)運(yùn)算代碼替換為定點(diǎn)運(yùn)算。
對于帶FPU的處理器,我們可以將編譯選項-msoft-float去掉,一般是在arch/xxx/Makefile中。將kernel編譯為硬浮點(diǎn),也就是讓處理器的浮點(diǎn)指令計算浮點(diǎn),
硬浮點(diǎn)運(yùn)算肯定要比模擬的定點(diǎn)運(yùn)算效率高。(kernel代碼中一般不會有浮點(diǎn)運(yùn)算,所以效率影響不大)
2 對于運(yùn)行在kernel上的app來說,特別是對于圖形程序,如QT,浮點(diǎn)運(yùn)算較多,我們直接編譯即可,因?yàn)樘幚砥髦С指↑c(diǎn)運(yùn)算,支持浮點(diǎn)運(yùn)算指令。
二 對于不帶FPU處理器
1 對于linux kernel來說,編譯默認(rèn)使用了-msoft-float選項,默認(rèn)編譯為軟浮點(diǎn)程序,linux kernel編譯不依賴鏈接任何庫,kernel中來實(shí)現(xiàn)對應(yīng)的模擬浮點(diǎn)ABI。
2 對于運(yùn)行在kernel之上的app來說,如何處理浮點(diǎn)運(yùn)算,這里就有2種方法了:
(1)由kernel來模擬軟浮點(diǎn).
應(yīng)用程序使用硬浮點(diǎn)直接編譯(編譯器默認(rèn)就是編譯成硬浮點(diǎn)程序)。
而對于kernel,我所了解的PPC MIPS處理器都有專門的浮點(diǎn)運(yùn)算異常處理,程序運(yùn)行碰到浮點(diǎn)指令,無法運(yùn)行浮點(diǎn)指令時,硬件會產(chǎn)生相應(yīng)的中斷異常,kernel浮點(diǎn)異常處理程序根據(jù)指令內(nèi)容進(jìn)行軟浮點(diǎn)模擬操作,將運(yùn)算結(jié)果返回之后再恢復(fù)到用戶空間執(zhí)行。
對于ARM我在其異常介紹中沒有找到對于浮點(diǎn)計算的異常入口,但是kernel中也有對于其軟浮點(diǎn)的支持,
在配置ARM Linux內(nèi)核時,應(yīng)該都會看到這樣的配置:
menu "Floating point emulation" comment "At least one emulation must be selected" config FPE_NWFPE ...
這個是用來配置在內(nèi)核里面模擬浮點(diǎn)處理器。
具體ARM如何實(shí)現(xiàn)支持異常模擬軟浮點(diǎn),具體實(shí)現(xiàn)有時間還需要仔細(xì)看代碼,在arch/arm/nwfpe中。
這樣的方式好處在于應(yīng)用程序不需要重新編譯,需要在kernel中把浮點(diǎn)模擬打開即可,使用起來非常方便。
但是缺點(diǎn)也很明顯,每次浮點(diǎn)操作都要觸發(fā)中斷異常,用戶空間和內(nèi)核空間切換,執(zhí)行效率太低。
(2)使用軟浮點(diǎn)重新編譯app
這樣可以避免上述問題,app編譯時需要連接glibc庫的,使用--msoft-float,使用glibc的模擬浮點(diǎn),替換為定點(diǎn)運(yùn)算,這樣的好處是運(yùn)行性能上會好一些。
但缺點(diǎn)是因?yàn)槭褂昧瞬煌木幾g選項,使用的ABI可能就發(fā)生了變化,如果某個庫或者應(yīng)用沒有使用同樣的編譯選項(ABI不同),
系統(tǒng)運(yùn)行時會出現(xiàn)意想不到的情況,甚至造成崩潰。
根據(jù)最近對PPC一款處理器的調(diào)試記錄,kernel正常啟動進(jìn)入console后死在某一地址,用戶空間浮點(diǎn)運(yùn)算多,詢問IC后得知FPU去掉,而處理器浮點(diǎn)異常沒有使能。
這樣遇到浮點(diǎn)指令,處理器不會觸發(fā)異常,也不知道該如何運(yùn)行該指令。
所以進(jìn)行kernel移植時對于處理器有無FPU也要搞清楚,如果處理器去掉了FPU,而核沒有做相應(yīng)的處理(使能浮點(diǎn)異常),那么APP的浮點(diǎn)指令運(yùn)行結(jié)果就是無法預(yù)測的,這時可以采用軟浮點(diǎn)工具鏈來編譯APP。
這里有一點(diǎn)思考:
對于一款處理器,處理器設(shè)計中有浮點(diǎn)異常(MIPS PPC都是),其外也可以接FPU。
在接FPU后,處理器核內(nèi)就要屏蔽掉浮點(diǎn)異常,不然浮點(diǎn)運(yùn)算還是產(chǎn)生浮點(diǎn)異常,F(xiàn)PU就沒有實(shí)用意義了。
無FPU,則處理器核內(nèi)要使能浮點(diǎn)異常,不然就跟我上面遇到的問題一樣,處理器不知道該如何運(yùn)行該浮點(diǎn)指令,結(jié)果就無法預(yù)測了。
以上這篇淺談linux kernel對于浮點(diǎn)運(yùn)算的支持就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
- Linux系統(tǒng)中安裝gcc和kernel-devel的方法
- 利用kernel提供的接口打印進(jìn)程號(pid)
- 淺談在linux kernel中打印函數(shù)調(diào)用的堆棧的方法
- linux kernel 打印函數(shù)指針對應(yīng)的函數(shù)名方法
- 學(xué)習(xí)在kernel態(tài)下使用NEON對算法進(jìn)行加速的方法
- ubuntu下kvm 命令行安裝64位ubuntu報"Couldn''t find hvm kernel for Ubuntu tree."的問題分析
- CentOS7升級內(nèi)核kernel5.0版本
- linux編譯kernel和svn版本沖突的解決辦法
相關(guān)文章
Linux查看分區(qū)文件系統(tǒng)類型的方法總結(jié)
這篇文章主要給大家總結(jié)介紹了關(guān)于Linux查看分區(qū)文件系統(tǒng)類型的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用linux系統(tǒng)具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08分別在Linux和Windows下設(shè)置JVM內(nèi)存的簡單方法
下面小編就為大家?guī)硪黄謩e在Linux和Windows下設(shè)置JVM內(nèi)存的簡單方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01linux系統(tǒng)安裝zookeeper 服務(wù)的方法
這篇文章主要介紹了linux 系統(tǒng)安裝zookeeper 服務(wù)的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-11-11

Ubuntu18.04 linux系統(tǒng)安裝JDK與Mysql的方法

Linux內(nèi)核設(shè)備驅(qū)動之字符設(shè)備驅(qū)動筆記整理