根因: musl 的 sched_yield() 调用 syscall 124 (SYS_sched_yield),内核对应 sys_sched_yield() 错误地调用了 block_current_task(),将任务状态设为 Blocked 且永不重新加入就绪队列。子进程在执行 sched_yield() 后从调度器 中彻底消失,父进程在 wait4 中永远等不到子进程退出。
修复: os/src/syscall/stub.rs — sys_sched_yield() 改为调用 suspend_current_and_run_next(),正确执行 Ready → add_task → schedule。
诊断过程: 通过 [switch]/[pf]/[sched] suspend|block 日志追踪调度路径,发现关键 线索 [sched] block pid=2(应为 suspend)。确认子进程 COW 缺页处理成功 后执行 sched_yield → syscall 124 → block_current_task 而非预期的 suspend_current_and_run_next。
关联改动:
- os/src/syscall/process.rs: sys_wait4 增加诊断日志 (ENTER/ECHILD/REAP/BLOCK/WOKE)
- os/src/task/mod.rs: exit_current_and_run_next 增加 [exit] 日志
- os/src/task/processor.rs: idle 日志注释化
- os/src/task/manager.rs: add_task/fetch_task 调试日志清理
- user/src/bin/initproc.rs: 取消 waitpid 等 26 个通过测试的注释
结果: 全部 26 项 basic 测试通过 (新增 waitpid + wait)。