精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

面向對象的Rust微內核介紹

yzcdx ? 來源:OS與AUTOSAR研究 ? 2022-12-30 11:53 ? 次閱讀

前面介紹的rCore操作系統:rCore入門-來自清華的OS前沿教程,是清華的教學OS,相當于使用Rust語言山寨了下Linux,是一個宏內核

之前我有一篇文章介紹了微內核:seL4微內核入門-微內核介紹,相對來說微內核在學術上更嚴謹先進一些,盡管性能不如宏內核,其他方面有點多,特別是安全性

所以清華又搞了一個zCore思路還是山寨,這次瞄上了谷歌Fuchsia的Zicron微內核,見之前的文章Fuchsia入門-簡介和代碼介紹,總結下:

rCore:使用Rust語言山寨宏內核Linux

zCore:使用Rust語言山寨微內核Zicron

注意:這里說的山寨不是完全參考,不同語言也全參考不了,實現方式有很多不同之處。

上圖是王潤基同學惡搞了下谷歌Fuchsia的發布,改成自己的了真是新iPhone還沒出來山寨就有了。

總結下,這些OS其實都有一個技術指向:Rust+微內核

谷歌的Fuchsia比較難產,所以逼急了又推出來一個KataOS,見之前文章:KataOS入門-簡介和代碼編譯,直接用現成的seL4微內核+Rust應用框架Sparrow搞了。

回歸正題,

1. zCore簡介

161c3c48-7625-11ed-8abf-dac502259ad0.png

zCore 是用 Rust 語言重新實現的 Zircon 微內核

它運行在內核態,對外提供與 Zircon 完全相同的系統調用,因此能夠運行原生的 Fuchsia 用戶程序

之前的文章介紹過Fuchsia的強大,其應用程序更是兼容了安卓,另外對于微內核驅動也是應用,也可以應用Fuchsia強大的驅動程序。可見這個zCore的巨大應用價值。

2. 面向對象的內核

1661b214-7625-11ed-8abf-dac502259ad0.png

Zicron是用c++寫的,更適合用Rust重寫。有一個問題:什么時候需要面向對象?

假如世界上只有一個上帝,那就不需要面向對象。但是世界上還有幾億的人,人都有非常多的共性,那答案就是有很多個實例的時候就需要面向對象。

回到內核,第一直覺是進程,這東西是多個的,特別是用戶進程,這必須可以面向對象啊,然后IPC通信,有很多進程直接又很多個通道通信,很多個就又可以面向對象。

凡是可以有多個的東西,都可以面向對象

c語言編寫的內核或者宏內核中,經常用到抽象出來的結構體,多個的表達就是結構體數組或者結構體鏈表,其輔助處理函數都要自己寫,例如查找插入改變值等,很繁瑣

然后所有的東西都往進程結構體PCB里面塞,很多機制理解起來很費力,要去看那個很大的PCB結構體去理解,一下就懵了

人還是容易理解抽象出來的事物然后加上簡單的思維邏輯,不抽象的混亂思維一會就暈了。

Zircon 是一個基于對象的內核

下面帶你領略下面向對象的魅力,真是輕松學內核的法寶。先來看一個zCore內核運行時組件層次框架圖:

1691c288-7625-11ed-8abf-dac502259ad0.png ????

大家知道一般程序處理的流程:用戶程序-》系統調用-》內核-》硬件里面去處理。

上圖中紅框里面就是把內核里面跟硬件無關的元素抽象出來,用面向對象的方法表示出來。

例如系統里面有多個Process,一個Process實例里面有很多個Handle和Rights指向其他的對象。

16c3852a-7625-11ed-8abf-dac502259ad0.png

內核對象相關的三個重要概念:對象(Object),句柄(Handle),權限(Rights)。

對象(Object)具備屬性和行為的客體。客體之間可有各種聯系。從簡單的整數到復雜的操作系統進程等都可看做對象,它不僅僅表示具體的事物,還能表示抽象的規則、計劃或事件。

句柄(Handle)標識對象的符號,也可看成是一種指向對象的變量(也可稱為標識符、引用、ID等)。

權限(Rights):是指對象的訪問者被允許在對象上執行的操作,即對象的訪問權限。當對象訪問者打開對象的句柄,該句柄具有對其對象的訪問權限的某種組合。

說下我的理解,內核的資源都被抽象成對象,對象之間用句柄產生聯系,這種聯系為了安全性有權限限制,當沒有句柄指向的對象也就是沒用了會被收回。

用戶程序操作內核對象的一些細節:

