Skip to content

fix: sys_sched_yield 错误阻塞任务导致 waitpid 永久挂死

StellaOS requested to merge fix_waitpid into main

根因: 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)。

Merge request reports