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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
garasubo
June 17, 2019
Technology
3.6k
1
Share
Rustで始める自作組込みOS
https://inteface-meet-up.connpass.com/event/126924/
で発表した内容
garasubo
June 17, 2019
More Decks by garasubo
See All by garasubo
Cancel Safetyとスレッドリーク
garasubo
1
720
RustでISUCONに勝つには
garasubo
1
790
Rustでの自作OSをやってきて
garasubo
0
1.2k
Armの仮想化支援機構を用いてハイパーバイザーを自作する
garasubo
3
7.7k
RustからX Window Systemを触る
garasubo
0
690
クラウド向けOS(?)Unikernelとは何か
garasubo
0
1.8k
論文紹介:KVM/ARM: The Design and Implementation of the Linux ARM Hypervisor
garasubo
0
670
Other Decks in Technology
See All in Technology
【2026年版】プロジェクトマネジメント実践論|現役エンジニアが語る!~チームでモノづくりをする時のコツとは?~
mixi_engineers
PRO
1
120
DI コンテナ自動生成ツールを実装してみた / intro-autodi
uhzz
0
710
いつの間にかデータエンジニア以外の業務も増えていたけど、意外と経験が役に立ってる
zozotech
PRO
0
730
ルール・ロール・ツールを創る / Creating Rules, Roles and Tools
ks91
PRO
0
130
20260515 ⾃分のアカウントとプライバシーを守る認証と認可の話〜利⽤者向け〜
oidfj
0
820
"うちにはまだ早い"は本当? ─ 小さく始めるPlatform Engineering入門
harukasakihara
7
650
M&Aで増え続けるプロダクトに少数QAはどう立ち向かうか─GENDAが挑む、全員で取り組む品質標準化戦略 / GENDA Tech Talk #4
genda
0
260
アプリブロック機能のつくりかたと、AIとHTMLの不合理な相性の良さについて
kumamotone
1
260
最新技術を"今は選ばない"という技術選定
leveragestech
PRO
0
330
LookerとADKで作る社内AIエージェント
chanyou0311
0
280
Cortex(Code) を ML モデルの 精度改善サイクルに組み込む.pdf
oimo23
0
250
AWS WAFの運用を地道に改善し、自社で運用可能にするプラクティス
andpad
1
620
Featured
See All Featured
Rebuilding a faster, lazier Slack
samanthasiow
85
9.5k
How GitHub (no longer) Works
holman
316
150k
ラッコキーワード サービス紹介資料
rakko
1
3.3M
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
0
1.4k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.2k
The untapped power of vector embeddings
frankvandijk
2
1.7k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
120
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
350
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
110k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
1
540
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.9k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
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