1.6 KiB
1.6 KiB
07 用户态、系统调用与进程
目标
让 Tianole 从只运行 kernel 代码,进入可运行用户程序的阶段。
前置条件
- 虚拟内存可用。
- VFS 可读取 ELF 文件或 init 程序。
- 异常和 syscall 入口可用。
建议边界
kernel/syscall/:系统调用入口和分发。kernel/process/:进程、线程、地址空间。kernel/elf/:用户 ELF 加载。arch/x86/:ring 3 切换和 syscall 指令支持。
实现内容
- 建立用户地址空间。
- 建立 syscall ABI。
- 建立用户指针检查。
- 加载用户 ELF。
- 支持进程退出和等待。
- 早期可先实现
spawn/exit/wait,再演进到fork/exec。 - 为 POSIX syscall、
fcntl/stat/chmod、signal、pipe、socket、eventfd、futex、共享内存、poll/select 和 IPC 预留 ABI 边界。 - 为 uid/gid、用户/组、文件权限、进程权限、capability 或等价隔离模型预留进程凭据结构。
非玩具化约束
- syscall 表要稳定记录。
- 用户指针不能直接信任。
- 进程、线程、地址空间结构不要混成一个对象。
- 用户态崩溃不能直接拖垮 kernel。
- syscall 不能只按当前 demo 程序硬编码。
- 进程资源释放必须有明确所有权和引用计数规则。
fork/exec/wait、signal、pipe、poll/select 是运行复杂 Unix 程序的关键路径,不能被路线遗漏。
验收方式
- 最小用户程序可以输出并退出。
- kernel 能回收用户进程资源。
- 非法用户访问能进入异常处理并终止进程。
- syscall ABI 文档化,后续可以被 libc 绑定。