Files
ViperOS/VKernel/Kernel
TermiNexus 645e4015ca feat(sched): 线程切换保存/恢复 FPU/SSE(fxsave/fxrstor)
混合抢占后中断帧只保存通用寄存器,异步抢占可能落在 SSE 表达式中间,FP 密集 app(Gargantua/Scene3D)的 XMM 会被其它线程覆盖。① Thread 末尾内嵌 fpu_area[528] + fpu_ptr,用 (base+15)&~15 手工对齐出 512B FXSAVE 区(编译器类装饰器只认 packed,不认 aligned);Thread 由 64B 变为 600B,MAX_THREADS=16 ⇒ 线程表 9600B,Scheduler 约 9624B。② _do_switch:切 rsp 之前 fxsave [old],换栈后 fxrstor [new];仅用 RAX 取地址(其值已压栈),不改动 GPR 与中断状态。③ 新线程 FPU 默认镜像直接写内存(512B 清零、FCW=0x037F、MXCSR=0x1F80、MXCSR_MASK=0xFFFF),不执行 fninit 以免破坏创建者的实时 XMM。④ 内嵌于 Thread,随静态存储存活,无需额外回收。⑤ 协作式 yield 与抢占共用 _do_switch,因此两条路径都正确隔离 SSE。⑥ _thread_entry 的硬编码偏移同步为 +9600/×600,并加 fail-fast 校验(不符立即 FATAL,不静默跑飞)。
2026-10-17 17:15:14 +08:00
..