本文整理自 GoLand 官方博客的一篇文章:《OS in Go? Why Not?》,探討了為什么像 C 這樣的編程語言在 OS 開發中占據優勢,以及是否可以使用 Go 編寫 OS。此外還提到了用 Go 開發操作系統的可行性、局限性,以及目前的部分成果。
操作系統 (OS) 是計算機系統的心臟和靈魂,它管理著計算機的硬件和軟件資源,并為用戶提供與計算機交互的方式。傳統上,C 和 Assembly 等語言因其低開銷和 “接近機器碼” 的特性而被用于開發操作系統。 但諸如 Go 等高級語言的興起引入了一些特性,這些特性或許可以使開發操作系統等復雜軟件變得更加容易。例如,類型安全、錯誤處理和并發性在開發操作系統時應該是有益的。 因此,采用像 Go 這樣的高級語言來開發操作系統理應是自然選擇,但為什么并沒有成功的案例?
操作系統由不同的組件構成,它們負責不同的功能,可以使用不同的編程語言編寫。 操作系統的核心是內核 (Kernel),它負責與硬件交互 —— 幾乎都是采用 C 或匯編語言編寫。至于面向用戶的組件(例如 GUI 應用程序),可以采用任何語言編寫。 例如,Android 采用 Java 編寫用戶層的組件,如 GUI 框架和系統應用程序(相機、電話等)。相對應的,其內核采用 C 和匯編語言編寫;底層系統組件 —— 庫,則是用 C++ 編寫。 C 語言 “統治” 內核的主要原因:
可直接管理內存
缺少抽象
無需依賴運行時
可移植性
Go 作為高級語言提供了許多令人滿意的特性。從這方面來看,它似乎可以成為開發操作系統的絕佳選擇:
某些類型的錯誤在高級語言中出現的可能性要小得多
并發性:在高級語言中處理并發更容易,因為幾乎每種高級語言都內置處理并發所需的機制
類型安全:防止像 C 的寬松類型強制執行
不過盡管 Go 提供了令人滿意的特性,可以讓操作系統開發者的工作更輕松,但它也有一些局限性。 作為一種具有垃圾回收功能的語言,Go 并不真正適合操作系統開發。使用 Go 編寫內核意味著需要小心翼翼地繞過 Go 的垃圾收集。正如 Reddit 論壇中開發者提到的,鼠標滯后可能是因為中斷處理程序分配了觸發垃圾回收的內存。 此外,Go 還需要大量的 runtime 才能執行,這意味著它不能直接在硬件上運行。盡管 TinyGo 可以將 Go 編譯為在裸機上運行,但與 C 相比,它只支持少量的架構,而 C 幾乎可以在任何架構上運行。 總的來說,使用 Go 開發一個不是 “玩具性質” 的操作系統幾乎是不可能。尤其是要求支持在多種架構上運行、支持不同設備(如顯卡或網卡),并符合 POSIX 標準,這更是極具挑戰性。 最后看一下探索用 Go 開發操作系統的案例。 Biscuit 是一個用 Go 開發的操作系統,運行在 64 位 X86 架構上。它使用經過修改的 Go 1.10 運行時實現,其中添加了更多匯編代碼來處理系統調用和中斷處理程序的引導和進入 / 退出。
Biscuit 為用戶進程提供 POSIX 接口,支持 fork、exec 等。它實現了支持核心 POSIX 文件系統調用的文件系統。Biscuit 為用 Go 編寫的 Intel PCI-Express 以太網 NIC 實現了 TCP/IP 堆棧和驅動程序。使用 POSIX 接口,Biscuit 可以在不修改源代碼的情況下運行許多 Linux C 程序。 然而,Biscuit 缺少許多功能,例如調度優先級、換出頁面或磁盤,以及安全功能,例如用戶、訪問控制列表和地址空間隨機化。
審核編輯 :李倩
-
操作系統
+關注
關注
37文章
6806瀏覽量
123285 -
Go
+關注
關注
0文章
43瀏覽量
12248 -
編程語言
+關注
關注
10文章
1942瀏覽量
34709
原文標題:為什么不用Go開發操作系統?
文章出處:【微信號:OSC開源社區,微信公眾號:OSC開源社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論