ENTRY(system_call) //进入系统调用,执行int0x80后就跳到这里接着执行
SAVE_ALL //宏,作用是保存现场
syscall_call:
call *sys_call_table(,%eax,4) //访问系统调用表,eax传递过来的就是系统调用号,
//之前的例子里就是调用sys_getpid,然后执行调用对应的处理函数
movl %eax,PT_EAX(%esp) //将寄存器eax中保存的返回值存储
syscall_exit: //开始退出系统调用
testl $_TIF_ALLWPRK_MASK,%ecx //会检测要不要执行syscall_exit_work,正常情况会有一些需要处理的工作
// 比如当前进程有一些信号要处理,系统需要进行调度
jne syscall_exit_work //不需要就直接恢复现场返回
restore_all: //恢复现场
RESTORE_INT_REGS
irq_return: //退出系统调用,实际就是iret,系统调用到这里结束。
INTERRUPT_RETURN
ENDPROC(system_call)
syscall_exit_work:
testl $_TIF_WORK_SYSCALL_EXIT,%ecx
jz work_pending //跳转到work_pending
END(syscall_exit_work)
work_pending:
testb $_TIF_NEED_RESCHED,%cl
jz work_notifysing //处理信号
work_resched:
call schedule //重新调度,就调用schedule
jz restore_all //调度完了返回restore_all
work_notifysing:
...
END(work_pending)