linux核心分析之系統呼叫
阿新 • • 發佈:2019-02-07
在核心入口函式start_kernel中呼叫trap_init實現系統呼叫的初始化工作
void __init trap_init(void)
{
...
set_system_trap_gate(SYSCALL_VECTOR, &system_call);
....
}
也就是IDT中0x80用來實現系統呼叫,實現系統呼叫的函式為system_call,為彙編實現
ENTRY(system_call) RING0_INT_FRAME # can't unwind into user space anyway pushl %eax # save orig_eax CFI_ADJUST_CFA_OFFSET 4 SAVE_ALL GET_THREAD_INFO(%ebp) # system call tracing in operation / emulation testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp) jnz syscall_trace_entry cmpl $(nr_syscalls), %eax jae syscall_badsys syscall_call: call *sys_call_table(,%eax,4)/*跳轉到具體的系統呼叫函式*/ movl %eax,PT_EAX(%esp) # store the return value syscall_exit: LOCKDEP_SYS_EXIT DISABLE_INTERRUPTS(CLBR_ANY) # make sure we don't miss an interrupt # setting need_resched or sigpending # between sampling and the iret TRACE_IRQS_OFF movl TI_flags(%ebp), %ecx testl $_TIF_ALLWORK_MASK, %ecx # current->work jne syscall_exit_work