自作OS系個人サークル「へにゃぺんて」で作ったものと、そのとき考えていたこと (後編)

前編のあらまし

大神祐真と申します。「へにゃぺんて」という個人サークルで「自作OS」を軸に趣味で独自な創作を行い、それを同人誌・同人作品という形で発表を続けています。今回はへにゃぺんてのこれまでの主な活動をまとめましたので、お楽しみいただければ幸いです。

前編の記事では、活動の初期に創作したものをご紹介しました。

  • 自作OS「OS5」
  • 自作OS(っぽいもの)「poiOS」とブートローダー「poiboot」
  • 自作OS「ゆあOS」
  • 遺伝的MBR

前編の最後にも記しましたが、遺伝的MBRを制作する中で、実行バイナリの生成に関して「プログラミング言語によらない方法として何か面白いやり方は無いか」という事を考えるようになりました。

x86(64ビット)機械語開発

2019年辺りでゆあOSの開発に一区切りつけた後、「プログラミング言語によらない実行バイナリ生成方法」を考える中で、「プログラミング言語を通さずにCPUと直接お話ししてみたい」と思うようになり始めたのが「x86(64ビット)機械語開発」の取り組みです。具体的には、QEMU上でブートローダーとしてpoibootだけ使用した状態で、ブートされる側の実行バイナリ(機械語のバイナリ列)を手で書く、というものです。それにより、「ハードウェアを制御するプログラムをCPUが直接解釈する機械語で書いてCPUに実行させる」ということができます。

この取り組みをまとめたのが「作って分かる!x86_64機械語入門」という同人誌です。この本では、x86(64ビット)の機械語を最低限この本で必要なものを一つ一つ紹介しながら、「四則演算/論理演算」「シリアル送受信」「フレームバッファで画面描画」「キーボード入力取得」といったことをQEMU上で行う実行バイナリ(機械語のバイナリ列)を手で書いて実行してみる、という事を行っています。

表紙・裏表紙説明
作って分かる!x86_64機械語入門
PDF版(技術書典様)・物理版(メロンブックス様)
初出イベント:技術書典7

概要:
最低限のx86(64ビット)機械語を学んで、QEMU上でOSレスで、「四則演算/論理演算」「シリアル送受信」「フレームバッファで画面描画」「キーボード入力取得」を試してみる本

実際に機械語を手で書いてみることで、個人的な感想として、「プログラミング言語を使わない機械語開発もやってやれないことはない」という事と、「結局はCPUが実行できるように機械語のバイナリ列を用意できればその方法は何でも良い」という知見を得られた事が、バイナリ生成の手法としてもっと飛躍したアイディアを追い求めるきっかけになったと思います。

ただ、最大で1命令8バイト(64ビット)もあるx86(64ビット)の機械語は「やってやれない」にしても「手に余る」事は実感していて、「機械語手書きをやるなら今度はもっと簡単な機械語が良いな」とは考えていました。

「バイナリ生物学」と「daisy-tools」

x86(64ビット)機械語開発の後、同年(2019年)に「根本的に独自なOS」として「アプリ(実行バイナリ)が生物として生きることができるOS」を考えました。そこで、バイナリを生物として扱う方法を考えたり、設計・実装したりする事を「バイナリ生物学」と呼ぶ事とし、それをPoC実装も含めてまとめたものが「バイナリ生物学入門」という同人誌です。

表紙・裏表紙説明
バイナリ生物学入門
PDF版(技術書典様)・物理版(メロンブックス様)
初出イベント:コミックマーケット97

概要:
「バイナリ生物学」の考え方と設計を紹介し、PoC実装により意図的に混入されたバグが生物的振る舞いにより自己修復される様子を紹介する本

生物として想定しているのは「単細胞生物」です。単細胞生物の構成要素を実行バイナリの構成要素と対応付ける事で、実行バイナリを単細胞生物として扱うことができます。この本では、以下の図のように対応付けて考えます。(図を一見しただけではよく分からないかと思いますので、興味があればぜひ同人誌をご覧ください)

実行バイナリと細胞を対応付ける考え方

そして、「生きている」とするために実装すべき振る舞いについては、本家の生物学は少し参照するには膨大であるため、まず取っ掛かりとして「言葉の上で『生きている』と言い張れれば良い」という考えのもと、広辞苑の「生物」の定義を参照することにしました。それによると、生物は「代謝」「運動」「成長」「増殖」の4つの振る舞いをするものとされていたので、個人的な考えで「死」も加えた5つの振る舞いを「生きている」とするために実装すべき振る舞いとしました。そして、それら5つの振る舞いが以下の図の様に周期的に実行されます。

5つの振る舞いを周期的に実行

「バイナリ生物学入門」では、実行バイナリを細胞として扱うためのデータ構造と、「生きている」とするための5つの振る舞いをなるべくシンプルな形でUMLによるモデル化を行っています。そして、それをゆあOS上にPoC実装し、実験として「機械語バイナリ列がおかしくなった細胞(バグを想定)が一時的に生まれても、最終的にその様な細胞は居なくなり、正常な細胞だけが残る」という新陳代謝による自己修復のようなものを確認する事を行いました。