創建:每一種內核對象都存在一個系統調用來創建它,例如zx_channel_create。創建對象時一般需要傳入一個參數選項 options,若創建成功則內核會將一個新句柄寫入用戶指定的內存中。

使用:獲得對象句柄后可以通過若干系統調用對它進行操作,例如zx_channel_write。這類系統調用一般需要傳入句柄 handle 作為第一個參數,內核首先對其進行檢查,如果句柄非法或者對象類型與系統調用不匹配就會報錯。接下來內核會檢查句柄的權限是否滿足操作的要求,例如 write 操作一般要求句柄具有 WRITE 權限,如果權限不滿足就會繼續報錯。

關閉:當用戶程序不再使用對象時,會調用zx_handle_close關閉句柄。當用戶進程退出時,仍處于打開狀態的句柄也都會自動關閉。

總之,面向對象的代碼很清晰,很容易理解,不繞彎子,利用面向對象的語法,代碼行數能大大縮減,預計5倍以上。上面的介紹大部分都是zCore教程里面的,這個教程更加的干貨,直接介紹核心概念,對OS基礎知識進行了省略。同rCore教程一樣也是從零開始自己寫一個OS的教程,這個感覺做的更好。

16fb9cd0-7625-11ed-8abf-dac502259ad0.png

3. rCore整體架構

zCore的設計主要有兩個出發點:

內核對象的封裝:將內核對象代碼封裝為一個庫,保證可重用

硬件接口的設計:使硬件與內核對象的設計相對獨立,只向上提供統一、抽象的API接口

項目設計從上到下,上層更遠離硬件,下層更接近硬件,架構如下圖所示:

1723492e-7625-11ed-8abf-dac502259ad0.png

為了讓 zCore 能夠同時運行在內核態和用戶態,我們在最下面設計了一個硬件抽象層(HAL),將內核所依賴的底層操作封裝起來,在裸機環境和 Linux/macOS 環境上分別提供不同的實現。 在 HAL 之上的核心是zircon-object,也就是 Zircon 內核對象,這里面包含了所有內核機制的實現。

在對象層之上是系統調用層,它負責將內核對象的功能封裝成 Zircon syscall ABI 暴露給用戶進程。 再往上就是整個 OS 的頂層模塊,它負責完成系統初始化和加載第一個用戶進程的工作,并將所有模塊組裝到一起,生成一個可執行文件。 zCore 設計的頂層是上層操作系統,比如 zCore、rCore、ZirconLibOS 和 Linux LibOS。

在項目架構中,各版本的操作系統有部分公用代碼。與 zCore 微內核設計實現相關的部分則主要是圖中左側藍色線部分。

乍一看,真是四不像,有點像嫁接,共用一個根,嫁接上不同的枝條,枝條上可以結出不同的水果。感覺這就是程序的高級玩法,殊途同歸,萬法歸一,還能相互轉化,實在是高,萬能工具啊。好處是,這幾種OS上的應用都可以在zCore上運行,跟吃了幾種水果一樣甜啊。

4. OS界的變形金剛

不僅如此,它還可以作為一個普通的用戶進程運行在 Linux 或 macOS 的用戶態,我們一般把這種模式稱為 LibOS 或 User-Mode OS。你甚至無需安裝 QEMU 模擬器,只需裝上 Rust 官方工具鏈,就可以編譯運行體驗 zCore!

git clone https://github.com/rcore-os/zCore --recursive
cd zCore
git lfs pull
cargo run --release -p zircon-loader prebuilt/zircon
既然可以用戶態運行,那么它其實就是一個普通的用戶程序。這帶來了巨大的好處:我們可以在用戶態開發,用 gdb 配合 IDE 調試,用cargo test 跑單元測試,統計測試覆蓋率……這在之前的內核開發中是難以想象的。

17c3a37e-7625-11ed-8abf-dac502259ad0.png ???

zCore 作為 rCore 的繼承者,它并沒有把前輩丟掉。事實上,zCore 并不是一個獨立的 OS,在它的倉庫里還藏著一個小 rCore!只需使用以下命令,即可快速把它召喚出來,我們來運行一個原生 Linux 程序——Busybox:
make rootfs
cargo run--release-plinux-loader/bin/busybox
17f189c4-7625-11ed-8abf-dac502259ad0.png ????

這里面的奧秘在于,Zircon 作為微內核,其實已經提供了內核中最關鍵的內存管理和進程管理的功能。

