+ .global switch_to
+ switch_to:
+ # 约定
+ # arg1: 目标进程PCB地址 (next)
+ popl %ecx # next
+
+ call signal_dispatch # kernel/signal.c
+ movl %eax, %edx
+
+ movl __current, %eax
+ movl 88(%eax), %ebx # __current->pagetable
+ movl 88(%ecx), %eax # next->pagetable
+
+ cmpl %ebx, %eax # if(next->pagtable != __current->pagetable) {
+ jz 1f
+ movl %eax, %cr3 # cpu_lcr3(next->pagetable)
+ # }
+ 1:
+ movl %ecx, __current # __current = next
+
+ test %edx, %edx # do we have signal to handle?
+ jz 1f
+ movl %edx, %eax
+ jmp handle_signal
+ 1:
+ leal 8(%ecx), %eax
+ jmp soft_iret
+
+ .global handle_signal