如果計算機沒有浮點運算能力,系統能正常啟動嗎?

也就是說,常見的幾種操作系統啟動過程中要不要用浮點運算?浮點運算是不是關鍵的部分?

可以考慮以下幾種情況:遇到浮點指令時什麼都不做;遇到浮點指令時算出隨機不可預知的答案;遇到浮點指令時算出錯誤的答案(但是可以預知,只要操作數給定結果就固定)

還有,如果沒有浮點運算能力,一般的程序中,有哪些不能運行了?


當然能。比如說第一台Android,HTC Dream,用的ARMv6,沒有硬浮點。


以Windows來說吧,Windows7(64位環境),不能。不只是FPU這麼簡單。

雖然軟體可以用整數模擬浮點計算,但絕大多數操作系統還是能用硬體就用硬體,畢竟軟體實現起來很麻煩。

對於x86架構的CPU,浮點計算不僅僅是FPU里的FLD之類的指令,像XMM一類的操作也支持浮點,Windows還是會用到這方面的操作的,反彙編一下Windows內核文件就可以看到。

比如Windows的電源管理(入口函數PoInitSystem)就會用到SQRTPS指令,這是一個求平方根的指令,是一個明顯的浮點計算,如果硬體不支持,這裡肯定要掛。

但這條指令是XMM寄存器的指令(SSE),不是傳統的FPU操作。Windows內核里的一堆數學函數(sin、cos)都會用到FPU,所以應該說也是離不開FPU的(好像這類數學函數實際沒用到,只是編譯進去了)。

所以,對於Windows來說,沒浮點計算,答案就是:內核起不起來,系統不能正常工作。內核都沒有,別的就更別想了。

當然,如果要求微軟編譯一個使用軟浮點的內核,微軟應該是有能力做到的,甚至把整個操作系統都改成軟浮點也沒問題,只是微軟沒有這麼做而已。

現有的Windows二進位代碼,無法直接運行在無浮點功能的硬體上。

如果有源碼的情況下,通過修改編譯參數,可以編譯生成一套完全不依賴浮點的Windows版本。應用層面上,絕大多數軟體都可以通過修改編譯器參數實現軟浮點方式運行(不依賴硬體)。


就算硬體沒有浮點運算能力,編譯器也會去用整數運算指令來模擬的,只不過會慢不少而已

當然如果你指的是一塊core i7嘎蹬一下裡面的浮點運算單元全掛了,那什麼東西都跑不了了


在源代碼編譯成二進位映像這個層次上,如果你的目標平台沒有浮點能力,而你用了浮點操作,那麼編譯器會用若干次整數運算拼湊出浮點運算。

如果是類似的兩個平台,一個有浮點能力而另一個沒有(例如不同版本的ARM),如果把編譯帶有硬體浮點操作的二進位映像,直接扔到沒有浮點能力的平台上執行,那會直接掛(CPU發現這個指令我不認識)。


凡是支持386處理器的OS一定能啟動,因為386本身不包含FPU,需要加一塊387才能支持浮點指令。

ARM的情況類似,有一些ARM也沒有內建的FPU。

完整的啟動過程不止涉及到內核,還有一些系統服務,這些程序大多數應該沒有什麼浮點運算相關的需求。但Windows因為要啟動一整個GUI所以可能會遇到一些問題,畢竟Windows早就不支持386了。


硬浮點運算指的是FPU的話,沒有FPU還可以用軟體模擬,極端情況下還可以ALU只有與或非三個門的運算(滑稽),只是有了FPU可以加速運算(比如原來要16個時鐘周期現在只要2個時鐘周期了),在硬體層面實現越多的操作處理會越快。

so,在以前的系統里是可以不要FPU的,以前的80x86這種就是沒有的(沒記錯的話),所以系統運行不一定依賴FPU。

什麼情況下能運行什麼情況下又不能呢?這個取決於你使用的系統,在系統層面如果寫了

「若無FPU,則軟體實現浮點運算的實現」

那麼就可以運行,因為當你要浮點運算時,系統會通過整形運算的方法給出你浮點運算的結果,速度會比有FPU減慢了許多,因為操作的指令變多了許多。

若沒有寫浮點運算的實現,則不能運行,跑到浮點運算的地方就狗帶了。

解決方法:若你有系統的源代碼,可以在編譯時選擇不使用FPU或者寫浮點數運算的實現方法再重新編譯,得到一個不使用FPU的系統就可以運行。

