liumOS 2020年の進化を振り返る

この記事は自作OS Advent Calendar 2020の「最初の4つの素数の和」日目の記事として作成されました。

liumOSについて

liumOSは、NVDIMM(Non-volatile DIMM, 不揮発性メインメモリ)をネイティブにサポートしている、珍しいタイプの自作OSです。2018年7月26日に開発を開始して以来、記事執筆時点で682 commitsを数えるほどに成長しました。主要開発者はhikaliumですが、後述する通り、ここ数ヶ月間はd0iasmさんにも手伝っていただいていました。

2018年には、自作OSからNVDIMMを触る方法について自作OS Advent Calendar 2018の記事で紹介しましたので、NVDIMMについて知らないよという方や、興味のある方はそちらもぜひお読みください。

hikalium.hatenablog.jp

今年は、かなり色々なものをliumOS上に実装して遊んでいたので、この記事ではそのうちのいくつかについて紹介してみたいと思います。

Adlibを利用したMIDI再生機能

これはOSの中核的な機能ではありませんが、デバイスドライバの実装の一環として、Adlibという非常に古いサウンドバイスのドライバを書いて、さらにMIDIファイルのパーサを書いて再生できるようにしました。実は中学生の頃に開発していた自作OSでもMIDIファイルの再生を試みていたことはあるのですが、当時はビープ音で無理やりなんとか和音を出そうとして結局失敗した記憶があり、その当時のMIDIパーサを再利用してN年越しの目標を達成したのでした。

デモ動画はこちらです。(音が鳴るので注意。)


liumOS Adlib MIDI再生デモ

virtio-netドライバの追加とICMP, DHCPへの対応

前菜を楽しんでいただけたところで、メインディッシュですが、なんとliumOSにネットワーク通信機能を追加しました。

たとえば、pingに応答するデモはこちらです。


liumOS pingデモ

冒頭でさらっと流されていますが、なんとDHCPIPアドレスその他が自動的に割り当てられている点にも注目です!

f:id:hikalium:20201217022248p:plain
ipコマンドで割り当てられたIPアドレスを確認している図

NICドライバとしては、仮想入出力デバイスvirtioのうちのひとつである、virtio-netを実装しています。また、GPD Micro PCで採用されているRTL8168というRealtek社製のNICについても現在ドライバの実装を進めているところです。

UDP通信への対応、ソケットシステムコールの部分的実装、簡単なブラウザアプリの実装

さて、pingができるなら、もうなんでもできますね!だって、パケットを送受信するだけですから。(本当に?)

ということで、UDPプロトコルと、ソケット関連システムコールをいくつか実装し、d0iasmさんによって書かれた簡易ブラウザアプリケーションが動くように環境を整備しました。

たとえば、このようにliumOS内のクライアントから、Linux上で動くサーバーにリクエストを投げればHTMLが返ってきますし、

f:id:hikalium:20201217025756p:plain
liumOS内からHTTPのやりとりをしている図

これをパースしてMarkdownに整形するという簡易ブラウザまで動いてしまいます!

f:id:hikalium:20201217025918p:plain
同じHTTPのやりとりだが、出力をパースしてMarkdownに整形して出力している簡易ブラウザの図

どうですか?自作OSでも、これくらいなら少し頑張ればできるんです!

Web+DB Press Vol.120の特集「自作OS×自作ブラウザで学ぶ Webページが表示されるまで」をd0iasmさんと執筆した

さて、このようなことをしていましたら、ありがたいことに技術評論社Web+DB Press編集部よりお声がけをいただき、自作OSと自作ブラウザを通して、Webページが表示されるまでの流れを、文字通り上から下まで一通り追ってゆく記事を執筆させていただく機会を得ました。

gihyo.jp

Webページが表示されるまでに、HTTPのリクエストがどのようにしてパケットにまで落とし込まれて、レスポンスとしてのHTMLがどのようなパスを通って運ばれてゆき、最終的に目に見える形になるのか、ということを解説した、合計36ページの特集となっておりますので、面白そう!と思っていただけたなら、ぜひ書店で内容を確認したり、購入して読んでいただけたりしたら大変嬉しく思います。12/24発売です!

