
2025/12/07 8:33
PatchworkOS: An OS for x86_64, built from scratch in C and assembly
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
**PatchworkOS は、x86_64 向けの新興モジュラーオペレーティングシステムであり、従来の POSIX モデルを放棄し、Plan 9 スタイルの「すべてがファイル」という哲学を採用しています。
カーネルは C とアセンブリで最初から作成され、完全にプリエンプティブかつティックレスな EEVDF スケジューラ(O(log n))、細粒度ロック付き対称マルチプロセッシング、O(1) のページ単位メモリ操作、およびファイルベースの IPC を実装しています。また、デバイス API、さまざまな同期プリミティブを公開し、
/net/local 下でヘルパー関数(sread、swrite など)を使用してソケットをファイルとして実装します。Unix スタイルの仮想ファイルシステムはマウントポイント、ハードリンク、プロセスごとの名前空間を提供し、グラフィックスにはカスタム
.fbmp ビットマップと .grf フォントフォーマットを使用します。ユーザー空間にはカスタム C 標準ライブラリ、モジュラー共有メモリデスクトップ環境、および最小限のユーティリティ(touch、cat、echo、ls、rm)が含まれます。POSIX との主な相違点は、
fork/exec の代わりに spawn() を使用すること、ユーザー概念を持たないこと、モード/権限の代わりにファイルフラグを使用すること、および「すべてがファイル」という強いフォーカスです。現在の制約としては RAM‑ディスクのみでのストレージ(USB サポートは未実装)および x86_64 アーキテクチャ限定があります。Lenovo ThinkPad E495 上で行ったベンチマークでは、PatchworkOS はメモリ割り当て/マッピングテストにおいて Fedora Linux を上回り、O(1) のページ操作を実現しています。同プロジェクトは ACPI/AML パースを最初から実装しており、PS/2 ドライバは
_CRS エントリを通じてリソース探索を示しています。将来計画には LUA ベースの動的設定、完全非同期 I/O(例:io_uring)、USB サポートが含まれます。ビルド/実行手順は、リポジトリをクローンし、
make all を実行、QEMU で起動する(make run)です。ドキュメントは Doxygen 経由で利用可能です。
この改訂サマリーはすべての主要ポイントを網羅し、根拠のない推測を回避しつつ PatchworkOS の明確かつ簡潔な概要を提示しています。**
本文
PatchworkOS(パッチワークOS)
PatchworkOS は、x86_64 用に設計された初期段階のモジュール型非 POSIX オペレーティングシステムです。
「すべてがファイルである」という Plan 9 からインスパイアされた哲学を採用しています。
C とアセンブリ言語でゼロから構築され、教育的価値と実験的魅力の両方を備えています。
概要
| 項目 | 内容 |
|---|---|
| カーネル | • 完全にプリエンプティブで tickless な EEVDF スケジューラ(Augmented Red‑Black Tree を用いた O(log n)) • SMP と細粒度ロック • ページ単位のメモリ操作は O(1)、割り当て/マッピングは O(n) • ファイルベースの IPC:パイプ、共有メモリ、ソケット、Plan 9 の “notes” • デバイス API:フレームバッファ、キーボード、マウス 等 • 同期プリミティブ:ミューテックス、RW‑ロック、futex など • 高度にモジュール化。SMP の起動もモジュールとして実装 |
| ファイルシステム | • Unix スタイルの VFS(マウントポイント、ハードリンク、プロセスごとの名前空間) • カスタムイメージフォーマット (高速フレームバッファロード)• グレースケールラスターフォント (アンチエイリアシングとカーニング付き) |
| ユーザー空間 | • 独自の C 標準ライブラリおよびシステムライブラリ • モジュラー型共有メモリデスクトップ環境 • 設定ファイルでテーマ設定 |
POSIX との主な相違点
→fork()/exec()spawn()- 「ユーザー」概念はなし
- 非 POSIX 標準ライブラリ
- ファイルベース API を重視
- ファイルフラグが従来のモード/権限を置き換える
制約事項
- RAM‑ディスクのみ(USB サポートは未実装)
- x86_64 のみ対応
今後の計画
- Lua を統合し、動的設定を可能にする
- 完全非同期 I/O /
風システムコールio_uring - USB サポート追加
ドキュメントとビルド方法
# クローンしてビルド git clone https://github.com/KaiNorberg/PatchworkOS cd PatchworkOS make all # bin/PatchworkOS.img を作成 make run # QEMU で起動
追加ターゲット:
| ターゲット | 説明 |
|---|---|
| ビルド成果物を削除 |
| デバッグシンボル付きでビルド |
| 単体テスト有効化(iasl が必要) |
| API ドキュメント生成 |
| IDE 用 |
例:Hello‑World モジュールの作成
/* src/kernel/modules/hello/hello.c */ #include <kernel/module/module.h> #include <kernel/log/log.h> #include <stdint.h> uint64_t _module_procedure(const module_event_t *event) { if (event->type == MODULE_EVENT_LOAD) { LOG_INFO("Hello, World!\n"); } return 0; } MODULE_INFO( "Hello", /* 名前 */ "<author>", /* 作者 */ "A simple hello world module", "1.0", "MIT", "BOOT_ALWAYS" /* ブート時にロード */ );
ビルドへの追加:
ps2.mk をコピーして hello.mk とし、ビルド&実行。 /dev/klog でメッセージを確認。
「すべてがファイル」実装例
ソケット(Plan 9 スタイル)
/* シーケンパケットソケットの作成 */ char *id = sreadfile("/net/local/seqpacket"); swritefile(F("/net/local/%s/ctl", id), "bind myserver && listen"); /* 接続を受け入れる */ fd_t fd = open(F("/net/local/%s/accept", id));
フラグと権限
/* 非ブロッキングソケットを開く */ open("/net/local/seqpacket:nonblock"); /* 読み書き可能なファイルを作成 */ touch("file.txt:read:write");
ベンチマーク(メモリアロケーション)
| ページ数 | PatchworkOS (ms) | Fedora 40 (ms) |
|---|---|---|
| 1 | 157 | 1138 |
| … | … | … |
| 30 | 7486 | 37660 |
PatchworkOS はページテーブルにメタデータを埋め込むことで O(1) ページ操作を実現し、性能が向上しています。
シェルユーティリティ
| ユーティリティ | 説明 | 例 |
|---|---|---|
| ファイル/ディレクトリ作成 | |
| ファイル読み書き、プロセス終了ステータス取得 | |
| 標準出力またはファイルへ書き込み | |
| ディレクトリ内容一覧 | |
| ファイル/ディレクトリ削除 | |
リポジトリ構成
PatchworkOS/ ├── meta/ # ドキュメント、スクリーンショット ├── lib/ # サードパーティライブラリ ├── root/ # 画像ルート用ファイル └── src/ ├── kernel/ ├── modules/ ├── programs/ ├── libstd/ └── libpatchwork/
Grub のループバック(任意)
/etc/grub.d/40_custom に追加:
menuentry "Patchwork OS" { set root="[GRUB identifier]" loopback loop0 /PatchworkOS.img set root=(loop0) chainloader /efi/boot/bootx64.efi }
GRUB 設定を再生成し、
.img を /boot にコピー。
トラブルシューティング
- QEMU 起動失敗 – QEMU 9.2.3 を使用(10.x 系列は問題あり)
- その他のエラー – GitHub の Issue で報告
コントリビュート
バグ修正・性能改善・新機能・ドキュメントの PR は歓迎です。
アイデアがあれば TODO リストを確認してください。