starry-kernel
路径:
os/StarryOS/kernel类型:库 crate 分层:StarryOS 层 / StarryOS 内核核心 版本:0.2.0-preview.2文档依据:Cargo.toml、src/lib.rs、src/entry.rs、src/syscall/*、src/task/*、src/mm/*、src/file/*、src/pseudofs/*
starry-kernel 是 StarryOS 的内核核心 crate。它以 ArceOS 的 ax* 模块为底座,叠加 starry-process、starry-signal、starry-vm 等组件,最终形成一个具备 Linux 风格进程、线程、syscall、用户态装载与伪文件系统能力的宏内核。
架构设计
设计定位
与 ArceOS 直接面向 unikernel 应用不同,starry-kernel 的任务是组织一个“完整的用户态世界”:
- 负责构造 init 进程。
- 负责管理进程/线程、地址空间和 FD 表。
- 负责把 trap/用户态切换变成 syscall 语义。
- 负责提供
/proc、/dev、/tmp等伪文件系统。
因此,它是一个“建立在 ArceOS 之上的系统内核”,而不是单纯的模块集合。
模块结构
src/entry.rs:系统启动主线。挂载伪文件系统、创建初始用户地址空间、加载第一个用户程序、创建 init 任务并等待其退出。src/syscall/:系统调用总入口及各子系统分发实现,包含fs、mm、task、net、ipc、signal、time、resources、io_mpx等。src/task/:进程/线程核心逻辑,包含Thread、ProcessData、PID/TID 表、futex、资源限制、信号与时间统计。src/mm/:用户地址空间、ELF 装载、用户内存访问、I/O 映射等,核心路径在loader.rs与aspace/。src/file/:文件对象、文件描述符表、socket/pipe/epoll 等内核文件抽象。src/pseudofs/:伪文件系统挂载逻辑,如/proc、/dev、/tmp、/sys。src/config/:按架构组织的用户空间布局、trampoline 地址、栈大小等配置。src/time.rs:时间相关内核支持。
1.3 关键数据结构
ProcessData:进程共享状态,包含Process、可执行路径、命令行、地址空间、scope、资源限制、信号管理器、futex 表、umask 等。Thread:线程私有状态,包含线程级信号、退出标志、clear_child_tid、robust_list_head、线程时间统计等。Process:来自starry-process,承载 PID、父子关系、进程组/会话等更高层的进程语义。FileDescriptor:文件描述符对象,绑定Arc<dyn FileLike>和cloexec状态。FD_TABLE:按scope_local组织的进程级 FD 表,是 fork/clone/execve 行为的重要语义基础。AddrSpace:用户地址空间对象,内部持有MemorySet<Backend>与页表对象。Backend:表示不同的映射后端,如线性映射、共享映射、文件映射、COW 等。
1.4 启动与 init 主线
starry-kernel 的启动路径非常清晰:
从 src/entry.rs 可见,系统的 bring-up 不是“直接进入某个 shell”,而是先把用户态可执行环境完整搭起来,再把 init 作为真正的用户任务启动。
1.5 syscall 分发主线
handle_syscall() 是整个系统的控制中枢:
- 从
UserContext读取 syscall 号和参数。 - 尝试把编号转成
Sysno。 - 按
fs/mm/task/net/ipc/signal/time/...分发。 - 把结果转换为 Linux 风格错误码并写回用户上下文。
这意味着:
- syscall 兼容性主要体现为
syscall/*的实现质量。 - 如果行为不符合 Linux 预期,优先检查的是 syscall 子模块,而不是启动包。
1.6 进程/线程与地址空间主线
starry-kernel 的内部设计强调“进程共享态”和“线程私有态”分离:
ProcessData管理地址空间、信号组、资源限制、共享文件表作用域等。Thread管理线程级退出、信号、时间统计与用户态恢复相关状态。clone、execve、wait、futex等复杂语义都围绕这两层展开。
这种设计使 StarryOS 可以在复用 ax-task 线程调度能力的同时,补齐 Linux 风格进程模型。