Featured

【PangeaOS v0.0.1-7】ファイルシステムを捨て去り、真の「Single-Level Store」を手に入れた日

OS開発という領域において、私たちは無意識のうちに「1970年代のUNIXの呪縛」に囚われています。データを保存するには「ファイル」という概念が必要であり、それを管理するために「ファイルシステム(VFS)」を実装しなければならない、という常識です。

しかし、フルスクラッチのベアメタルRust OSである PangeaOS は、最新リリースである v0.0.1-7 において、このレガシーな概念を完全に破壊しました。

本記事では、PangeaOSがどのようにして既存のファイルシステムを捨て去り、Rustの構造体を直接NVMeディスクに永続化する「Pangea Native Object Store (PNOS)」を創世したのか。そして、その過程で立ち塞がった恐ろしいハードウェアの壁と、それをハックで乗り越えた軌跡を解説します。

1. VFSの終焉と PNOS (Pangea Native Object Store) の創世
近代的なストレージアーキテクチャであるNVMeを完全に非同期で駆動できるようになったPangeaOSが次に向かったのは、FAT32やExt4といった従来型ファイルシステムの実装……ではありませんでした。

PangeaOSは SASOS (Single Address Space Operating System) というパラダイムを採用しています。メモリとディスクの境界を曖昧にし、システム全体をひとつの巨大な記憶空間として扱うアーキテクチャです。

今回実装された PNOS は、データをシリアライズしてバイトストリームの「ファイル」に変換するプロセスを廃止しました。代わりに、Rustで定義された PnosSuperBlock や SystemBootRecord といった構造体(オブジェクト)を、ゼロコピーで直接NVMeのLBA(論理ブロックアドレス)にマッピングして永続化します。

メモリ上のRustの構造体が、一瞬にして物理ディスク上のセクタに刻み込まれる。まさに「Single-Level Store」がベアメタル上で実現した瞬間です。

2. 仮想メモリと物理メモリの壁:「引き算のオーバーフロー」
この革新的なストレージ機能の実装は、決して平坦な道のりではありませんでした。 NVMeのDMA(Direct Memory Access)エンジンを使ってメモリからディスクへデータを転送しようとした瞬間、カーネルは以下のパニックを吐き出しました。

panicked at kernel/src/nvme.rs: attempt to subtract with overflow

原因はメモリアドレスの逆変換にありました。タスクが確保したバッファは「仮想アドレス」に存在しますが、ハードウェア(NVMe)は「物理アドレス」しか理解できません。仮想アドレスからページオフセットを引いて物理アドレスを算出しようとした際、UEFIブートローダーが割り当てたスタック領域の配置都合によりアンダーフローが発生したのです。

【解決策:DMAバウンス・バッファ】 ページテーブルウォーカーを実装する代わりに、私たちは確実かつ高速な手法である「バウンス・バッファ(Bounce Buffer)」を導入しました。 物理メモリ上の絶対的に安全な固定領域(0x0200_4000)をDMA専用のバッファとして予約。ハードウェアとの通信はすべてこの物理バッファで行い、完了後にCPUがタスクの仮想バッファへコピー(バウンス)する仕組みです。これにより、メモリアドレスの壁を完璧に突破しました。

3. 無限再起動の恐怖:「トリプルフォールト」との戦い
ハードウェアの壁を越え、いよいよ起動回数をディスクに記録するテスト(test_boot_record)を実行したとき、第二の悲劇が起きました。 エラーメッセージすら出ず、QEMUが無限に再起動(リセット)を繰り返すようになったのです。

これはOS開発者の通過儀礼とも言える「トリプルフォールト」。原因はRustの async/await の仕組みそのものに潜んでいました。 NVMeの読み書きのために宣言した [u8; 4096] という巨大なローカル配列が、非同期タスクのステートマシン(Future)内にパッキングされ、実行された瞬間に極小のカーネルスタックを食い破って(スタックオーバーフロー)システムを吹き飛ばしていたのです。

【解決策:BSSセクションへの静的退避】 OSの起動直後は、まだヒープメモリアロケータ(Global Allocator)が完全に機能していないデリケートな時間帯です。 そこで私たちは、巨大なバッファをスタックでもヒープでもなく、実行ファイルの .bss セクション(静的領域)に Mutex<[u8; 4096]> として事前確保するアーキテクチャへと設計を転換しました。これにより、スタック消費ゼロ、かつ非同期タスク間で完全に安全なデータ転送が実現しました。

4. セキュリティと開発体験(DX)の洗練
v0.0.1-7 は新機能だけでなく、システムの根幹を美しく磨き上げました。

PortCapabilityモデルの完全復活: これまで一時的に妥協していた unsafe な直接ポートアクセスを排除。ハードウェア権限を完全に型システムで縛るLanguage-Based Isolation(言語ベースの分離)を徹底しました。
究極の開発ランナー: src/main.rs のホスト側ランナーをアップデートし、テストに必要な64MBのNVMeダミーイメージ(nvme.img)を自動生成するように改良。リポジトリから巨大なバイナリファイルやログを排除し、誰でも cargo run 一発でクリーンにPangeaOSを起動できる極上の開発体験(DX)を構築しました。
次なるフロンティアへ
以上の死闘の末、ターミナルには輝かしい一文が表示されました。

-> [PNOS] SYSTEM RECORD FOUND. Boot count: 2

この数字の「2」は、PangeaOSが再起動を跨いでも自分自身の「記憶」を失わなかったことの証明です。

ファイルシステムという過去の遺物を捨て去り、真のSASOSとして覚醒したPangeaOS。次なるアップデートでは、IOMMU(VT-d)による絶対的なDMA防衛機構か、あるいはVirtIOを駆使したネットワーク(世界との接続)へと挑みます。

Rustが切り拓くベアメタルの新世界に、これからもご期待ください。

PangeaOS — Forging a single, unbreakable world from the bare metal up.

https://github.com/forestnote/pangeaos