我們只需在它基礎上補充 Linux 作為宏內核的其它功能(例如文件系統),并對外提供 Linux 系統調用接口,即可重新構造出一個新的 rCore。

這就是微內核運行宏內核程序的關鍵,缺的東西再加一層殼子,再封裝一層系統調用。

5.編程語言分析

1836c32c-7625-11ed-8abf-dac502259ad0.png

官方 Zircon 是用 C++ 語言編寫的,代碼量約有 10w 行。而 zCore 只用了1w 行 Rust 就實現了其中大部分核心功能。雖然我們還差一些沒有實現,但相差一個數量級的規模還是讓我感到有些詫異。

不過至少據我觀察,C++ 的 Zircon 代碼從設計上就比較復雜,用了各種自己造的輪子,并且充斥著魔法操作。相比之下,Rust 的 zCore 代碼看起來更加自然,核心庫自帶的基礎設施再加上一些社區庫的輔助,用起來還是非常舒服的。

關于 Rust 大家更關心的另一個話題unsafe。在 zCore 中我們盡量避免了 unsafe 的使用,但沒有絕對禁止(畢竟禁止就寫不出來了)。

據統計,在 HAL 之上大約有 20 個 unsafe,其中大部分用在了兩個對象之間互相取 Weak 引用的操作,剩下的也比較容易檢驗正確性。

而 HAL 之下 unsafe 就比較多了,由于貼近底層硬件,幾乎處處 unsafe,也就跟 C 沒什么區別了。不過好在 HAL 代碼還是比較少的,不過幾百行而已。

Rust 唯一的問題就是門檻太高了。然而對于編寫內核這種對性能、穩定性、安全性都要求極高的程序而言,門檻高一點未必是壞處。

在被 Rust 編譯器反復教做人之后,才知道自己當初太天真,寫出來的程序處處是隱患。

async 機制除了上面提到的用戶態運行之外,zCore 還有一大創新之處:首次在內核中引入了 async 無棧協程機制。

熟悉主流編程語言的朋友會知道,async 是近幾年開始流行的一種語言特性,能夠讓開發者用同步的風格編寫異步代碼。它本質上是將代碼變換成狀態機,在 OS 線程的基礎上又提供了一層輕量級的“協程”,使得程序能夠高效處理異步 IO,同時保持開發的高效率。

Rust 語言于 2019 年底正式穩定了 async-await 語法,并于今年 3 月份的PR#69033中為 no_std 環境下使用 async 掃清了障礙。

這使得在內核中全面應用 async 機制成為了可能,而 zCore 可能是第一個吃螃蟹的人。(C++20 中也引入了同樣的特性,不過考慮到歷史包袱和生態問題,我比較懷疑能否真正用起來)

在傳統 OS 中,每個內核線程需要有自己獨立的內核棧。當線程掛起時,它的狀態就保存在棧上。

由于內核線程可能很多,因此每個線程的棧都不能太大,在 Linux 中一般是兩個頁也就是 8KB。而在 zCore 中,所有內核線程都變成了協程,在一個 CPU 核上共享同一個內核棧。

當進入用戶態時,內核棧不再清空,因為要保留必要的信息,于是內核-用戶切換的風格從傳統的「用戶態中斷調用內核處理函數」變成了「內核主動調用函數切換到用戶態執行」。

當任務掛起時,協程的狀態被包裝成 Future 存儲在堆上。根據計算,目前每個 Future 狀態機的大小約為 600B 左右,大幅節省了內存空間。

無棧協程相比線程的好處除了空間占用少以外,還有更小的上下文切換開銷,進而實現更高的并發和吞吐率。

不過它的缺點在于協作式、不可搶占,這可能會為系統的實時性帶來挑戰。關于二者之間的對比,還有待進一步的測試和分析。

zCore 的主要特性和創新點:

第一個完全山寨的 Zircon 內核

使用 Rust 編寫,實現精簡,層級清晰

支持用戶態開發、測試和運行

第一個在內核中使用 async 機制

總的來說,zCore 應該是目前為止我們能想到、做到的,Rust 語言操作系統的集大成之作了。

6. 代碼下載體驗

已經運行過rCore環境的機器,可以直接下載zCore的代碼體驗下。

下載命令:

Git clone https://github.com/rcore-os/zCore.git
編譯運行命令:
cargo qemu --arch riscv64
還是基于RISC-V硬件的qemu虛擬機運行:

