Rustでの低レイヤープログラミング 2021
この記事は自作OS Advent Calendar 2021及びRust Advent Calendar 2021の記事として書かれています。
以前、Rustで組込みプログラミングや自作OS作成するにはという記事でも同じようなネタをやったのですが、この分野の進展は今年もいろいろあったので、自分の自作OSの進捗などもあわせて紹介したいと思います。
注目の資料・プロジェクト
Rustを使った自作OS系の参考となる資料や実際に採用しているプロジェクトで以前の記事で紹介できていなかったものを中心に紹介します。
Rust for Linux
Linux全体をRustで書き直すのではなく、第二言語としてデバイスドライバなどの一部のコンポーネントにのみRustを使えるようにというプロジェクトが進行中です。
これに関する話題をツイートするとかなりリアクションがつくことから、この手の話の中では最も熱い話題なのではないでしょうか。
開発者であるLinus氏や他のメンテナも多くの課題を指摘はしているものの、否定的ではないようです。
現在はMiguel Ojeda氏が中心にGithub上のフォークレポジトリ上で作業が進んでおり、当初指摘されていた課題も着実に解決されつつあります。
最近になってパッチの第二弾がメーリングリストに投稿されて、様々なアップデートが報告されています。
具体的には
- betaコンパイラを利用していたのがstableコンパイラでビルド可能になった
-
core
やalloc
ライブラリをカスタマイズ可能にして、Rust本体にも変更を取り入れてもらった - Arm、Google、Microsoft社に加えてRed Hadも注目しはじめた
などといった内容で、かなり順調な印象を受けます。
ReadLeaf・Theseus
OSDI 2020で発表された論文でRustを用いたOS実装に関する論文が2本出て、その中で実装されたOSがReadLeaf(rv6)とTheseusです。
Theseusの方は以前のブログでも触れました。
どちらの研究でも従来とは異なるアプローチでRustの言語特性を活かすことでOSの安全性を確保しています。
knurling-rs
Rustでの組込みシステム開発のためのツール郡です。
Ferrous SystemsというRustの教育やコンサルタントを行う会社が提供しています。
公式のドキュメントもいろいろありますが、去年のアドベントカレンダーにあった記事も参考になるかと思います。
TOPPERSプロジェクト
ITORN仕様の組込みOSをオープンソースとして提供するプロジェクトであるTOPPERSプロジェクトでもRustが注目され始めているようです。
ITRONというとTwitterなどではオワコンというイメージを持っている方の意見が多いようですが、依然として日本企業では使われる場面が多いようです。
京都マイクロコンピュータが提供するTOPPERSベースのシステムであるSOLIDが、タスクやハンドラがRustで記述できるように対応しRustのTier 3ターゲットしても追加されています。
また、こちらのQiita記事でもRustを使いTOPPERSプログラミングをする方法が紹介されています。
TOPPERSに限らず、既存の組込みOS上でのRustプログラミングが他にもかなりあります
基礎から学ぶ 組込みRust
組込みRustに関する商業本が出版されました。
こちらはRust Embeddedグループが主に提供しているパッケージを利用して、Wio TerminalというモジュールでのRust組込み開発を紹介する本です。
Rustの文法の基礎も紹介されており、Rust初心者でも取り掛かりやすい本なのではないでしょうか。
OS・低レイヤー部位をRustで実装するべきか
この手の話をすると必ず議論になるのが、RustはOS実装に適した言語か・既存のC言語で書かれたものをRustに書き直すべきか、という議論です。
Rustはプログラマに対してライフタイムや所有権に関する様々な制約を課すため、OSなどの低レイヤーロジックを記述する際、その利点が十分に発揮されないどころか実装の妨げになるような場面も少なくありません。
それぞれプロジェクト毎にアプローチも異なります。Rust for Linuxではあくまで第二言語としてRustを導入するだけであり、全てをRustで書き直すものではありません。
Linuxのコアな機能に対してRustでのラッパーを実装して、デバイスドライバなどの一部のモジュールでのみの使用となっています。
Toppersプロジェクトや他の既存の組込みOSで用いられる方法も、全体を書き直すというものもなくはないですが、
基本的にはOS上のアプリケーションでの活用が主です。
一方で、TheseusやReadLeafはフルスクラッチでRustでコアな機能も含めて実装されています。
しかしながら、その実装方法は従来のOSとは異なる手法を用いています。
従来のOS設計での安全性に関する課題を、Rustの言語特性を活かすことで解決しようとしているからです。
そうなってくると、Rustでコアな機能を含めて実装するならば、OSのそもそもの設計から見直さないとRustの持つよさがフルで発揮できない、とも考えることができるかもしれません。
結局のところ、Rustで低レイヤー部位を開発すべきかは、もちろん多くのメリットもある一方で、開発コストもそれなりに大きくなってしまうことも多いので、
そのプロジェクトで何を解決したいのかによって、適用する範囲を慎重に見定めるのがよいのではないでしょうか。
また、Rust for LinuxのプロジェクトではRust言語そのものにもコントリビューションしています。
Rust言語そのものも低レイヤー部分の機能に改善の余地があり、そのような部分も留意する必要があるかもしれません。
自分の進捗
今年は自分は技術書展にて「Rustで始める自作組込みOS入門」という同人誌を販売しました。
こちらは去年公開したドキュメントとほぼ同内容ですが、対象ハードウェアをWio Terminalに変更しました。
今でもたまに電子版を買ってくださる方がいる程度には反響もよかったようで、大変ありがたい限りです。
一方で恥ずかしいことに、誤植や技術的に誤っている説明も何箇所かあとから見つかってしまい、随時修正版をアップロードしていますが、その部分は大変申し訳なく思っています。
このような同人誌を販売するのは初めての経験で、出版のための整形やツールの使い方には非常に苦労しました。
普段からこのような同人誌をいろいろと販売されている方は頑張っているのだな、と思い知らされました。
実はこの本は現在商業本として販売する計画があり、現在それに向けて内容を加筆・修正中です。
Rustのアップデートに追随したり、新しいトピックについて解説する予定なので、販売までたどり着けましたらぜひよろしくお願いします。
自分の自作OSの進捗はというと、
- イーサネットドライバの送受信部分を実装し、smoltcpライブラリを組み込むことでARPパケットを飛ばせることを確認
- alloc用のアロケータを実装した
- Wio Terminalに対応した
などがあります。あまり大きな変更を加えることが出来ず細々としたものになってしまった、という印象です。
どうしても商業本用のアップデートの方にリソースが取られてしまうことや、そもそもこの先どう開発を進めていくとおもしろいだろうかと思案している、などが理由ではあります。
来年はもうちょっと大きめな変更を加えて、おもしろい自作OS上でおもしろいアプリケーションを組めたらなと思います。
というわけで、来年もRustで自作OSという話題を積極的に擦っていきたいと思います。よろしくお願いします。
Discussion