Community写作与编辑github.com

diodesign/diosix-agent-skills

编写 Zig 0.17、RISC-V 汇编以及系统软件时,遵循 Diosix 项目的规则、惯用语法和企业级虚拟机监控器标准。在编写、重构或规划 M 模式虚拟机监控器代码、S 模式模拟代码或 U 模式用户空间工具时,请启用此技能。

diosix-agent-skills 是什么?

这是一套为 Diosix 项目及其所有子系统(包括 M 模式虚拟机监控器、S 模式模拟以及 U 模式用户空间工具)提供严格编码规则和惯用语法的技能。它在开发过程中优先考虑安全 (Safety) > 安全性 (Security) > 正确性 (Correctness) > 可维护性 (Maintainability),并强加严格的约束,如 80 列代码换行、500 行文件限制、使用子文件夹目录结构替代长文件名前缀、以及使用精确的固定宽度 ABI 类型。该技能通过 13 条核心强制要求(包括完整的零拷贝粘贴策略、内存所有权规则、企业级隔离指导方针以及构建时配置实践)来强制执行这些标准。它支持在 Zig 0.17、RISC-V 汇编和 C 语言中工作,并且严重依赖其参考文档,在任何代码更改之前都需查阅这些文档。该技能通过将单元测试与源文件共存,将集成测试放在单独的 `tests/` 文件夹中,确保了全面测试。最终目标是在所有平台上生成可维护、安全且完全正确的代码,在提交之前无需进行任何返工。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/diodesign/diosix-agent-skills/tree/HEAD/developing-diosix

Installed? Explore more 写作与编辑 skills: steipete/notion, langchain-ai/langchain, bytedance/podcast-generation · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

开发 Diosix

优先考虑 安全 (Safety) > 安全性 (Security) > 正确性 (Correctness) > 可维护性 (Maintainability)。编写具有自文档性、内存安全性和严格边界约束的惯用 Zig 0.17.0 和 RISC-V 汇编代码,以便每次更改都能一次性通过 reviewing-diosix 审查,而无需在提交前返工。

核心强制要求

  1. 可运行、完整且可构建的代码(基本要求):每次更改都必须在根虚拟机/虚拟机监控器构建和主机单元测试套件(./scripts/build.sh 和 ./scripts/build.sh test)中干净地编译通过。切勿遗留损坏的代码、存根的 TODO 占位符、模拟的生产路径或部分实现的功能。
  2. 行与文件限制(分解为子文件夹,绝不截断):所有代码和注释换行宽度 <= 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");)。
  3. 子文件夹优先于前缀下划线文件名,且零拷贝粘贴:使用简洁的 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 中导入它们。
  4. 惯用分发方式:切勿为命令、标志或配置键编写 if (std.mem.eql(...)) else if (...) 链。定义一个 enum,使用 std.meta.stringToEnum(EnumType, slice) 进行解析,并使用 switch 分发。
  5. 显式固定宽度 ABI 类型、小写十六进制和命名位掩码:在所有 ABI/硬件结构体(extern struct、packed struct)和 64 位客户寄存器状态中使用显式固定宽度类型(u64、u32、u16、u8)—— 绝不使用 usize 或 C 语言的 unsigned long。始终用编译时字面量(const w: usize = @min(n, 1280);)对从 @min/@max 初始化的局部变量进行类型注解,以便 Zig 不会推断出一个较窄的整数类型(如 u11)从而导致后续溢出。所有十六进制字面量请使用小写(0xfff、0xffff_ffff,绝不使用 0xFFF),并用命名常量和自文档化辅助函数(PAGE_OFFSET_MASK、crossesPageBoundary(vaddr, @sizeOf(u32)))替换魔数位掩码/偏移量(如 (vaddr & 0xfff) > 0xffc)。
  6. 动态分配优于静态猜测:只有在堆初始化之前执行的早期 M 模式引导代码才可以使用固定的静态缓冲区。一旦分配器可用,应动态分配和增长缓冲区,而不是猜测固定的栈缓冲区大小(例如避免使用 var buf: [4096]u8)。
  7. 内存所有权与清理:每次分配(alloc、create、dupe、print、mmap)后都需立即添加 defer 或 errdefer。清零已释放的客户页面和密码学机密(std.crypto.secureZero)。
  8. 企业级虚拟机监控器隔离:切勿因客户输入或状态而在 M 模式下引发 panic;应返回 SBI 错误或终止有问题的客户子树。将共享的客户内存一次性复制(@memcpy)到虚拟机监控器拥有的内存中,然后在验证之前防止双取(TOCTOU)漏洞。
  9. 代码中实现机制,构建/运行时配置中定义策略:切勿在 Zig 代码中硬编码策略级别的设置或可调优的默认值。将可调优项和设置移至构建时配置(build.zig 选项 / boot/hypervisor.conf)或运行时配置文件(/etc/diosix/*.toml,保持 key = "value" 在单行内且不超过 80 列)。
  10. 在构建时生成二进制文件和镜像,而不是在 Zig 中运行时生成:避免在运行时在 Zig 中逐字组装 ELF 二进制文件、机器码垫片或媒体镜像。将垫片保留在汇编或 Zig 源文件中,在构建时编译;使用专用脚本构建媒体镜像;切勿将生成的构建输出放置在 tools/overlay-common/ 内(应使用 .zig-cache/overlay-dynamic/)。
  11. 共置单元测试与独立的集成测试:将单元 test 块放在其所测试的源文件中(调用 std.testing.refAllDecls(@This()))。将多组件集成测试放在专用的 tests/ 目录中。
  12. 保持向后兼容性,但避免累积遗留回退:维护外部契约的兼容性(SBI 超级调用 ABI、/dev/diosix ioctl、文档化的 dsx CLI 命令/JSON 模式以及用户编写的 /etc/diosix/*.toml 文件),但切勿为同一版本化的内部管道累积多路径回退数组(如 DEFAULT_GUEST_CANDIDATES)。当生产者与消费者在此仓库中一起发布时,应原子性地更新树内所有生产者、消费者和测试,以使用单一规范路径或符号,并在引导/安装边界处一次性处理持久磁盘布局升级,而不是永远探测历史路径。
  13. 不确定时,停下来询问主维护者:切勿猜测架构决策、模糊需求或缺失的子系统能力。在继续之前停下来询问主维护者。

M 模式 vs. U 模式执行环境

方面M 模式虚拟机监控器 (hypervisor/)U 模式工具 (tools/)
目标平台riscv64-freestanding-noneriscv64-linux-musl(测试时也可为主机)
预堆引导entry.s 中的静态每核 slab (0..31)不适用(OS 进程环境在 main 时已就绪)
分配器每核 pcore.this().allocator.allocator()std.heap.SafeAllocator / page_allocator / ArenaAllocator
崩溃策略绝不对客户输入引发 panic;隔离并终止有问题的客户 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、@ptrCast 用于 extern struct、固定宽度 ABI 类型、带尾逗号的 80 列格式化以及构建缓存纯度)。
  • 内存管理与动态缓冲区:M 模式与 U 模式分配器模式、动态缓冲区增长、defer/errdefer 规则、机密清零和出参数初始化。
  • 架构与 TigerStyle:完整功能实现、不丢失单元测试的模块化文件拆分、零拷贝粘贴重复、有界循环、断言配对以及覆盖层/配置卫生。
  • RISC-V 与企业级虚拟机监控器:RV64 汇编约定、CSR 模拟、爆炸半径控制、双取预防模式、IRQ 安全的自旋锁顺序以及 G 阶段/PMP 隔离。

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

相关技能