rrxv6 : Embedded Rust
上一回我們看到我們用 rust 寫了一些底層的 code,當然,這個寫法並不好看,有沒有更漂亮的寫法呢? 這篇參考了 rust cortex-m 的寫法, 以及強者我同學在 Google 大殺四方的小新大大分享的文 A guide to better embedded C++ 。
...上一回我們看到我們用 rust 寫了一些底層的 code,當然,這個寫法並不好看,有沒有更漂亮的寫法呢? 這篇參考了 rust cortex-m 的寫法, 以及強者我同學在 Google 大殺四方的小新大大分享的文 A guide to better embedded C++ 。
...上一篇我們成功讓 assembly 執行一個 jump 跳進 Rust 函式,但這樣其實一點用也沒有,畢竟只會 loop 的作業系統並不是一個很好的作業系統; 這篇我們就參考一下 xv6 的開機流程,然後試著用 Rust 重新實作。
...故事是這樣子的,大概六月中的時候,小弟因緣際會空出一些時間,因為武肺持續三級警戒只能待在家裡,除了打混摸魚之外順便看了一下別人寫的翻譯文
embedonomicon
,翻完之後看看 rust cortex-m
都被人做走了
,那有什麼東西可以玩的呢?
有一天晚上上床的時候就想到了,剛好最近在想看一下 MIT 教學用的作業系統 xv6,看看究竟可以用的作業系統是怎麼實作的,
而 xv6 本來是針對 x86 處理器,最近才被移植到新的 riscv 處理器上,
也有人把 xv6 用 rust 重新實作
,那我是不是能如下圖,填上這個表格最後一個空格呢?
C | Rust | |
---|---|---|
x86 | xv6 legacy | xv6-rust |
Riscv | xv6-riscv | 404 Not Found |
這應該是裸機程式的最後一篇了,回顧一下第一篇 所說,到現代幾個進化的點,
前三點我們已經看過了
最後就是用 library 啦,在前面的篇章都沒提到這個,為什麼?
...現在的 main 程式現在只能使用 stack variable,還不能使用 static 變數,因為我們在 linker 內只放了 .text 區段, static 變數 所用的 .data(已初始化)、.bss(未初始化) 都還沒準備。
...我們的最小程式現在能進到 reset_handler 了,但重要的是能進到使用者寫的 main 函式,不然這個 kernel 也沒用。 我們先把我們的 main.rs 改成 lib.rs,rt 編成 library 之後,類似 FreeRTOS 的感覺,再搭配使用者寫的 main.rs 編成完整的執行檔; 使用者寫的 main.rs 可以呼叫 kernel 提供的服務函式。
...我們的目標先訂在 arm cortex m3 的處理器, m3 處理器參考 arm 官方的開發文件 , 在 arm 處理器一上電的時候,會從記憶體位址 0x0 的地方讀取兩個值:
故事是這樣子的,很早以前大概 2014/2015 的時候,就曾經因為傳說中的 jserv 大大的關係,聽聞傳說中的 FreeRTOS,然後也有不深入地小玩了一下。
最近又因為到前公司戀戀科技的專案,竟然又接觸到(已經被 Amazon 收購的) FreeRTOS ,花了點時間把 FreeRTOS 移植到某個新的 ARM 平台,
在移植的時候也稍微仔細的 trace 了 FreeRTOS 的程式碼,順便就寫了點筆記,整理一下貼上來。
在我們看過兩個官方文件的範例之後,可以開始寫點真正的 code 了,如之前所言,我們要把 gameboy 移植到 WebAssembly 上面, 這篇文可以說明這到底有多簡單,我覺得已經很接近所謂的 “Code Once, Run Anywhere” 了。
...