在軟體對傳統硬體支援不斷減少的時代,一個值得注意的專案已經浮出水面,為數十年前的計算機硬體注入了新的生命力。一位開發者成功地在 NetBSD 10.x 及更高版本中恢復了對 i486SX 處理器的浮點運算單元(FPU)模擬支援,使這些缺乏硬體浮點計算能力的老式 CPU 能夠執行現代作業系統功能。
i486SX 的歷史和 FPU 模擬
i486SX 是英特爾在 20 世紀 90 年代初推出的 486 處理器系列的經濟型變種,透過人為停用浮點運算單元來降低成本。正如一位評論者所指出的,它在當時被廣泛認為是一種功能受限的產品。沒有 FPU,這些處理器無法原生處理浮點計算,而這些計算對許多應用程式來說至關重要,包括科學計算和某些圖形操作。
這個復興專案重新引入了 NetBSD 核心中的 MATH_EMULATE
選項,允許作業系統捕獲浮點指令並在軟體中模擬它們。這種方法使得使用浮點運算的未修改二進位制檔案能夠在 i486SX 系統上執行,而無需特殊編譯或連結到軟浮點庫。
「這在奔騰處理器出現之前非常常見。許多(大多數?)編譯器工具鏈都包含軟體 FPU 模擬器。非常酷的專案!」
超越 i486SX 的更廣泛應用
社群討論揭示,這項工作的影響不僅限於老式英特爾硬體。正如一位評論者指出,許多面向嵌入式系統的替代 x86 SoC 也沒有 FPU,包括最初的 Vortex86。這表明該專案可能比最初預期的能夠惠及更廣泛的硬體範圍。
人們也對這一發展是否能使 NetBSD 10.x 在 x86 處理器的 FPGA 實現上執行感興趣,例如 MiSTer 專案中的 ao486 核心。雖然一位社群成員的初步測試不成功,但這種可能性對復古計算愛好者來說仍然很有吸引力。
技術實現和起源
有趣的是,該專案採用了具有悠久歷史的程式碼。核心 FPU 模擬程式碼可以追溯到 Linux 創始人 Linus Torvalds,帶有 1991 年的版權宣告,並最終源自 386BSD。這種歷史聯絡引發了關於早期 Linux 程式碼與 BSD 許可專案之間許可相容性的討論。
該實現處理了廣泛的浮點運算,從基本算術到更復雜的函式如對數。然而,一些操作仍未實現或在精度方面存在已知問題,特別是對數函式。
FPU 模擬指令的關鍵類別
- 控制與初始化:包括用於初始化 FPU 的指令,如
fninit
- 載入到 FPU 堆疊:包括
fld
、fldt
、filds
、fildl
等用於載入值的指令 - 從 FPU 堆疊儲存:包括
fstps
、fstpt
等用於儲存值的指令 - 算術運算:基本運算如
fadd
、fsub
、fmul
、fdiv
- 比較運算:包括
fcom
、fucom
、ftst
等指令 - 堆疊操作:如
fxch
、fchs
、fabs
、frndint
等操作 - 對數/特殊數學運算:已實現部分操作如
f2xm1
,其他如fyl2x
仍在開發中
注:某些複雜操作仍未實現或存在精度問題。
與 Linux 核心開發的對比
這個專案的時機特別值得注意,因為 Linux 核心社群最近也有相關發展。就在這個專案被強調之前幾天,有人提出了補丁,建議完全放棄 Linux 核心對缺少 FPU 的 x86 CPU 的支援。NetBSD 和 Linux 在方法上的這種差異突顯了這些作業系統在硬體支援方面的不同理念,NetBSD 保持了其支援多樣化和傳統硬體平臺的聲譽。
雖然現代計算在很大程度上已經超越了這些老式處理器,但像這樣的專案表明,人們對保持傳統硬體與現代軟體相容的持續興趣。對於復古計算愛好者、教育目的或使用無 FPU 嵌入式 x86 處理器的專業工業應用,這種在 NetBSD 中復興浮點模擬代表了對計算生態系統的寶貴貢獻。