はじめに

この本は組込みシステムやOSのような低レイヤーシステムの開発経験がないプログラマーのような人が、自作OSをはじめるため解説本です。 著者自身、本職はウェブプログラマーですが、趣味で組込みOSの自作をしています。この本はそのノウハウ集のようなものです。 このような低レイヤーシステムはC言語で開発されることが多いのですが、今回はRustを使います。 RustはC言語と比較して、様々なモダンな機能やツール郡を取り揃えている上に、C言語の長所である直接のメモリ制御ができ、パフォーマンスも高いとして組込みシステム開発でつかえるとして注目されています。 Rustそのもの解説は控えめですが、低レイヤーシステム開発特有のテクニックは必要に応じて解説します。

想定読者

ある程度はプログラミング経験があることを前提としています。 また、レジスタやメモリなどコンピュータアーキテクチャに関する基礎用語の説明もちゃんとはしていないので、このあたりの大まかな理解もあるといいでしょう (不安があればヘネシー&パターソン「コンピュータの構成と設計」などに代表されるコンピュータアーキテクチャの教科書を併用するとよいかもしれません)。 Rustに関してですが、基本的な文法事項などは説明しませんが、一通りの文法になんとなく触れている程度の経験があれば十分です。

他の知識・経験、特に組込み開発に関する知識については必要ありません。初歩のマニュアルの読み方・各種ツールの使い方を解説します。

自作組込みOSとは

オペレーティングシステム(OS)とはそもそもなんでしょうか。これは自作OSをつくるさいに誰もがぶつかる疑問でしょう。 OSの教科書として有名なModern Operating Systemの第四版を見てみましょう。

It is hard to pin down what an operating system is other than saying it is the software that runs in kernel mode--and even that is not true.

カーネルモードという通常よりも権限の強いCPUのモードで動くソフトウェアとくらいしか定義しようがない、そのうえそれすらも正しくないものかもしれない。と言っています。 その原因のひとつとして、OSには本質的には関係のない2つの機能を持っているからと書かれています。 その2つの機能とは、プログラマーのためにきれいなインターフェースを提供するというものと、ハードウェアのリソースを管理するというものです。

順番に見ていきましょう。まず、インターフェースとしての機能です。CPUや付属するデバイスをそのままの形で直接叩くというのは非常に複雑で難しいです。 例えば、みなさんはプログラミングの一番始めの一歩として「Hello World」などの文字列を出力したと思うのですが、そのとき、「画面に文字を出力する機能」というのは直接実装することはなかったのではないでしょうか? この「画面に文字を出力する機能」というものを提供しているのはOSです(厳密にはそのOSの機能を利用する言語の標準ライブラリを使うことが多いでしょう)。 このOSがこのような機能を提供してくれるので、例えばモニターを別のメーカーのものや違う規格の接続方法のものに付け替えたとしても、それらの違いというのはOSが吸収してくれる、というわけです。

次に、このようなCPUやデバイスなどを管理するというリソースマネージャーとしての機能です。 パソコンで作業しているときに、作業のためのエディタを立ち上げつつ、BGMを流すための音楽プレーヤーソフトを同じパソコンで立ち上げる、といった複数のアプリケーションを同時に立ち上げるということをすることは多いと思います。 しかし、実際に使えるCPUは限られていて、近年はマルチコアが当たり前になっていますが、その個数を超えてアプリケーションを実行するということも珍しくないと思います。 これを実現しているのがOSのリソースマネージャーとしての機能です。それぞれのアプリケーションに対してCPUをどの程度使っていいかを制限し、CPUで動くアプリケーションを素早く切り替えることによってあたかも複数のアプリケーションが同時に何個も動いているように見せているというわけです。

筆者はこの2つの機能のうち少なくとも片方を満たす、というのが定義にはならなくてもOSとしての必要条件になってくるのではと考えています。

本書でつくる組込みOS

OSと言われて、多くの人はWindowsやmacOS、Linuxなどの各種デスクトップPC向けのOSや、AndroidやiOSのようなスマートフォン向けのOSを思い浮かべると思います。 しかし、実際には様々な家電製品やセンサーノードなどの小さな電子機器にも組込みOSと言われるOSが入っていることが多くあります。他のWindowsなどのOSは汎用OSと言われます。 組込みOSは小型な機器にも使えるように汎用OSとは異なる設計になっていて以下のような傾向があります。

  • 使える機能が汎用OSに比べると少ない
  • リアルタイム性、つまり一定周期毎、あるいは特定のイベントに対して遅れることなくタスクを実行することが重視される
  • メモリやCPU性能を多くは使わない

もっとも汎用OSと組込みOSの厳密な区別はなく、最近は強力な組込み機器向けのCPUも多く存在するため、Linuxが組込み機器に使われるケースもあります。 そのため、必ずしも上記のような性質が常に当てはまるわけではなく、汎用OSと大差がないという場合もあります。

今回、自作しようとしている組込みOSはArmのCortex-MというCPUを対象としたものです。 Armはスマートフォンやゲーム機にも使われていますが、こちらはCortex-AというCPUがメインです。 Cortex-MはAよりも低価格・省電力なのが特徴です。その分、性能面や使えるメモリが少ないです。 どういうところに使われるかというと、ネットワークにつながるセンサーやモーターなどの制御です。

今回作ろうとするOSは例えば画面の上にきれいな画像を出すとかマウスやキーボードの操作を受け付ける、というものではありません。 CPUそのものがそういう用途ではないからです。

最終的につくるのは、簡単なスケジューラと割り込み制御を備えた非常に簡易なOSです。 先程上げたOSとしての2つの機能のうち、後者の側面がつよいものになっています。 そのため、完成形は少し物足りないものになっているかもしれません。 しかしながら、自作OSでは最初の一歩が非常にハードルが高いと思うので、その最初の一歩を助けるという意識で書きました。

フィードバック

本書はこちらのGithubレポジトリで更新しています。 もし、何か誤字脱字や誤りがあった場合は、このレポジトリのissueとして報告していただけると助かります。 それ以外にももっとここを説明してほしいといった要望でも構いません。

その他、筆者のTwitterでも各種フィードバックを受け付けています。

また、本書を一通り終えたあとに出来上がると期待されるコードは以下からダウンロードできます。

https://github.com/garasubo/bookos