Redox随笔(2)-用Rust语言编写的类UNIX操作系统
與其他操作系統相比,Redox如何
我們與其他操作系統有很多共同之處。
由于
Redox syscall接口是Unix-y。例如,我們有open, pipe, pipe2, lseek, read, write, brk, execv等等。目前,我們支持31個最常見的Linux系統。
與Linux相比,我們的syscall接口要小得多。這并不是因為開發階段,而是因為極簡設計。
“一切都是URL”
這是“一切都是文件”的概括,主要是受到了計劃9的啟發。在Redox中,“resources”(TODO: link)既可以是類似于套接字的,也可以是類似于文件的,這使得它們可以快速地用于幾乎所有的事情。
這樣,我們就得到了一個更加統一的系統API。稍后,我們將在url、模式和資源中對此進行解釋。
內核
Redox的核是一個微核。該設計的靈感主要來自MINIX。
與Linux或BSD相比,Redox只有16000行內核代碼,這個數字還在不斷減少。大多數服務都是在用戶空間中提供的。
在內核中使用更少的代碼可以更有效地查找和修復bug /安全問題。Andrew Tanenbaum (MINIX的作者)指出,每1000行正確編寫的代碼中就有一個bug。這意味著對于一個包含近25,000,000行代碼的單片內核來說,可能有近25,000個bug。一個只有16000行代碼的微內核意味著大約有16個bug。
應該注意的是,額外的行只是基于內核空間之外,這使它們不那么危險,而不一定是更小的數字。
其主要思想是讓組件和驅動程序存在于用戶空間中,并且遵循最小權限原則(POLA)。這是每一個單獨的組成部分:
完全隔離在內存中,并作為一個獨立的用戶進程
一個組件的失敗不會使其他組件崩潰
外部和不受信任的代碼不會公開整個系統
錯誤和惡意軟件不能傳播到其他組件
是否限制了與其他組件的通信
沒有管理/超級用戶權限
bug被轉移到用戶空間,降低了它們的能力
所有這些都大大提高了系統的可靠性。這對于任務關鍵型應用程序和希望減少計算機系統問題的用戶非常有用。
為什么Rust呢?
為什么要在Rust中編寫操作系統?為什么還要用Rust?
Rust擁有巨大的優勢,因為對于操作系統來說,安全性非常重要。實際上,很多。
由于操作系統是計算的一個集成部分,所以它們是一個非常重要的安全組件。
由于缺乏內存和類型安全,Linux、BSD、Glibc、Bash、X等系統一直存在大量bug和漏洞。Rust通過靜態地加強內存安全性,做到了這一點。
設計很重要,實現也很重要。Rust試圖避免這些意外的內存不安全情況(這是安全性關鍵bug的主要來源)。設計是一個非常透明的問題來源。你知道發生了什么,你知道什么是計劃好的,什么不是。
在這一點上,內核/用戶空間分離的基本設計與類unix系統非常相似。其思想大致相同:通過內核的嚴格執行,將內核和用戶空間分離,內核負責管理內存和其他關鍵資源。
然而,我們有一個優勢:強制的內存和類型安全。這是Rust的強大之處——在編譯時消除了大量“未預料到的bug”(例如,未定義的行為)。
Linux和BSD的設計是安全的。執行情況不是:
Linux內核漏洞
Glibc漏洞
Bash的漏洞
X漏洞
點擊上面的鏈接。您可能會注意到,許多bug都是在不安全的條件下產生的(這些條件可以有效地消除銹蝕),比如緩沖區溢出,而不是整體設計。
我們希望使用Rust最終能夠生成更安全的操作系統。
不安全的
不安全是告訴Rust“我知道我在做什么!”的一種方式,這在編寫低級代碼、提供安全的抽象時通常是必要的。如果沒有unsafes,就不能編寫內核。
在這種情況下,內核不可能是100%安全的,但是不安全的部分必須標記為不安全的部分,這將不安全的部分與安全代碼隔離開來。我們盡量消除不安全的地方,當我們使用不安全的時候,我們是非常小心的。
快速的grep給出了一些統計數據:在大約16000行代碼中,內核大約有300次不安全調用。每一個都經過仔細審核以確保正確性。
這與用C語言編寫的內核形成了對比,C語言如果沒有代價高昂的正式分析,就不能保證安全性。
你可以在Rust書的相關章節找到更多關于如何不安全的工作。
Redox是一個完整的Rust操作系統。除了內核,我們還在開發幾個小項目,包括:
TFS:受ZFS啟發的文件系統。
Ion: Redox shell。
Orbital: Redox 顯示服務器。
OrbTK:小部件工具包。
pkgutils: Redox的包管理庫及其命令行前端。
Sodium:類似于vi的編輯器。
ralloc: 一個內存分配器。
libextra: libstd的補充,在整個Redox代碼庫中使用。
games-for-redox: Redox (類似于bsd游戲)的迷你游戲集。
以及其他一些令人興奮的項目。
我們還有三個實用程序發行版,它們是一些小的、有用的命令行程序的集合:
Coreutils:一個可用系統所必需的最小實用程序集。
Extrautils: 如提醒、日歷、拼寫檢查等。
Binutils:處理二進制文件的實用程序。
我們也積極參與第三方項目,這些項目在Redox中被大量使用。
uutils/coreutils: GNU coreutils的跨平臺銹蝕重寫。
m-labs/smoltcp: Redox使用的網絡堆棧。
什么工具適合Redox?
將來,這些工具中的一些將被移出默認的發行版,放到單獨的可選包中。例如,Orbital, OrbTK, Sodium等等。
列出的工具可分為三類:
關鍵的,這是一個完整的功能和可用的系統所需要的。
生態友好型,是為了在生態系統中建立一致性。
樂趣,這是“美好的”,并天生簡單。
第一類是顯而易見的:沒有某些核心工具的操作系統是無用的操作系統。第二類包含了將來可能不會違約的工具,但由于其魅力,現在仍然是官方發布的。第三類是為了方便:即確保Redox基礎結構是一致和集成的(例如,pkgutils、OrbTK和libextra)。
總結
以上是生活随笔為你收集整理的Redox随笔(2)-用Rust语言编写的类UNIX操作系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redox随笔(1)-用Rust语言编写
- 下一篇: rust-let 不可变绑定与可变绑定(