這應該是裸機程式的最後一篇了,回顧一下第一篇
所說,到現代幾個進化的點,
- Rustup
- cargo config
- rlibc
- 用 library
前三點我們已經看過了
- 用 rustup 來安裝 target,雖然我後來想了一下,覺得這並不是 rust 勝過 C 而是 LLVM 勝過 gcc,rust 只是站在 LLVM 的肩膀上所以看得更遠而已。
- cargo config 就如前文所述,利用 .cargo/config 來設定編譯目標,以及連結時的 linker script ,只要套用不同的 config 就能對不同目標編譯。
- rlibc 可能比較隱晦一點,但 rlibc 要提供的 memset/memcpy/memmove ,在 core::ptr 裡面已經提供了核心的實作了,所以不需要再引入 rlibc。
最後就是用 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 的地方讀取兩個值:
- 0x0 是初始的 stack pointer value。
- 0x4 是 reset exception handler。
...
其實標題應該要寫成「在 2021 裡用 Rust 開發裸機程式是種怎樣的體驗」
故事是這樣子的,很久很久以前我曾經寫過一篇文
,
胡亂攪了一陣,弄出一個只是會動的 Rust 嵌入式系統,時隔這麼久,Rust 的生態也完全不一樣了,最近因為剛好比較閒就花了點時間再看看,
結果找到別人連書都寫好了呢
w (看書中的 rustc 成書年代應該是 2018 年左右)。
這篇大概會是照著上面這本書的操作記錄,不知道會整理成多少篇,讓我們拭目以待。
...
故事是這樣子的,很早以前大概 2014/2015 的時候,就曾經因為傳說中的 jserv 大大的關係,聽聞傳說中的 FreeRTOS,然後也有不深入地小玩了一下。
最近又因為到前公司戀戀科技的專案,竟然又接觸到(已經被 Amazon 收購的) FreeRTOS ,花了點時間把 FreeRTOS 移植到某個新的 ARM 平台,
在移植的時候也稍微仔細的 trace 了 FreeRTOS 的程式碼,順便就寫了點筆記,整理一下貼上來。
...
故事是這樣的,很久以前曾經在rust 上面實作 hello world 的 arm 程式
,不過那時候的作法現在已經不能用,而且除了輸出x 之外其實不能幹嘛,更別提後面更多的東西了。
其實網路上也查得到不少Rust OS 的實作,沒道理我做不到,於是就來試一試了。
...
約一週前重灌了電腦,重灌這檔事最麻煩的就是一些開發環境會消失不見,平常用得順手的東西突然不見了,例如我的arm 開發環境就是一例:
...
以後有可能會用到,寫這篇純粹做個記錄。
故事是這樣子的,最近閒來無事研究一下傳說中 jserv 大神的amacc,有些地方實在看不出程式執行至此時一些變數的值為何,這時我們就要用gdb 了
不過amacc 是用 arm-linux-gnueabihf-gcc 編出來的arm 執行檔,我們host gdb 是X86 在執行時就會報錯:可執行檔格式錯誤
如果用arm-linux-gnueabihf-gdb 呢:它會寫 Don’t know how to run.
...
最近看到一些有趣的東西:
用rust 來寫嵌入式系統,感覺相當生猛,正好最近在上傳說中的jserv 大神的嵌入式系統,就想把嵌入式系統作業用到東西,用rust 實作出來,
主要參考的內容包括上面的armboot,跟作業的mini-arm-os
:
本篇相關的原始碼
:
...