From 7d8a4ee6ff6b3c1b286a2002cd7fb5b6a2b5102f Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Sat, 17 Oct 2026 17:17:28 +0800 Subject: [PATCH] =?UTF-8?q?fix(sched):=20=E5=86=85=E8=81=94=E6=B1=87?= =?UTF-8?q?=E7=BC=96=E6=94=B9=E7=94=A8=20lea=20+=20=E9=97=B4=E6=8E=A5?= =?UTF-8?q?=E5=AF=BB=E5=9D=80=EF=BC=8C=E7=BB=95=E5=BC=80=20[rip=20+=20sym?= =?UTF-8?q?=20+=20=E5=81=8F=E7=A7=BB]=20=E4=B8=8D=E8=A2=AB=E9=9B=86?= =?UTF-8?q?=E6=88=90=E6=B1=87=E7=BC=96=E5=99=A8=E6=8E=A5=E5=8F=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit llc 集成汇编器对 mov qword ptr [rip + _isr_scratch + 8], rcx 这种'RIP 相对符号 + 常量偏移'的直接寻址报 invalid operand(把整条指令识别成缺源操作数)。改为先 lea rsi, [rip + _isr_scratch](lea 形式此前已验证可用),再按 [rsi + N] / [rdx + N] 访问,共 12 处(保存 6 + 恢复 6)。rsi/rdx 都在 _do_switch 的 push 列表内,切栈后写入会被随后的 pop 恢复,不影响新线程寄存器。 --- VKernel/Kernel/sched/sched.vp | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/VKernel/Kernel/sched/sched.vp b/VKernel/Kernel/sched/sched.vp index 8a3719a..3801daa 100644 --- a/VKernel/Kernel/sched/sched.vp +++ b/VKernel/Kernel/sched/sched.vp @@ -340,21 +340,22 @@ def _do_switch(): mov rax, qword ptr [rip + _switch_old_fpu] fxsave [rax] # 按线程保存 ISR scratch(被抢占的 ISR 会跨越其它线程的 ISR) + lea rsi, [rip + _isr_scratch] mov eax, dword ptr [rip + _switch_old_tid] imul rax, rax, 48 lea rdx, [rip + _isr_scratch_tbl] add rdx, rax - mov rcx, qword ptr [rip + _isr_scratch] + mov rcx, qword ptr [rsi] mov qword ptr [rdx], rcx - mov rcx, qword ptr [rip + _isr_scratch + 8] + mov rcx, qword ptr [rsi + 8] mov qword ptr [rdx + 8], rcx - mov rcx, qword ptr [rip + _isr_scratch + 16] + mov rcx, qword ptr [rsi + 16] mov qword ptr [rdx + 16], rcx - mov rcx, qword ptr [rip + _isr_scratch + 24] + mov rcx, qword ptr [rsi + 24] mov qword ptr [rdx + 24], rcx - mov rcx, qword ptr [rip + _isr_scratch + 32] + mov rcx, qword ptr [rsi + 32] mov qword ptr [rdx + 32], rcx - mov rcx, qword ptr [rip + _isr_scratch + 40] + mov rcx, qword ptr [rsi + 40] mov qword ptr [rdx + 40], rcx mov rax, qword ptr [rip + _switch_old_rsp] mov qword ptr [rax], rsp @@ -364,22 +365,23 @@ def _do_switch(): mov rax, qword ptr [rip + _switch_new_fpu] fxrstor [rax] # 恢复切入线程的 scratch(不在 ISR 中时内容无意义,覆盖无害) + lea rsi, [rip + _isr_scratch] mov eax, dword ptr [rip + _switch_new_tid] imul rax, rax, 48 lea rdx, [rip + _isr_scratch_tbl] add rdx, rax mov rcx, qword ptr [rdx] - mov qword ptr [rip + _isr_scratch], rcx + mov qword ptr [rsi], rcx mov rcx, qword ptr [rdx + 8] - mov qword ptr [rip + _isr_scratch + 8], rcx + mov qword ptr [rsi + 8], rcx mov rcx, qword ptr [rdx + 16] - mov qword ptr [rip + _isr_scratch + 16], rcx + mov qword ptr [rsi + 16], rcx mov rcx, qword ptr [rdx + 24] - mov qword ptr [rip + _isr_scratch + 24], rcx + mov qword ptr [rsi + 24], rcx mov rcx, qword ptr [rdx + 32] - mov qword ptr [rip + _isr_scratch + 32], rcx + mov qword ptr [rsi + 32], rcx mov rcx, qword ptr [rdx + 40] - mov qword ptr [rip + _isr_scratch + 40], rcx + mov qword ptr [rsi + 40], rcx popfq pop r15 pop r14