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で始める自作組込みOS
Search
garasubo
June 17, 2019
Technology
1
3.5k
Rustで始める自作組込みOS
https://inteface-meet-up.connpass.com/event/126924/
で発表した内容
garasubo
June 17, 2019
Tweet
Share
More Decks by garasubo
See All by garasubo
Cancel Safetyとスレッドリーク
garasubo
1
570
RustでISUCONに勝つには
garasubo
1
720
Rustでの自作OSをやってきて
garasubo
0
1.1k
Armの仮想化支援機構を用いてハイパーバイザーを自作する
garasubo
3
7.2k
RustからX Window Systemを触る
garasubo
0
640
クラウド向けOS(?)Unikernelとは何か
garasubo
0
1.8k
論文紹介:KVM/ARM: The Design and Implementation of the Linux ARM Hypervisor
garasubo
0
630
Other Decks in Technology
See All in Technology
DDD集約とサービスコンテキスト境界との関係性
pandayumi
2
270
2025年夏 コーディングエージェントを統べる者
nwiizo
0
120
AI開発ツールCreateがAnythingになったよ
tendasato
0
110
今!ソフトウェアエンジニアがハードウェアに手を出すには
mackee
11
4.4k
COVESA VSSによる車両データモデルの標準化とAWS IoT FleetWiseの活用
osawa
1
220
【初心者向け】ローカルLLMの色々な動かし方まとめ
aratako
7
3.3k
「何となくテストする」を卒業するためにプロダクトが動く仕組みを理解しよう
kawabeaver
0
270
テストを軸にした生き残り術
kworkdev
PRO
0
190
研究開発と製品開発、両利きのロボティクス
youtalk
1
500
Grafana MCPサーバーによるAIエージェント経由でのGrafanaダッシュボード動的生成
hamadakoji
1
1.5k
dbt開発 with Claude Codeのためのガードレール設計
10xinc
1
830
下手な強制、ダメ!絶対! 「ガードレール」を「檻」にさせない"ガバナンス"の取り方とは?
tsukaman
2
390
Featured
See All Featured
The Language of Interfaces
destraynor
161
25k
Building Applications with DynamoDB
mza
96
6.6k
Done Done
chrislema
185
16k
The Cost Of JavaScript in 2023
addyosmani
53
8.9k
YesSQL, Process and Tooling at Scale
rocio
173
14k
Raft: Consensus for Rubyists
vanstee
140
7.1k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
Embracing the Ebb and Flow
colly
87
4.8k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
53
2.9k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
126
53k
Why Our Code Smells
bkeepers
PRO
339
57k
Transcript
RUSTで始める 自作組込みOS @garasubo
自己紹介 • Twitter: @garasubo • 大学院時代:Cortex-A向けの自作ハイパーバイザ開発 • 現在:某企業でWebサービス開発 • 趣味でRustを使ってCortex-M向けの自作OSを開発中
• 会社の業務とは一切関係ない • 組込み業界のことはよく知りません
RUSTで自作OS • Rustはメモリ管理を直接できるC言語に代わる選択肢 • 各種モダンな言語機能と周辺ツール群 • 公式からのサポートが充実しつつある
先行事例 • Redox • 実ハードウェアでも動くデスクトップOS • マイクロカーネルベース • Rustのコンパイラそのものに変更を加えている •
Tock • RustのnightlyコンパイラでビルドできるCortex-M向けOS • 各プロセス間の安全性を重視 • SOSP’17などで成果が発表されている • Rust Embedded Working Group • Rust公式のワーキンググループ • デバイスドライバなど各種クレートとドキュメントの整備
自分がつくっているもの(ErkOS) • Cortex-MをターゲットとしたOS • 最低限のOSっぽい機能 • プロセスの立ち上げ・ラウンドロビンスケジューリング • 割り込み管理 •
SVCによるOS機能の呼び出し • 外部クレートはあんまり使わない(後述)
実装概要 • レポジトリはこちら • カーネルの持つオブジェクトは全部スタック領域におく • ライフタイムパラメータにより安全にスタックにおける • ヒープ領域はFuture Work
• 割り込み処理はカーネル内のメインループで大部分を処理 • 割り込みハンドラとカーネルプロセスでの変数共有を避ける • 割り込みの優先度や使う割り込みが増えた時の応答性は懸念事項 • QEMUとNucleo-F4291ZIでデモアプリの動作確認
RUSTでよかったこと~ライフタイム • C言語ではライフタイムの概念がない→寿命の切れたポインタ参照の危険性 • 例:https://wandbox.org/permlink/g5wg0V9BJUe1aePd • 関数内ローカル変数へのポインタを呼び出し元で使おうとしている • 警告は出るがコンパイルできてしまい、実行時に落ちる •
Rustならそのようなことはない • 例:https://play.rust- lang.org/?version=stable&mode=debug&edition=2018&gist=6dbc58dd26cfd4 476496b924ef6c0ab9 • 関数内ローカル変数のライフタイムは呼び出し元では終わっているのでコンパイルで きない • staticなどライフタイムを適切に延長する必要がある
RUSTでよかったこと~テスト • テストフレームワークがcargoに組み込まれている • ハードウェアに依存しているとテストフレームワークは動かない • qemuなどハードウェアシミュレータを使えば動く部分もある(nightlyのみ) • 依存関係を切って独立したモジュールをつくるほうがよい
RUSTでつらかったこと~データ構造の実装 • Rustで書かれたコードは(unsafeを使わない限り)メモリ安全だが、メモリ安全 なコードが常にRustで書けるとは限らない • 例: LinkedList • 先頭要素と末尾要素のミュータブルな参照(ポインタ)を持っておきたい •
1つの要素に対してミュータブルな参照は1つしか持てない • そのまま実装しようとすると末尾要素へのミュータブル参照が2つできて実装不能 • 解決策 • 生ポインタ(unsafe) • RefCell(実行時エラーの可能性) • (コンパイラを修正する)
RUSTでつらかったこと~クレート不足 • Rust Embeddedグループのクレートは微妙に使いにくい • 例)svd2rust • デバイスへのインターフェースが実行時にシングルトン化されたものが提供される • 割り込みハンドラ内でインターフェースを使おうとすると、めんどうくさいことに
• main関数内で、どうにか割り込みハンドラに渡さないといけない • グローバル変数での共有はunsafeを伴う • 実行時に変数を初期化するのでOptionでラップする必要性 • 専用フレームワーク(cortex-m-rtfm)やある程度開発が進むとこちらのほうが安全(?) • まだまだノウハウが蓄積され切れていない印象
自作OSをRUSTで開発すべきか メリットは大きいが、発展途上の分野なのでリスクも大きい • nightlyコンパイラでないと使えない機能が多い • IDEサポートもまだまだ • Rustの学習コストの高さ • 参考:https://github.com/rust-embedded/wg/issues/336