linux系统调用的地方:
- 中断之后,进入_system_call,(定义在linux-0.11/kernel/system_call.s)
- _system_call:
- cmpl $nr_system_calls-1,%eax
- ja bad_sys_call
- push %ds
- push %es
- push %fs
- pushl %edx
- pushl %ecx # push %ebx,%ecx,%edx as parameters
- pushl %ebx # to the system call
- movl $0x10,%edx # set up ds,es to kernel space
- mov %dx,%ds
- mov %dx,%es
- movl $0x17,%edx # fs points to local data space
- mov %dx,%fs
- call [color=Red]_sys_call_table[/color](,%eax,4)
- pushl %eax
- movl _current,%eax
- cmpl $0,state(%eax) # state
- jne reschedule
- cmpl $0,counter(%eax) # counter
- je reschedule
复制代码
- _system_call 根据系统调用号,结合_sys_call_table计算所要调用的系统调用的地址,然后就call (call _sys_call_table(,%eax,4))(sys_call_table[]定义在linux-0.11/include/linux/sys.h)
- fn_ptr [color=Red]sys_call_table[/color][] = { sys_setup, sys_exit, sys_fork, sys_read,
- sys_write, sys_open, sys_close, sys_waitpid, sys_creat, sys_link,
- sys_unlink, sys_execve, sys_chdir, sys_time, sys_mknod, sys_chmod,
- sys_chown, sys_break, sys_stat, sys_lseek, sys_getpid, sys_mount,
- sys_umount, sys_setuid, sys_getuid, sys_stime, sys_ptrace, sys_alarm,
- sys_fstat, sys_pause, sys_utime, sys_stty, sys_gtty, sys_access,
- sys_nice, sys_ftime, sys_sync, sys_kill, sys_rename, sys_mkdir,
- sys_rmdir, sys_dup, sys_pipe, sys_times, sys_prof, sys_brk, sys_setgid,
- sys_getgid, sys_signal, sys_geteuid, sys_getegid, sys_acct, sys_phys,
- sys_lock, sys_ioctl, sys_fcntl, sys_mpx, sys_setpgid, sys_ulimit,
- sys_uname, sys_umask, sys_chroot, sys_ustat, sys_dup2, sys_getppid,
- sys_getpgrp, sys_setsid, sys_sigaction, sys_sgetmask, sys_ssetmask,
- sys_setreuid,sys_setregid };
复制代码 前面的call _sys_call_table(,%eax,4) 如何找到后面的表 sys_call_table的,我在源码中找不到有用的信息,谢谢!
|