daisy-tools」は、バイナリ生物学の理論をLinux環境上のコマンドラインツールとして実行できるようにしたものです。daisy-toolsを実装するにあたり「突然変異」の仕組みを追加しました。それにより、細胞は突然変異による進化が可能になります。そして、進化の方向を導く仕組みとして「適応度」というものを導入しました。「適応度」で進化を導くイメージとしては下図の通りです(詳しくは後述の同人誌をご覧ください)。加えて、daisy-toolsはELFバイナリを扱うことができます。冒頭の画像はdaisy-toolsが動作する様子のスクリーンショットです。

適応度で進化を導く

daisy-toolsが動く様子は、以下のLT発表をご覧ください。バイナリ生物学の考え方をざっくり紹介し、daisy-toolsのデモとして「何もせず正常終了(ステータス0でexit)するだけのELFバイナリ」を生成する実験を行っています。

そして、daisy-toolsのアーキテクチャや使い方、簡単な実験とその結果をまとめたものが同人誌『バイナリ生成環境「daisy-tools」実験報告』です。

表紙・裏表紙説明
バイナリ生成環境「daisy-tools」実験報告
PDF版(技術書典様)・物理版(とらのあな様, メロンブックス様)
初出イベント:技術書典8

概要:
「daisy-tools」のアーキテクチャや使い方を紹介し、簡単な実験として「終了ステータス0で正常終了するだけ」や「Aという1文字を標準出力へ出力するだけ」といった簡単なELFバイナリを進化の仕組みで生成してみる実験を紹介する本

本には書いていませんでしたが、バイナリを生物として扱えることにより、単に進化を待つだけでなく、「品種改良」の手法で人為的に進化を導く事も可能だと考えられます。このように、ソフトウェア工学とは別の領域だった所から理論の応用が効くようになる点は、色々と応用が考えられて面白いと思っています。

このように、夢は広がるのですが、ただこれをどのようにOSとして表現するかを考えながら、また別の活動を行うようになります。

自作OS「AMADO」

AMADOのエミュレータ上での実行時のスクリーンショット

以前からレトロゲームやレトロPCについて知ることが好きで、色々と情報を漁ったり、勉強会に聴講者として参加したりしていました。ただ、レトロゲームハードやレトロPCを自作OSを行う対象とは考えていませんでした。というのも、レトロゲームハードはハードによっては完成度の高いエミュレータがあったりするのでROMファイルとして作成すれば気軽に試すことができますが、実機で動かそうと思うと難易度が上がります。他方、レトロPCはフロッピー等のメディアの入手性はさておき、実機で自作のプログラムを動かすことはそもそも可能です。ただ、エミュレータで試そうと思うと実機から吸い出したBIOSイメージが必要であったりと、気軽に試すことができません。

そんな中、とあるイベントでFlash ROMを搭載したゲームボーイカートリッジとそのライターに出会い、購入しました。これなら自作のプログラムを実機で動かすことができますし、ゲームボーイは完成度の高いエミュレータも存在するのでPC上で気軽に試すこともできます。そこで、レトロゲームハードも自作OSの対象として考えるようになり、「独自性」を考えると「PC向けの自作OS」よりも「レトロゲームハード向けの自作OS」の方が独自性が高いだろうということに加え、マシン語での開発もPCに比べて特にゲームボーイ(8ビット)等はやりやすい事から、レトロゲームハードの方に注力していくようになりました。

その様な経緯で、2020年以降はレトロゲームハードを対象にした同人誌・同人作品の発表を続けています。

まず行ったことは、マシン語でプログラミングする環境作りでした。色々とやり方はあるかと思いますが、echoコマンドやddコマンドでバイナリを出力して並べていくという方法に落ち着き、それをシェルスクリプト化していく中で、シェルスクリプト製のゲームボーイ開発環境となりました。それを用いてゲームボーイ開発をしてみるという内容を同人誌「シェルスクリプトでゲームボーイプログラミング入門」にまとめました。

表紙・裏表紙説明
シェルスクリプトでゲームボーイプログラミング入門
PDF版(技術書典様)・物理版(BEEP様, メロンブックス様)
初出イベント:コミックマーケット98(エアコミケ)

概要:
シェルスクリプトでゲームボーイのROMファイルを生成する本

そして、その開発環境を用いて製作したOSが「AMADO」です。「バイナリ生物学をOSとして落とし込む」イメージがまだできていなかったので、ここでは「ぱっと見てOSだとわかる」事を重視しました。そこで、UIは「ウィンドウとアイコンとマウスカーソル」という現代のOSのインタフェースそのままとし、内部的にもROM/RAMの一部分をファイルシステム領域として独自ファイルシステム上にファイルが存在する形にしました。左クリック(Bボタン)するとテキストや画像を閲覧したり、実行ファイルを実行することができます。それに加えて、右クリック(Aボタン)すると該当のファイルをバイナリエディタで開くことができ、RAM上のファイルを開いた場合は編集することもできます。記念すべき事として、このOSで初めて「自作OS自体を頒布する」ということができました!

