用户态 #PF 的终止路径直接从 ISR 调用 _yield,不经过 ISR 出口。 原实现在 _yield 前把 GS_BASE swap 回 0;但下一个被调度的线程如果是 从用户态 timer IRQ 或 syscall 挂起的,它的恢复路径会自己 swapgs 回 0。 提前 swap 会让它 swap 反,下一次系统调用用 gs:[8] 取内核栈时读到 线性地址 8,进而三重故障/整机卡死。 - 删除终止路径的 swapgs 块,保持 ISR 入口后的 GS 视图,与其他 timer/syscall 让出路径一致 - 先置 THREAD_DONE 再 free_user_thread,与 Scheduler.exit_current_thread 的次序一致,避免“资源已释放但 state 仍是 RUNNING”的再调度窗口