借り初めのひみつきち

仮ブログです。

initramfs

コンピューターの神秘のひとつに、起動時にファイルシステムドライバを読み込むためにファイルシステムにアクセスしなければならないという矛盾があります。 現代の OS では起動に必要なファイルを収めた簡易ファイルシステムを RAM に展開してこれを解決します。

initrd と initramfs

この仕組みは linux などで慣例的に initrd (INITial RamDisk の略) と呼ばれています。 実際の linux には initrd と initramfs という2種類の仕組みがあって、現在では initramfs の方が一般的に使われています。

MYOS でも initrd が導入されましたが、 initrd は仮想ブロックデバイスとしてマウントするのでファイルシステムドライバが必要になってしまうという問題があります。

MYOS の initrd は FAT を選択したので FAT に由来するいくつかの問題も引きずることになりました。 起動時のファイルシステムは適当なファイル名を指定してバイト列を読み出せればいいだけなので本格的なファイルシステムの機能はほとんど必要なく、 FAT ですらオーバースペックな一方で、 FAT 特有の扱いづらさもありました。

というわけで initrd の仕組みを変えましょう。

OSZ の initramfs

最小の MEG-OS である OSZ にも独自実装の initramfs があります。

f:id:neriring16:20210327210747p:plain

最後の方に12バイトの 8.3 形式ファイル名、 2バイトのオフセット、2バイトのサイズで合計16バイトのファイルエントリが並んでいるのがわかるかと思います。 OSZ はカーネルファイルシステムドライバが存在せず、代わりにカーネルの後半にこのようなファイルシステムが連結されていて起動時のシェルなどを読み込んでいます。

TOE の initramfs

TOE ではブートローダーをあまり複雑にしたくないので、最初に読み込むカーネルファイルの後半に initramfs を連結したいと思います。

最初は OSZ 方式をそのまま採用しようかと検討しましたが、すぐに 64KB の壁にぶち当たることが明白ですし、古き良き 8.3 形式ファイル名の制限も現代ではちょっと厳しいです。 ということで、エントリを2倍の32バイトに広げてファイル名の制限を緩めてオフセットやサイズも4バイトに拡張して実装しました。

f:id:neriring16:20210328173741p:plain

ブートローダーはカーネルの後半にあるアーカイブをメモリの一番最後にコピーしてカーネルを起動するときに bootinfo にアドレスを通知し、ファイルシステムマネージャの初期化時にそこにあるデータを読み込むようにします。

f:id:neriring16:20210328195447p:plain

これで TOE にもファイルシステムが実装できました🎉

今後

MYOS のファイルシステムはインターフェースも未整備で結構微妙な感じでした。 今後はファイルシステムインターフェースを整備して TOE から MYOS に移植して、それが終わったらいよいよ TOE でもアプリ実行できるようにしたいですね。