作品画像説明

ゲームボーイOS「AMADO」v0.03
ROM版(Booth様)・カートリッジ版(BEEP様, メロンブックス様)
初出イベント:エアコミケ2

概要:
ゲームボーイ上で動作する簡単なOS
同梱のテキストファイルや画像ファイルの閲覧、実行ファイル(ライフゲーム)の実行ができます
バイナリエディタを搭載しており、マシン語プログラミングも可能!

実行ファイルも編集できるので、それなら「ゲームボーイ上でマシン語開発が(一応)できる」ということで、AMADOの使い方の解説と共に『ゲームボーイOS「AMADO」で8ビットマシン語入門』という同人誌にまとめました。

表紙・裏表紙説明
ゲームボーイOS「AMADO」で8ビットマシン語入門
PDF版(技術書典様)・物理版(BEEP様, メロンブックス様)
初出イベント:技術書典10

概要:
AMADOの使い方を紹介し、AMADOの上でバイナリエディタを駆使してゲームボーイの8ビットマシン語プログラミングをやってみる本

その後、メガドライブ上で自作プログラムを動かすのに使えるデバイスセガサターン上で自作プログラムを動かすのに使えるデバイスに出会い、メガドライブやセガサターンでの開発も行うようになりました。特にセガサターンは、CPUがSH2という32ビットCPUで命令長は2バイト固定長(RISC)というマシン語開発がしやすいアーキテクチャであるのに加え、メインCPUであるSH2が2つとVDP(グラフィック用のチップ)が2つ、サウンド用にも専用の音源ICがあるのに加えて16ビットCPU(MC68EC000)を搭載していて、その他にもICがある、といった豪華な構成で、ハードウェアを直接制御することが好きな自分にはとてもイジり甲斐のあるハードです。まだ「自作OS」というレベルには達していませんが、ここ最近は以下のようにセガサターンに関する同人誌を出しています。

表紙・裏表紙説明
エミュレータのコードを読んでわかるセガサターン
PDF版(技術書典様)・物理版(BEEP様, メロンブックス様)
初出イベント:技術書典11

概要:
エミュレータのコードを読むことで、セガサターンというハードがどんな作りのハードだったのかを知る本
セガサターンCDシステムのうすい本
PDF版(技術書典様)・物理版(BEEP様, とらのあな様, メロンブックス様)
初出イベント:コミックマーケット99

概要:
前著では紹介しなかったCDシステム周りをエミュレータのコードから読み解く本
セガサターンとMIDIで通信する本
PDF版(技術書典様)・物理版(BEEP様, とらのあな様, メロンブックス様)
初出イベント:技術書典12

概要:
実はセガサターンには、当時あったデバイスを使うことで、電子楽器を接続するインタフェースであるMIDIの接続が行えます。この本では、それを使ってMIDIキーボードやPCとの通信を試します。そして、PCとの通信の応用例として、PCから受信した実行バイナリをメモリへロードして実行するローダを作ってみます。
セガサターン自作シンセサイザー読本
PDF版(技術書典様)・物理版(BEEP様)
初出イベント:コミックマーケット100

概要:
実はセガサターンの音源ICは高機能で、シンセサイザーを作れるほどの機能があります(実際に作ってみた簡単なシンセサイザーが動く様子はYouTubeにて公開しています)。この本では、この様にセガサターンの音源ICがシンセサイザーだって作れるほどの機能を持っていることをエミュレータのコードで解説します。

この時期にレトロPCにも触れる機会があり、久々にBASICを使ってみることがありました。そこで改めて気づいたことは、BASICはOSのUIとして存在していますが、プログラミング言語でもあるので、同じUI上で「行頭に番号を付けるだけ」という形でシームレスにプログラミングが行えます。それは現代のOSには無い部分です。自分の自作OSでもOSの機能として何らかの方法でプログラミングが行えるようにしたい、という思いでAMADOにはバイナリエディタ機能をつけました。「バイナリ生物学」をOSとして表現する際も、プログラミング言語に相当するものがOSのUIとなる訳なので、「OSとしてやれるコト」のイメージとしてはBASIC的になるんだろうなとイメージしています。

おわりに

ここまでご覧いただきありがとうございました!

この記事では、自作OSを軸にしたこれまでのへにゃぺんての主な活動を紹介しました。その時々の取り組み自体は同人誌等にまとめていましたが、それらを一連の流れとしてまとめた事はありませんでしたので、大変ありがたい機会でした。

へにゃぺんての活動は趣味的で独自なものばかりですが、この様な活動紹介が、同じ様に「趣味で技術的な活動をしている方」などへの少しでも励みになれば幸いです。また何より、へにゃぺんての活動を面白いと思っていただけたら嬉しいです!