starry-vm 技术文档
路径:
components/starry-vm类型:库 crate 分层:组件层 / StarryOS 用户虚拟内存访问组件 版本:0.3.0文档依据:Cargo.toml、src/lib.rs、src/thin.rs、src/alloc.rs、tests/test.rs、os/StarryOS/kernel/src/mm/access.rs、os/StarryOS/kernel/src/syscall/task/execve.rs、os/StarryOS/kernel/src/syscall/task/clone3.rs、os/StarryOS/kernel/src/mm/io.rs、os/StarryOS/kernel/src/syscall/ipc/msg.rs
starry-vm 是 StarryOS 的“用户虚拟内存访问层”。它定义了一套与具体地址空间实现解耦的读写接口,使 syscall 实现可以安全地把用户态指针解释成 Rust 值、切片和字符串,而不必把用户态地址直接当普通内核指针使用。
名字里虽然带 vm,但它并不管理页表、VMA、mmap、ELF 装载或缺页策略。那些真正的“虚拟内存管理”职责在 starry-kernel::mm,尤其是 AddrSpace、loader.rs 和 access.rs 中。
1. 架构设计分析
1.1 总体定位
从 StarryOS 的真实调用关系看,starry-vm 位于 syscall 层和用户地址空间之间:
- syscall 参数进入内核后,常先通过
VmPtr/VmMutPtr/vm_load*()做指针编组。 - 真正的地址检查、
user_copy和缺页协作由消费者实现VmIo。 - 同一套 API 既能被内核实现使用,也能在 host 侧测试里用假内存池替身实现。
这使它更像“用户内存 I/O 抽象层”,而不是“地址空间对象模型”。
1.2 模块划分
src/lib.rs:定义VmError、VmResult、VmIo、vm_read_slice()、vm_write_slice()。src/thin.rs:定义VmPtr/VmMutPtr两个轻量指针 trait,支持原始指针和NonNull<T>。src/alloc.rs:在启用allocfeature 时提供vm_load_any()、vm_load()、vm_load_until_nul()。