若對這方面感興趣可以去看看

《CPU自製入門》(當然要有專業知識)

或者玩玩FPGA什麼的實現一個計算機也可以233

-------分割線-------

本文為科普,用詞不嚴謹,若有錯誤歡迎指出,玻璃心輕噴(捂臉)。

來自@萌萌噠蘿蔔絲


在Intel 486DX正式把浮點協處理器集成進CPU之前,8086、80286、80386都是單純的整數處理器,主板上留了一個插座供外接升級浮點協處理器x87,你說那時候的人咋活過來的?


系統啟動本身是不需要任何浮點運算的

可以啟動

就算另外一個答案里說的咯噔一下FPU全掛了也能啟動……當然,咱們假設指令會被忽略,而不是卡死在執行上

最多不能顯示或者花屏而已,現在Windows的GUI渲染需要浮點運算


呃,浮點計算和啟動的關係,有關係么?可以告訴你現在不支持浮點運算的設備有很多很多很多的。不知道你搞什麼會提出這樣的問題。與其關注你提的問題本身,我更想知道你在什麼環境下提出了這樣的問題。


在Linux的世界裡,OS不使用浮點功能,用戶態程序,可以使用軟浮點,不需要浮點硬體。所以從理論上來說,處理器沒有浮點運行能力,也一樣能跑起來。只是對於浮點計算緊密相關的應用,性能會變差,但對普通程序來說,性能沒有什麼差別。

感謝 @空著不好看 提醒,Linux kernel的確有一些使用浮點的功能,主要集中在加密功能上,還有RAID6也使用了。但內核浮點計算代碼塊中,必須使用 kernel_fpu_begin()和kernel_fpu_end()這兩個函數包起來。這兩個函數的作用是讓內核感知不到OS運行過程中有使用硬體浮點寄存器。


計算機啟動運行和浮點數都沒有直接關係。

對於浮點數的計算只取決於:

1. 你的ALU是否支持浮點計算指令,或者是否有獨立的FPU進行浮點運算

2. 你如何規定浮點數的長度是多少,或者是否有專門用於浮點計算的浮點寄存器


操作系統就是處理輸入輸出的,不需要浮點運算。

理論上cpu都不具備浮點運算,其運算單元只有一個加法器是通過電路單元組成的,減法也是通過補碼變換後用加法器完成的,浮點運算也是通過演算法變成微指令完成的。早期的8088晶元需要專門一個處理運算的協處理器才能識別浮點運算指令。


就PC來說,Windows 95及之前都是不要求FPU的。


印象中最早支持浮點運算的民用CPU是1989年的INTEL 486

386以前都是用專門的協處理器處理浮點的

浮點運算是科學運算和玩遊戲的需要催生的。

做3D圖形運算也不一定要浮點,N64之前所有遊戲機都沒浮點能力,湊合用定點運算唄,無非是空間定位不準,遊戲角色的眼睛跑腦袋後面去了。


沒有任何影響,操作系統的啟動並不需要很多複雜的浮點運算,多耗在一些GUI渲染上了。

就連DF-5洲際彈道導彈的全彈道軌跡計算都是採用的加法。

實際上,世界的本質就是加法,其餘運算全部衍生自加法。計算機只要能算加法,就有能力模擬這個世界。


我以前就寫過單片機整數模擬浮點數,除了加減乘除,還寫了一個迭代開根號的。。。


浮點也可以用整數操作實現。


如果一個無浮點運算功能的計算機速度是普通計算機的數億倍 那用一個簡單的演算法就可以實現類似浮點運算,其降低的速度完全可以被機器本身的速度抵消


當然可以,有一些小的rtos也可以運行在這些不具有fpu的處理器上,浮點計算可以調用用cordic,牛頓迭代一類的演算法實現的浮點庫。反正編譯器會搞定。


可以整數硬給你模擬


推薦閱讀:

請問大家覺得日後更優秀的編程語言會不會是一種結合所有既有編程語言優點的語言呢?
當數據量不夠大的時候,有什麼方法可以提高CNN訓練效果?
研究linux kernel 0.11有哪些意義?
中國計算機專業留學生在美國現在的就業情況究竟怎樣?
大學學計算機為什麼必須要學演算法?

TAG:操作系統 | 計算機科學 |