Diosixの開発
安全性 > セキュリティ > 正確性 > 保守性 を優先してください。自己文書化され、メモリ安全で、厳密に制約されたイディオマティックなZig 0.17.0およびRISC-Vアセンブリを記述し、すべての変更が事前コミットの手直しなしに、最初の reviewing-diosix を通過するようにします。
基本要件
- 動作し、完全で、ビルド可能なコード(基本条件): すべての変更は、Root VM/ハイパーバイザビルドとホストユニットテストスイート(
./scripts/build.shおよび./scripts/build.sh test)の両方で問題なくコンパイルできる必要があります。壊れたコード、スタブのTODOプレースホルダ、モックされた本番パス、または部分的に実装された機能を残さないでください。 - 行数とファイルサイズの制限(サブフォルダに分割、決して切り詰めない): すべてのコードとコメントは80桁以内で折り返してください。ソースファイルは500行以内に保ってください。ファイルが500行を超えた場合、その機能やテストを決して切り詰めず、専用のサブフォルダに分解してください(
panes/vm.zig、vm/run.zig、tests/gui.zig。フラットなprefix_subname.zigファイル(panes_vm.zig、vm_run.zig、tests_gui.zig)を増やさないこと)。また、すべてのサブモジュールを親のtestブロックに配線してください(_ = @import("vm/run.zig");)。 - プレフィックス-アンダースコア形式のファイル名よりもサブフォルダ、コピペ禁止: プロジェクト、ディレクトリ、または兄弟モジュールの冗長なプレフィックスを付けずに、簡潔な
snake_caseファイル名を使用してください(api.zig、main.c、vm/info.zig、tests/nav.zigを使用し、diosix_api.zig、diosix-alsa-init.c、vm_info.zig、tests_nav.zigは使用しない)。共有プリミティブ(Spinlock、ページアライメント計算、パス探索バリデータ、ABI定数など)をモジュール間で決して複製せず、hypervisor/interface/、hypervisor/core/atomic.zig、またはcommon.zigからインポートしてください。 - イディオマティックなディスパッチ: コマンド、フラグ、設定キーに対して
if (std.mem.eql(...)) else if (...)の連鎖を決して書かないでください。代わりにenumを定義し、std.meta.stringToEnum(EnumType, slice)でパースし、switchでディスパッチしてください。 - 明示的な固定幅ABI型、小文字16進数、名前付きビットマスク: すべてのABI/ハードウェア構造体(
extern struct、packed struct)および64ビットゲストレジスタ状態では、明示的な固定幅型(u64、u32、u16、u8)を使用し、決してusizeや C のunsigned longを使用しないでください。@min/@maxから初期化されるローカル変数には、常に comptime リテラルで型注釈を付けてください(const w: usize = @min(n, 1280);)。これにより、Zig が後でオーバーフローする狭い整数型(u11)を推論するのを防ぎます。すべての16進数リテラルは小文字で記述し(0xfff、0xffff_ffff、0xFFFは不可)、マジックビットマスク/オフセット((vaddr & 0xfff) > 0xffc)を名前付き定数と自己文書化ヘルパー(PAGE_OFFSET_MASK、crossesPageBoundary(vaddr, @sizeOf(u32)))に置き換えてください。 - 静的推測よりも動的割り当て: ヒープ初期化前に実行される初期Mモードブートコードのみ、固定静的バッファを使用できます。アロケータが利用可能になったら、固定スタックバッファサイズを推測するのではなく、動的にバッファを割り当てて拡張してください(例:
var buf: [4096]u8を避ける)。 - メモリ所有権とクリーンアップ: すべての割り当て(
alloc、create、dupe、print、mmap)は、直ちにdeferまたはerrdeferとペアにしてください。解放されたゲストページと暗号化秘密はゼロ化してください(std.crypto.secureZero)。 - エンタープライズハイパーバイザの分離: ゲストの入力や状態によってMモードでパニックを起こさないでください。代わりにSBIエラーを返すか、問題のゲストサブツリーを終了させてください。共有ゲストメモリは、バリデーション前に一度だけハイパーバイザ所有メモリにコピー(
@memcpy)して、ダブルフェッチ(TOCTOU)の脆弱性を防止してください。 - コードにはメカニズム、ポリシーはビルド時/実行時設定に: ポリシーレベルの設定や調整可能なデフォルト値をZigコードにハードコードしないでください。調整可能な値や設定は、ビルド時設定(
build.zigoptions /boot/hypervisor.conf)または実行時設定ファイル(/etc/diosix/*.toml、key = "value"を1行80桁以内に収める)に移動してください。 - バイナリとイメージはビルド時に生成、Zigで動的に生成しない: Zigで実行時にELFバイナリ、マシンコードシム、メディアイメージをワード単位で組み立てるのを避けてください。シムはビルド時にコンパイルされるアセンブリまたはZigソースファイルに保持し、メディアイメージのビルドには専用スクリプトを使用し、生成されたビルド出力を
tools/overlay-common/に配置しないでください(代わりに.zig-cache/overlay-dynamic/を使用)。 - 同一ファイル内のユニットテストと分離された結合テスト: ユニット
testブロックは、テスト対象のソースファイル内に配置してください(std.testing.refAllDecls(@This())を呼び出す)。複数コンポーネントの結合テストは、専用のtests/ディレクトリに配置してください。 - レガシーフォールバックの蓄積なき後方互換性: 外部契約(SBIハイパーコールABI、
/dev/diosixioctl、文書化されたdsxCLIコマンド/JSONスキーマ、ユーザー作成の/etc/diosix/*.tomlファイル)との互換性は維持しますが、同じバージョンの内部配管に対しては、マルチパスフォールバック配列(DEFAULT_GUEST_CANDIDATES)を決して蓄積しないでください。プロデューサーとコンシューマーがこのリポジトリ内で一緒に出荷される場合、単一の正規パスまたはシンボルを使用するように、ツリー内のすべてのプロデューサー、コンシューマー、テストをアトミックに更新し、永続ディスクレイアウトのアップグレードはブート/インストール境界で一度だけ処理し、履歴パスを永久にプローブしないでください。 - 不明な場合は、停止してリードメンテナーに確認: アーキテクチャ上の決定、あいまいな要件、欠落したサブシステム機能について推測しないでください。先に進む前に、リードメンテナーに確認してください。
Mモード vs Uモード実行環境
| 項目 | Mモードハイパーバイザ(hypervisor/) | Uモードツール(tools/) |
|---|---|---|
| ターゲット | riscv64-freestanding-none | riscv64-linux-musl(テストではホスト) |
| プリヒープブート | entry.s 内の静的コアごとのスラブ(0..31) | 該当なし(main でOSプロセス環境が準備済み) |
| アロケータ | コアごと pcore.this().allocator.allocator() | std.heap.SafeAllocator / page_allocator / ArenaAllocator |
| クラッシュポリシー | ゲスト入力でパニックしない、問題のゲストVMを隔離して終了 | 説明的なエラーを返し、クリーンな終了コードで終了 |
| ハードウェアアクセス | 直接CSR/MMIO(ホストユニットテストの場合は if (is_test) でガード) | /dev/diosix ioctl(api.zig)、DRM/evdev、Linuxシステムコール |
集中リファレンスガイド
コードを記述または変更する前に、該当するリファレンスファイルを読んでください。
- Zig 0.17.0 イディオムとビルトイン:
最新のZig 0.17構文(
@backingInt、@splat、allocator.print、SafeAllocator、stringToEnum、@ptrCastforextern struct、固定幅ABI型、@min型注釈、末尾カンマ付き80桁フォーマット、ビルドキャッシュの純粋性)。 - メモリ管理と動的バッファ:
MモードとUモードのアロケータパターン、動的バッファ拡張、
defer/errdeferの規律、秘密のゼロ化、出力ポインタの初期化。 - アーキテクチャとTigerStyle: 完全な機能実装、ユニットテストを失わないモジュラーファイル分割、コピペの重複ゼロ、境界のあるループ、アサーションのペアリング、オーバーレイ/設定の衛生管理。
- RISC-Vとエンタープライズハイパーバイザ: RV64アセンブリ規約、CSRモッキング、爆発範囲の封じ込め、ダブルフェッチ防止パターン、IRQセーフスピンロックの順序付け、Gステージ/PMP分離。