Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ベアメタル向けRust stdクレートの実装調査
Search
Kenta IDA
October 24, 2021
Programming
2
680
ベアメタル向けRust stdクレートの実装調査
TOPPERS開発者会議2021のLTで発表した内容のスライドです。
Kenta IDA
October 24, 2021
Tweet
Share
More Decks by Kenta IDA
See All by Kenta IDA
Matter開発環境をざっくり眺める
ciniml
0
1.5k
組込みRustでも でかい?JSONを扱いたい!
ciniml
3
1.2k
ATOMDisplay_DisplayModule_M5Stack_UG_2023_Tokyo.pdf
ciniml
1
1.6k
Rusty Stack-chanのすすめ
ciniml
0
460
Raspberry Pi Picoデバッガ使用のすすめ
ciniml
0
1.9k
ESP32でSORACOM Arcつないでみた
ciniml
2
1.1k
RustでCMSIS-DAP実装してみた。
ciniml
2
860
技書博初出展してみた
ciniml
0
350
Wio Terminalのなんやかんや
ciniml
2
1.5k
Other Decks in Programming
See All in Programming
約9000個の自動テストの 時間を50分->10分に短縮 Flakyテストを1%以下に抑えた話
hatsu38
24
12k
macOS でできる リアルタイム動画像処理
biacco42
9
2.3k
LLM生成文章の精度評価自動化とプロンプトチューニングの効率化について
layerx
PRO
2
170
GCCのプラグインを作る / I Made a GCC Plugin
shouth
1
160
RailsのPull requestsのレビューの時に私が考えていること
yahonda
5
2.7k
WEBエンジニア向けAI活用入門
sutetotanuki
0
330
C++でシェーダを書く
fadis
6
3.9k
Streams APIとTCPフロー制御 / Web Streams API and TCP flow control
tasshi
2
340
カスタムしながら理解するGraphQL Connection
yanagii
1
1.5k
役立つログに取り組もう
irof
28
9.3k
ヤプリ新卒SREの オンボーディング
masaki12
0
110
Duckdb-Wasmでローカルダッシュボードを作ってみた
nkforwork
0
100
Featured
See All Featured
How STYLIGHT went responsive
nonsquared
95
5.2k
Adopting Sorbet at Scale
ufuk
73
9.1k
Happy Clients
brianwarren
97
6.7k
Fashionably flexible responsive web design (full day workshop)
malarkey
404
65k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
42
2.2k
Rails Girls Zürich Keynote
gr2m
93
13k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
169
50k
Statistics for Hackers
jakevdp
796
220k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.3k
Why You Should Never Use an ORM
jnunemaker
PRO
54
9k
How to Ace a Technical Interview
jacobian
276
23k
Transcript
ベアメタル向け Rust std クレートの実装調査 TOPPERS開発者会議2021 LT 2021/10/24 Kenta Ida (@ciniml)
自己紹介 •井田 健太 (@ciniml) •仕事:FPGAの論理設計 •使用言語:C++, SystemVerilog, Rust, C# •組込みRust本の1割くらい書きました
(サンプルアプリ作ったり、デバッガ試したり)→ 2021/10/24 ベアメタル向けRust std クレートの実装調査 2
ベアメタルRust 2021/10/24 ベアメタル向けRust std クレートの実装調査 •OSが無い環境 (ベアメタル) 向けのソフトウェアを Rustで開発する方法 •OS機能に依存している
std クレート無しでの開発 • core, alloc クレートのみに依存 • #[no_std] 3
stdクレートが提供する機能 2021/10/24 ベアメタル向けRust std クレートの実装調査 •process - プロセス操作 •thread -
スレッド操作 •fs - ファイル操作 • path - パス操作 •net - TCP/UDP通信 •io - I/O関連 4
no_stdの難点 2021/10/24 ベアメタル向けRust std クレートの実装調査 • stdクレートの提供する機能が使えない • stdクレートに依存しているクレートが使えない (e.g.
ネットワーク周りなど) • no_std対応クレートのみ使用可 • 一方、stdクレートの機能は ベアメタルの組込みシステムでも一般的な機能 • ファイル操作 • TCP/UDP通信 • スレッド (タスク) • RTOSがある場合 5
stdクレートのベアメタル向け実装 2021/10/24 ベアメタル向けRust std クレートの実装調査 •そもそもstdクレートが提供する機能が ベアメタル向けのフレームワークにあるのであれば stdクレートも実装できるはずでは? • というか、
今日のメインセッションでSOLID向け実装されてましたね。 • 今朝stdのソースを確認していて気づきました 6
stdクレートの構造 2021/10/24 ベアメタル向けRust std クレートの実装調査 •各トップレベルのモジュールは sys, sys_common, os サブモジュールを使って実装
• sys - 各プラットフォーム向けのstdクレート実装の実体 • sys_common - 各プラットフォームで共通の処理の実装 • socket APIによる通信処理など • os - OS固有の処理の実装 ... ├── os │ ├── espidf │ ├── linux │ ├── solid │ ├── unix │ ├── vxworks │ ├── wasi │ └── windows ├── sys │ ├── common │ ├── itron │ ├── solid │ ├── unix │ ├── unsupported │ ├── wasi │ └── windows ├── sys_common │ ├── fs.rs │ ├── io.rs │ ├── net.rs │ ├── thread.rs ... 7
stdクレートの依存関係 2021/10/24 ベアメタル向けRust std クレートの実装調査 • I/O周り • 大体のプラットフォームで libc
クレートにあるlibcが提供する関数を使って実装されて いる • net周り • 大体socket APIで実装されている • thread周り • OS依存 • POSIX向け - pthreads • つまり、libc, socket, pthreadsがある環境であれば それぞれの部分は比較的容易に実装可能…なはず 8
ESP32の開発環境 2021/10/24 ベアメタル向けRust std クレートの実装調査 •ESP32 • 中国Espressifが製造している無線機能付きMCU • ESP32
- CPUはXtensa LX6 (カスタム版rustcで対応) • ESP32-C3 - CPUはRISC-V RV32IMC 9
ESP32の開発環境 2021/10/24 ベアメタル向けRust std クレートの実装調査 •ESP-IDF • ESP32シリーズ向けの公式フレームワーク • C/C++で開発可能
• FreeRTOS, lwIP, mbedtlsを含む • libcとしてnewlibを使用 • pthreadsにある程度対応 • C++11のthread対応のために元々実装されていた。 • FreeRTOSの機能で実装 10
ESP32のRust対応 2021/10/24 ベアメタル向けRust std クレートの実装調査 • 2018年頃からLLVMをforkしてclang対応 • LLVMはXtensaに対応していない •
有志がfork版LLVMをつかってrustcをXtensa対応 • fork版LLVMの更新は継続中 • 最新のLLVMに対応 • upstreamにパッチを投げているが2021/5より進捗なし • RISC-V版ESP32 (ESP32-C3)登場後 stdクレート対応 • 元々第3者による開発だったが、開発者はEspressifに入った模様 • ESP-IDF向けだったので、Xtensa版でも動作する 11
ESP-IDF向けstdクレート 2021/10/24 ベアメタル向けRust std クレートの実装調査 •newlibによるlibc機能 unix向けに条件分岐を追加して対応 • https://github.com/rust-lang/rust/pull/87666 •libcクレートをESP-IDFのnewlib,
lwIPに合わせて修正 • https://github.com/rust-lang/libc/pull/2310 12
libcクレートの修正 (一部) 2021/10/24 ベアメタル向けRust std クレートの実装調査 •newlib向け実装 (src/newlib) を修正 •
ESP-IDF向け実装を追加 (src/newlib/espidf) •lwIP向けに定義を分岐 (例: bind関数 → lwip_bind) #[cfg_attr(target_os = "espidf", link_name = "lwip_bind")] pub fn bind(fd: ::c_int, addr: *const sockaddr, len: socklen_t) ‐> ::c_int; cfg_if! { if #[cfg(target_os = "espidf")] { mod espidf; pub use self::espidf::*; 13
stdクレートの修正 (一部) 2021/10/24 ベアメタル向けRust std クレートの実装調査 •processをサポートしないのでダミーの定義を追加 impl Command {
pub fn spawn( &mut self, default: Stdio, needs_stdin: bool, ) ‐> io::Result<(Process, StdioPipes)> { unsupported() // Unsupportedを返す } 14
stdクレートの修正 (一部) 2021/10/24 ベアメタル向けRust std クレートの実装調査 •thread周り • スタックサイズなどが違うので条件分岐 •
sleepの実装を分岐 #[cfg(target_os = "espidf")] pub fn sleep(dur: Duration) { let mut micros = dur.as_micros(); unsafe { while micros > 0 { let st = if micros > u32::MAX as u128 { u32::MAX } else { micros as u32 }; libc::usleep(st); micros ‐= st as u128; } } } 15
stdクレート実装を眺めた雑感 2021/10/24 ベアメタル向けRust std クレートの実装調査 •思ったよりも実装量は多くなさそう • libc, lwIP, pthreadsがあれば
• unixモジュールに対してひたすら条件分岐追加 • それ以外の場合は対応した実装が必要 •使いたいプラットフォーム向けの実装をしてみたい • ESP32向けは既に公式で出たので… 16
おしまい 2021/10/24 ベアメタル向けRust std クレートの実装調査 17