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
820
2
Share
ベアメタル向けRust stdクレートの実装調査
TOPPERS開発者会議2021のLTで発表した内容のスライドです。
Kenta IDA
October 24, 2021
More Decks by Kenta IDA
See All by Kenta IDA
日本の家電とMatterの世界
ciniml
0
490
Matter開発環境をざっくり眺める
ciniml
0
2.2k
組込みRustでも でかい?JSONを扱いたい!
ciniml
3
1.4k
ATOMDisplay_DisplayModule_M5Stack_UG_2023_Tokyo.pdf
ciniml
1
1.8k
Rusty Stack-chanのすすめ
ciniml
0
730
Raspberry Pi Picoデバッガ使用のすすめ
ciniml
0
2.3k
ESP32でSORACOM Arcつないでみた
ciniml
2
1.4k
RustでCMSIS-DAP実装してみた。
ciniml
3
1.1k
技書博初出展してみた
ciniml
0
460
Other Decks in Programming
See All in Programming
Redox OS でのネームスペース管理と chroot の実現
isanethen
0
570
Vibe NLP for Applied NLP
inesmontani
PRO
0
320
Linux Kernelの1文字のミスで 権限昇格ができた話
rqda
0
2.3k
forteeの改修から振り返るPHPerKaigi 2026
muno92
PRO
3
270
TiDBのアーキテクチャから学ぶ分散システム入門 〜MySQL互換のNewSQLは何を解決するのか〜 / tidb-architecture-study
dznbk
1
160
安いハードウェアでVulkan
fadis
1
950
Kubernetes上でAgentを動かすための最新動向と押さえるべき概念まとめ
sotamaki0421
3
480
レガシーPHP転生 〜父がドメインエキスパートだったのでDDD+Claude Codeでチート開発します〜
panda_program
0
670
それはエンジニアリングの糧である:AI開発のためにAIのOSSを開発する現場より / It serves as fuel for engineering: insights from the field of developing open-source AI for AI development.
nrslib
1
840
テレメトリーシグナルが導くパフォーマンス最適化 / Performance Optimization Driven by Telemetry Signals
seike460
PRO
2
220
瑠璃の宝石に学ぶ技術の声の聴き方 / 【劇場版】アニメから得た学びを発表会2026 #エンジニアニメ
mazrean
0
230
Running Swift without an OS
kishikawakatsumi
0
760
Featured
See All Featured
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.2k
Fireside Chat
paigeccino
42
3.9k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
170
It's Worth the Effort
3n
188
29k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
97
Amusing Abliteration
ianozsvald
1
150
Ruling the World: When Life Gets Gamed
codingconduct
0
190
The #1 spot is gone: here's how to win anyway
tamaranovitovic
2
1k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.2k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
9.9k
Evolving SEO for Evolving Search Engines
ryanjones
0
180
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