189a7a70-7625-11ed-8abf-dac502259ad0.png






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 模擬器
    +關注

    關注

    2

    文章

    870

    瀏覽量

    43167
  • GDB調試
    +關注

    關注

    0

    文章

    24

    瀏覽量

    1437
  • HAL庫
    +關注

    關注

    1

    文章

    114

    瀏覽量

    6179
  • Rust
    +關注

    關注

    1

    文章

    228

    瀏覽量

    6574

原文標題:zCore入門-面向對象的Rust微內核

文章出處:【微信號:OS與AUTOSAR研究,微信公眾號:OS與AUTOSAR研究】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Linux內核面向對象編程的實現

    面向對象編程(OOP),是一種設計思想或者架構風格。OO語言之父Alan Kay,Smalltalk的發明人,在談到OOP時是這樣說的。
    發表于 07-21 14:51 ?575次閱讀

    Python的面向對象編程詳解

    一般編程可分為面向過程編程,和面向對象編程。Python的面向對象編程,與Java的面向
    發表于 09-04 16:35 ?526次閱讀
    Python的<b class='flag-5'>面向</b><b class='flag-5'>對象</b>編程詳解

    labview面向對象編程

    點擊學習>>《龍哥手把手教你學LabVIEW視覺設計》視頻教程使用LabVIEW面向對象編程方法,對于大型測試應用程序來講,面向對象相對于面向
    發表于 11-24 11:01

    關于面向對象

    本帖最后由 sthhhh 于 2016-8-5 15:32 編輯 請問現在已有一個程序,如果要把這個程序改為面向對象編程可以嗎?我需要怎么做?書上介紹面向
    發表于 08-05 14:22

    LabVIEW面向對象編程入門介紹

    LabVIEW面向對象編程入門介紹類庫描述介紹
    發表于 11-20 10:51

    LabVIEW面向對象的ActorFramework(1)

    ` 本帖最后由 bollworm 于 2020-2-10 14:54 編輯 本系列文章主要闡述以下幾個問題:(1)什么是面向對象編程?(2)為什么要學習面向編程?(3)LabVIEW面向
    發表于 02-10 14:09

    談談面向對象編程

    在工業自動化領域,梯形圖邏輯仍然是最常用的編程語言之一,但對于更加復雜的控制對象面向對象編程不失為一種高效率的方式。下面先來談談面向對象
    發表于 09-08 07:47

    面向對象編程語言的特點

    在工業自動化領域,梯形圖邏輯仍然是最常用的編程語言之一,但對于更加復雜的控制對象面向對象編程不失為一種高效率的方式。下面先來談談面向對象
    發表于 09-08 07:44

    面向對象編程總結

    如何從面向過程到面向對象OOP?面向對象是什么?有何特點?
    發表于 09-29 08:19

    面向對象編程介紹

    目錄一、面向對象編程介紹1.面向過程編程2.函數式編程3.面向對象編程二.
    發表于 12-13 07:22

    C語言是如何實現面向對象

    ,C++是 面向對象 的編程語言,但面向對象的概念是在C語言階段就有了,而且應用到了很多地方,比如某些操作系統內核、通信協議等。
    的頭像 發表于 12-24 17:08 ?2w次閱讀
    C語言是如何實現<b class='flag-5'>面向</b><b class='flag-5'>對象</b>的

    Rust添加到Linux6.1內核的方法

    在歐洲開源峰會上,Linus Torvalds 宣布,他將在當天(在內核維護者峰會上)推動 Rust 進入即將推出的 6.1 Linux 內核
    的頭像 發表于 09-19 10:24 ?1340次閱讀

    Linux內核中整合對 Rust 的支持

    Linux Plumbers Conference 2022 大會上舉行了一個 Rust 相關的小型會議,該會議討論的大方向大致為:正在進行的使 Rust 成為一種合適的系統編程語言的工作,以及在主線 Linux 內核中整合對
    的頭像 發表于 09-19 11:06 ?1159次閱讀

    面向過程與面向對象的區別

    說起面向對象,大家可能會想到其他的,但是此對象非彼對象哈哈,不必驚慌,也特別好搞定。 在聽到面向
    的頭像 發表于 02-15 11:10 ?4076次閱讀
    <b class='flag-5'>面向</b>過程與<b class='flag-5'>面向</b><b class='flag-5'>對象</b>的區別

    zircon內核啟動代碼分析

    Zircon內核的代碼是用C++寫的,C++和C的基礎語法差不多,C++新加入了一些面向對象的東西
    的頭像 發表于 06-11 09:14 ?2639次閱讀
    zircon<b class='flag-5'>微</b><b class='flag-5'>內核</b>啟動代碼分析