用 Rust 寫操作系統 - 清華 rCore OS 教程介紹
rCore OS 教程簡介
衆所周知,清華大學的操作系統課程是國家級精品課程。清華大學也是是國內首個使用 Rust 進行操作系統教學的高校。目前,陳渝教授和他的學生吳一凡正在編寫新的操作系統教材。該教材相關的文檔都是網絡公開的,教程地址:https://rcore-os.github.io/rCore-Tutorial-Book-v3/。
這本教程旨在一步一步展示如何 從零開始 用 Rust 語言寫一個基於 RISC-V 架構的類 Unix 內核。值得注意的是, 本項目不僅支持模擬器環境(如 Qemu/terminus 等),還支持在真實硬件平臺 Kendryte K210 上運行。
該教程目前已經發布了近 20 萬字,每一章都是一個能完整運行的內核。目前已經完成了前四章分別可以讓內核能在裸機打印字符、支持系統調用和特權級切換、任務切換和虛擬存儲。後面還會依次支持進程、進程間通信和數據持久化,代碼已經寫完,有待更新教程文檔。陳渝教授和吳一凡也希望能夠通過該教程吸引更多對 Rust 和 OS 感興趣的讀者,可以在教程的基礎上自己從頭實現一遍或者能做一些拓展,也能提供一些反饋,讓教程的質量越來越高。
以教程目前的內容進度,正是大家從零開始學習編寫操作系統的最佳時期。
爲什麼要學習操作系統?
一名程序員的絕大部分工作都是在操作系統上面進行的。學習操作系統,深入瞭解操作系統原理,是每個合格的程序員必須要經歷的。
很多人學習 Rust 語言感到很喫力,基本上就是因爲操作系統基礎知識薄弱造成的。
通過自己實現一個操作系統,可以讓你對操作系統的理解不僅僅是停留在概念上。而且用 Rust 實現操作系統,對於 Rust 愛好者來說,更有意思。
希望社區的朋友可以根據該教程實現自己的操作系統,如果需要交流,可以聯繫我(張漢東),我們可以一起建立學習小組,並且可以直接向陳渝教授和吳一凡反饋學習中的問題。
以下內容節選自 rCore OS 教程第零章。
目前常見的操作系統內核都是基於 C 語言的,爲何要推薦 Rust 語言?
沒錯,C 語言就是爲寫 UNIX 而誕生的。Dennis Ritchie 和 KenThompson 沒有期望設計一種新語言能幫助高效簡潔地開發複雜的應用業務邏輯,只是希望用一種簡潔的方式抽象出計算機的行爲,便於編寫控制計算機硬件的操作系統,最終的結果就是 C 語言。
C 語言的指針的天使與魔鬼,且 C 語言缺少有效的併發支持,導致內存和併發漏洞成爲當前操作系統的噩夢。
Rust 語言具有與 C 一樣的硬件控制能力,且大大強化了安全編程。從某種角度上看,新出現的 Rust 語言的核心目標是解決 C 的短板,取代 C。所以用 Rust 寫 OS 具有很好的開發和運行的體驗。
用 Rust 寫 OS 的代價僅僅是學會用 Rust 編程。
目前常見的 CPU 是 x86 和 ARM,爲何要推薦 RISC-V?
沒錯,最常見的的 CPU 是 x86 和 ARM,他們已廣泛應用在服務器,臺式機,移動終端和很多嵌入式系統中。它們需要支持非常多的軟件系統和應用需求,導致它們越來越複雜。
x86 的向過去兼容的策略確保了它的江湖地位,但導致其丟不掉很多已經比較過時的硬件設計,讓操作系統疲於適配這些硬件特徵。
x86 和 ARM 都很成功,這主要是在商業上,其廣泛使用是的其 CPU 硬件邏輯越來越複雜,且不夠開放,不能改變,不是開源的,提高了操作系統開發者的學習難度。
從某種角度上看,新出現的 RISC-V 的核心目標是靈活適應未來的 AIoT 場景,保證基本功能,提供可配置的擴展功能。其開源特徵使得學生都可以方便地設計一個 RISC-V CPU。
寫面向 RISC-V 的 OS 的代價僅僅是你瞭解 RISC-V 的 Supevisor 特權模式,知道 OS 在 Supevisor 特權模式下的控制能力。
清華大學爲何要寫這本操作系統書?
現在國內外已有一系列優秀的操作系統教材, 例如 William Stallings 的《Operating Systems Internals and Design Principles》,Avi Silberschatz、Peter Baer Galvin 和 Greg Gagne 的《Operating System Concepts》,Remzi H. Arpaci-Dusseau 和 Andrea C. Arpaci-Dusseau 的《Operating Systems: Three Easy Pieces》等。然而, 從我們從 2000 年以來的教學實踐來看, 某些經典教材對操作系統的概念和原理很重視,但還有如下一些問題有待改進:
原理與實踐脫節:缺乏在操作系統的概念 / 原理與操作系統的設計 / 實現之間建立聯繫的橋樑,導致學生髮現操作系統實現相關的實驗與操作系統的概念相比,有較大的鴻溝。
缺少歷史發展的脈絡:操作系統的概念和原理是從實際操作系統設計與實現過程中,從無到有逐步演進而產生的,有其發展的歷史淵源和規律。但目前的大部分教材只提及當前主流操作系統的概念和原理,有 “憑空出現” 的感覺,學生並不知道這些內容出現的前因後果。
忽視硬件細節或用複雜硬件:很多教材忽視或抽象硬件細節,是的操作系統概念難以落地。部分教材把 x86 作爲的操作系統實驗的硬件參考平臺,缺乏對當前快速發展的 RISC-V 等體系結構的實驗支持,使得學生在操作系統實驗中可能需要花較大代價瞭解相對繁雜的 x86 硬件細節,影響操作系統實驗的效果。
這些問題增加了學生學習和掌握操作系統的難度。我們想通過嘗試解決上面三個問題,來緩解學生學習操作系統的壓力,提升他們的興趣,讓他們能夠在一個學期內比較好地掌握操作系統。爲應對 “原理與實踐脫節” 的問題,我們強調了實踐先行,實踐引領原理的理念。MIT 教授 Frans Kaashoek 等師生設計實現了基於 UNIX v6 的 xv6 教學操作系統用於每年的本科操作系統課的實驗中,並在課程講解中把原理和實驗結合起來,在國際上得到了廣泛的認可。這些都給了我們很好的啓發,經過十多年的實踐,對一個計算機專業的本科生而言,設計實現一個操作系統(包括 CPU)有挑戰但可行,前提是實際操作系統要小巧並能體現操作系統的核心思想。這樣就能夠讓學生加深對操作系統原理和概念的理解,能讓操作系統原理和概念落地。
爲應對 “缺少歷史發展的脈絡” 的問題,我們重新設計操作系統實驗和教學內容,按照操作系統的歷史發展過程來建立多個相對獨立的小實驗,每個實驗體現了操作系統的一個微縮的歷史,並從中歸納總結出操作系統相關的概念與原理,並在教學中引導學生理解這些概念和原理是如何一步一步演進的。
爲應對 “忽視硬件細節或用複雜硬件” 的問題,我們在硬件(x86, ARM, MIPS, RISC-V 等)和編程語言(C, C++, Go, Rust 等)選擇方面進行了多年嘗試。在 2017 年引入了 RISC-V CPU 作爲操作系統實驗的硬件環境,在 2018 年引入 Rust 編程語言作爲開發操作系統的編程語言,使得學生以相對較小的開發和調試代價能夠用 Rust 語言編寫運行在 RISC-V 上的操作系統。而且方便和簡化了讓操作系統的概念和原理形象化,可視化的過程。學生可以吧操作系統的概念和原理直接對應到程序代碼、硬件規範和操作系統的實際執行中,加強了學生對操作系統內涵的實際體驗和感受。
所以本書的目標是以簡潔的 RISC-V CPU 爲底層硬件基礎,根據上層應用從小到大的需求,按 OS 發展的歷史脈絡,逐步講解如何設計並實現滿足這些需求的 “從小到大” 的多個 “小” 操作系統。並在設計實現操作系統的過程中,逐步解析操作系統各種概念與原理的知識點,對應的做到有 “理” 可循和有 “碼” 可查,最終讓讀者通過主動的操作系統設計與實現來深入地掌握操作系統的概念與原理。
在具體撰寫過程中,第零章是對操作系統的一個概述,讓讀者對操作系統的歷史、定義、特徵等概念上有一個大致的瞭解。後面的每個章節體現了操作系統的一個微縮的歷史發展過程,即從對應用由簡到繁的支持的角度出發,每章會講解如何設計一個可運行應用的操作系統,滿足應用的階段性需求。從而讀者可以通過對應配套的操作系統設計實驗,瞭解如何從一個微不足道的 “小” 操作系統,根據應用需求,添加或增強操作系統功能,逐步形成一個類似 UNIX 的相對完善的 “小” 操作系統。每一步都小到足以讓人感覺到易於掌控,而在每一步結束時,你都有一個可以工作的 “小” 操作系統。另外,通過足夠詳盡的測試程序 ,可以隨時驗證讀者實現的操作系統在每次更新後是否正常工作。由於實驗的代碼規模和實現複雜度在一個逐步遞增的可控範圍內,讀者可以結合對應於操作系統設計實驗的進一步的原理講解,來建立操作系統概念原理和實際實現的對應關係,從而能夠通過操作系統實驗的實踐過程來加強對理論概念的理解,通過理論概念來進一步指導操作系統實驗的實現與改進。
在你開始閱讀與實踐本書講解的內容之前,你需要決定用什麼編程語言來完成操作系統實驗。你可以用任何你喜歡的編程語言和你喜歡的 CPU 上來實現操作系統。我們推薦的編程語言是 Rust,我們推薦的 CPU 是 RISC-V。
原文鏈接:https://www.yuque.com/books/share/5f5c6736-db36-4840-ac23-7b28ba2e351f/ql9m18
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/6lLEZL-G5q08rc5Zm-3sPQ