自作OSの将来とは?自作OSのススメ 〜自作OSのいまと昔 [第5回]
これまで、第1回・第2回では、自作OSとは何かという基本的なところから、現代における自作OSの難しい点について解説しました。また第3回・第4回では、自作OSをする上で欠かせないオープンソースの開発ツールへの、バグ修正を通した貢献について触れました。
最終回となる今回は、連載名にもなっている、自作OSの「いまと昔」から一足進んで、これから自作OSをはじめてみようと考えている皆様にむけて、どのように自作OSを楽しめばよいのか、という将来へ向けた話をしてみたいと思います。
自作OSは役に立つ?
第1回でも触れた通り、自作OSの楽しみ方は人それぞれです。知的好奇心を満たしてくれる積木として、ハードウエアを極限まで使い倒すための道具として、日々成長させるのが楽しみな盆栽として、等々、どのような目的であっても、開発している本人が楽しければ、それは立派な自作OSといえます。
それでも、ふと、こんな気持ちが頭をよぎることがあります。
「一体私はこんなものを作って何をしたかったんだろうか?」
「既存のOSのサブセットに、なんの意味があるというのだろうか……」
自作OSをすることそれ自体が楽しいと思っている私でさえ、そう考えることがあります。
もちろん、車輪の再発明は悪いことではありません。むしろ、車輪の作り方を知らない人が大多数のなかで、車輪の作り方を知っているというのは、それだけで十分な価値があります。
ですが、現代のOSというのは、とてつもなく巨大で、そして幅広いコンポーネントから構成されています。Linuxが誕生した頃ならいざ知らず、現代において、既存のOSにもあるような機能を自作OSに実装していくだけでは、一生かかっても既存のOSのサブセットから抜け出せなさそうです。
そう考えると、自作OSをはじめたところで、自分の勉強や知的好奇心を満たす役には立ったとしても、何か他の方面には全く役立たないのではないのでは?と思われる方も多くいらっしゃるかもしれません。
しかし、そんなことはありません! その証拠として、私の自作OSが、私の大学での研究に役立った例を紹介しましょう。
実験場としての自作OS
私は大学で、Non-volatile DIMM(NVDIMM, 不揮発性メインメモリ)を使った研究をしていました。
通常のコンピューターはメインメモリにDRAMを使っていますが、DRAMの内容は電源が切れると消えてしまいます(パソコンの電源コードに何かひっかけて、データを失ったことのある人も多くいらっしゃるでしょう)。しかし、NVDIMMは、なんと電源が切れてもデータが消えないのです! ということで、これを使って何か面白いことができないかなと考えました。
たとえば、アプリケーションをNVDIMMの上で実行したら、突然電源が落ちてもデータが消えずに済むかもしれません。しかし、このアイディアを既存のOSで試すのは、少し大変です。
というのも、メモリ管理はOSの中核的な機能ですから、変更を加えるとOSのありとあらゆる部分に影響が及びますし、しかも既存のDRAM用に徹底的に最適化されているため、「とりあえずこのアプリの確保するメモリは全部NVDIMMに乗っけといて」みたいな、言葉で書けば簡単に見えることも、既存のOSで実現するにはどこから手をつけてよいかわからない状況でした。そもそも実現できるかはっきりしていないアイディアを、複雑な既存OSの上で試みるのは、あまりにも時間的リスクが高かったのです。
そこで私は、自作OSの上で、そのアイディアを実現してみることにしました。自分でつくったOSならば、隅々まで動きがわかっていますし、Linuxなどの既存OSよりかは数十倍単純な実装ですから、改造も容易でした。
実際にやってみたところ、そのアイディアが上手くいくことがわかり、さらに既存OSだったらどの部分を改造する必要がありそうかという目処もその実験を通じて得られたので、最終的にはLinuxカーネル上にその機能を実装して評価を行うことができました。
このように、通常だったら欠点といわれてしまう、自作OSの単純さや、機能の少なさが、新しいアイディアを試す実験場としては功を奏したのです。
千里の道も一歩から……「自作OS」のはじめかた
さて、先ほど紹介した例は、研究から生まれた新しいアイディアを自作OSに実装してみた結果、それが役にたった!というケースでした。
このような場合は稀だとしても、皆さんがせっかく自作OSを作るなら、ただの既存OSのサブセットではなくて、誰もまだ作っていない、新しいものをつくってみたいと思うかもしれません。
しかし、そうは言っても
「新規性なんて私にはつくれません!」
「そういうのは自分には無理だ……」
という声が聞こえてきそうです。確かに、新しいものを作るのは簡単ではないので、その気持ちはよくわかります……。
ですが、いきなり「完全に新しくてすごい何か」を作ることはできなくても、既存の何かをちょっとだけ変えた「オリジナルバージョン」なら、そこまで難しくはありません。たとえば、この画面を見てください。
これはみなさんご存知の、はりぼてOS……を少し改造した、私の当初の「自作OS」の画面です。よくみると、ウィンドウの右上の閉じるボタンが赤色になっていたり、追加のコマンドやアプリが追加されていることに気づくかもしれません。
この程度の変更では、OSとしては何も変わっていないじゃないか!と思われるかもしれません。しかし、最初はこれでよいのです。
表示される文字や色、大きさなどを変えて遊んでいるうちに、やがてもっと「こうしたい」「ここを変えたい」というイメージが湧いてきます。
同時に、ちょっと変えた程度のはずなのにうまく動かなくなったり、表示が崩れたりするので、その原因を追求したり、他にどこを直す必要があるのかを調べるうちに、段々と新しいものをつくる力がついてきます。
慣れてきたら、次は同じものを、自分のやり方でゼロから作ってみよう
ちょっとした変更をすることに慣れてきたら、次はもっと大きな変更をやっていこう…という流れにいってもよいのですが、私の場合はそれよりも、ちょっと違う自分なりのやり方で、同じものを最初から作ってみる、ということをしていました。
たとえば、はりぼてOSのソースコードを「写経」する際も、ただ写すのではなくて、元々hariboteとなっていたファイル名などを自分のOSの名前(当時はCHNOSという名前でした)にしてみたり、アセンブリのニーモニックが大文字で書かれていたのを小文字で書いてみたり……。
こうすることで、表面的には違っても、どこまでは同じ動きをして、どこからは違う動きになってしまうのか、という全体像をつかむことができます。そして私の場合は、この自作OSがプログラミングへの入門も兼ねていたので、C言語のルールや、Makefileの書き方など、周辺のツールへの理解を深める助けにもなりました。
そうやって試行錯誤を積むうちに、こんな感じでウィンドウシステムを改造したり、タスク管理やメモリ管理を大幅に変更してみたり、
16bitモードでしか動かないBIOSを、CPUの仮想86モードを使って32bitモードから呼び出して画面サイズの変更をできるようにしてみたり、
様々な色モード間での相互変換をウィンドウマネージャに実装したり、PCIデバイスの制御に挑戦してみたり……
時が経つにつれて、やりたいことが増えるのと同時に、実現できることもどんどん増えてゆきました。
ちなみに、最初の「はりぼてOSもどき」から最後の画面に至るまでは、3年以上の月日がかかっています。ですから、焦る必要はまったくありません。ゆっくりやっていけばよいのです。
気づけばいつの間にかソースコードが……遊び場になっている!?
このように、少しずつソースコードをこねていると、自分でも気づかないうちに、動いているものを変更することへの抵抗感というのが薄まってきます。
最初は本に書いてある内容を一字一句間違えずに打ち込まなきゃいけない、間違えると動かない、だから動いているものを変えるのはこわい……そんな感じの「居心地の悪さ」が入門者にはつきものです。ですが、ここまでの流れでそこから脱出することができれば、目の前にあるソースコードは、自分の自由にできる、まさに遊び場になっているはずです。
そのような安心感を得ることが、新しいものを作り上げるための最初の一歩だと私は思います。
自作OS以外の道で低レイヤの知識を活かす
また、自作OSを介して得られた低レイヤの知識は、自作OS以外の低レイヤソフトウェアの開発にも役立ちます。
たとえば、仮想マシン(VM)や、エミュレータの開発などがその一例です。OSは、システムコールというインターフェイスのレベルで、アプリケーションに対する抽象化を提供しますが、VMやエミュレータは、アプリケーションの命令レベル・バイナリレベルでの抽象化を提供します。
これらは抽象化の層からみると全く異なるものですが、要求される知識としてはかなり近いため、興味があれば手を出してみるのもおすすめです。
実際に、OSASKの作者である川合秀実氏も、エミュレータOSというアイディアを発展させて、OSECPU-VMという仮想マシンを開発していたことがあり、私もその一部に関わっていました。
また、私の初期の自作OSでは、16bitモードでしか動作しないBIOSのコードを32bitモードから呼び出すことを目的として、x86の仮想マシンを自作OS上に実装することを試みたこともありました。(結局は、仮想86モードというCPUの機能を使ったほうがより容易であると気づいて、そちらを使うことにしてしまったので完成はしませんでしたが……)
他の例としては、言語処理系の自作も、低レイヤの知識が役立つよい例です。この場合は、プログラミング言語やシステムコール、ABIといった層が抽象化の境界となります。言語処理系の場合は、低レイヤの概念だけではなく、プログラミング言語そのものの理論(形式言語理論や型理論)といった高レイヤにも触れることができるため、さらに楽しめるかもしれません。
このように、自作OSを通して得た知識は、OSの自作以外にも、様々な「自作」への扉を開いてくれます。面白いと思いませんか?
自作OS開発を支援するコミュニティ osdev-jp
ここまで、自作OSのこれまでの歴史と、現代における自作OSの課題、そしてこれから自作OSをはじめる方へ向けた、自作OSの楽しみ方について触れてきました。自作OSをすでに始めている皆様にも、そうでない皆様にも、低レイヤソフトウェアに触れる楽しみを感じていただけたなら幸いです。
最後になりますが、第1回でも少しだけ触れた、自作OS開発を支援するコミュニティ osdev-jpの紹介をさせていただきたいと思います。
ここまでの記事を読んでいただいた皆様は既にお気づきかと思うのですが、ここ数年で自作OSに関する情報というのは陳腐化してきているのが現状です。その背景には、コンピューターシステムの進化もありますし、ある程度OSというものが「枯れて」きたことによって、新しくゼロからOSを作るという試みが少なくなっていることも要因としてあると考えられます。また、日本の自作OSコミュニティも、ある程度活発に活動していたものが過去にはありましたが、今はそのほとんどが消滅してしまっているのが現状です。
そのような現状を変えるべく、OS自作を趣味としているuchan, liva, hikalium(筆者)の3人で、自作OS開発を支援するコミュニティosdev-jpを2016年に結成しました。主な活動としては、隔月で「自作OSもくもく会」と呼ばれるイベントを開催していますが、それと同時にSlackやメーリングリストを介して、自作OSに関する情報共有や質問をできる場も提供しています。
日本語で自作OSに関しての深い話ができる場所は他にないと思いますので、もし自作OSを初めてみたけれど、分からないところがあるので質問をしたい!という方や、私のつくった自作OSを自慢したい!という方がいらっしゃったら、ぜひ参加方法のページを確認してみてください。
それでは皆様、よい自作OS生活を!
関連リンク
- GitHub: hikalium/liumos
- 「実験場としての自作OS」として利用した自作OS
- 実際の動作している様子はYouTubeより確認できます。
- NDCKPT: 不揮発性メインメモリを用いたOSによる 透過的なプロセスチェックポインティングの実現
- 「実験場としての自作OS」のところで行った評価を筆者がまとめた研究報告
- GitHub: chnos
- 筆者が初期に開発していた自作OSのソースコード
- GitHub: hikalium/webcpu-vm
- 「自作OS以外の道」で紹介した、OSECPU-VMのJavaScript実装
- GitHub: hikalium/compilium
- 本文中では触れませんでしたが、筆者によるCコンパイラのサブセット実装(自作OS以外の低レイヤソフトウェア開発の例として)