この特集の概要の紹介や、デモを交えた動画を近日中にアップロードする予定ですので、そちらもお楽しみに!

www.youtube.com

今後の展望など

やりたいことは無限にあって永遠に楽しめるのが自作OSのよいところですが、ある程度目標を立てておいたほうが物事を進めやすいのは確かです。ということで、いくつかここで私がやりたいと思っていることを書き連ねておくことにします。

GUIサポートを向上させる

現在のところ、liumOSにはほとんどGUIと呼べるものがありません。画面描画を行うAPIはアプリケーションに対して提供されていませんし、入力インターフェイスについても、ほんの少し前にPS/2マウスのサポートがやっと入ったほどです。そのため、先ほど紹介した特集でも、CUIブラウザを実装するのがやっとの状態でした。

せっかくブラウザの下回りができたなら、CSSで文字を大きく表示したり色を変えたり、なんなら文字列を<blink>させたいですよね?(とはいえblinkタグはすでに廃止されていますが…。)

ということで、ある程度の描画がアプリケーション側からできるような仕組みを近いうちに用意し、ついでにブラウザの実装も拡張したいなあと思っています。

RustでOS本体を書き直す

現在のliumOSはC++で書かれています。C++が使えるだけでもC言語に比べれば大きな進歩だったのですが、やはりメモリ安全性という面ではC言語と五十歩百歩と言わざるを得ません。最近応用が広がってきたRustであれば、より安全にプログラムを書くことができます。ということで、Rustでカーネルを書き直すことを現在検討しています。すでに、Rustで書かれたカーネルを従来のliumOSローダーが起動できるところまでは確認しているため、あとは実装するだけという状況なのですが、うまいことインクリメンタルにできないものか、考えつつ現在進めているところです。(まあ、いつか気分が乗った時にえいやっと書き換えることになりそうな気がしますが…。)

ネットワーク機能の拡張

現在のliumOSのネットワークまわりはかなりアドホックに実装されており、複数のNICをうまく扱えない、ソケットの実装がはりぼてすぎる、たまにドライバがこけるなどの問題が発生しています。特に、ドライバを書くというのは自作OSにとって頭の痛い問題ですが、私としてはネットワークドライバほど実装しておいしいものは他にないのではないかと考えています。というのも、基本的な機能としては「パケットを送信する」「パケットを受信する」の2つしかありませんし、ネットワークの先になにがあるかを私たちは意識する必要がないからです。たとえば、自作OSでファイルを保存できるところまで到達しているケースはかなり少ない(liumOSはNVDIMMに対応しているのでなんでも保存できる!…と言い張ることができるかもしれない)ですが、ネットワーク通信さえ対応してしまえば、保存すべきファイルをネットワーク越しに送信するようにすることで、自作OS側でドライバを書かなくて済む可能性が出てきます。(もちろん、各種プロトコルを実装する必要がありますが…。)あと、自作OS同士が独自のプロトコルで通信するのをみてみたい、という気持ちもかなりあります。ということで、おそらくネットワーク周りの機能はそれなりに重点的に進めていくことになるような気がしています。

おわりに

そういうわけで、今年もいろいろな機能がliumOSには生えましたし、今後も生やしていくつもりではいるのですが、ここで大事なことをひとつ。

自分が楽しいと思えることをやっていきましょう!最初から完璧なものを作る必要はありません。なにせ、一番のユーザーは自分自身なのですから。

自分以外のユーザーが出てきたら、そのときはそのときでまた考えましょう!(なおliumOSにはついにアプリ開発者(@d0iasm)が登場したので、大急ぎでテストを書いたりドキュメントの修正をしたりしていました。もちろんこれも楽しいからやってるんですけどね!)

ということで、このご時世で家にいる時間も多くなってきていると思いますので、皆様ぜひ暖かい部屋でゆっくりしながら、のんびりとした自作OSライフをお楽しみください!ではでは!