歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux內核 >> Linux內核分析之系統調用

Linux內核分析之系統調用

日期:2017/2/28 16:00:36   编辑:Linux內核

在內核入口函數start_kernel中調用trap_init實現系統調用的初始化工作

  1. void __init trap_init(void)
  2. {
  3. ...
  4. set_system_trap_gate(SYSCALL_VECTOR, &system_call);
  5. ....
  6. }
也就是IDT中0x80用來實現系統調用,實現系統調用的函數為system_call,為匯編實現
  1. ENTRY(system_call)
  2. RING0_INT_FRAME # can't unwind into user space anyway
  3. pushl %eax # save orig_eax
  4. CFI_ADJUST_CFA_OFFSET 4
  5. SAVE_ALL
  6. GET_THREAD_INFO(%ebp)
  7. # system call tracing in operation / emulation
  8. testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp)
  9. jnz syscall_trace_entry
  10. cmpl $(nr_syscalls), %eax
  11. jae syscall_badsys
  12. syscall_call:
  13. call *sys_call_table(,%eax,4)/*跳轉到具體的系統調用函數*/
  14. movl %eax,PT_EAX(%esp) # store the return value
  15. syscall_exit:
  16. LOCKDEP_SYS_EXIT
  17. DISABLE_INTERRUPTS(CLBR_ANY) # make sure we don't miss an interrupt
  18. # setting need_resched or sigpending
  19. # between sampling and the iret
  20. TRACE_IRQS_OFF
  21. movl TI_flags(%ebp), %ecx
  22. testl $_TIF_ALLWORK_MASK, %ecx # current->work
  23. jne syscall_exit_work
........

具體的系統調用函數存放在sys_call_table表中,在調用system_call具體的系統調用號存放在eax寄存器中 

			
Copyright © Linux教程網 All Rights Reserved