免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3206 | 回复: 1

[数据结构] linux系统调用 _sys_call_table 和 sys_call_table 关系 [复制链接]

论坛徽章:
0
发表于 2013-05-06 13:26 |显示全部楼层
linux系统调用的地方:

  1. 中断之后,进入_system_call,(定义在linux-0.11/kernel/system_call.s)

  2. _system_call:

  3.        cmpl $nr_system_calls-1,%eax

  4.        ja bad_sys_call

  5.        push %ds

  6.        push %es

  7.        push %fs

  8.        pushl %edx

  9.        pushl %ecx              # push %ebx,%ecx,%edx as parameters

  10.        pushl %ebx              # to the system call

  11.        movl $0x10,%edx         # set up ds,es to kernel space

  12.        mov %dx,%ds

  13.        mov %dx,%es

  14.        movl $0x17,%edx         # fs points to local data space

  15.        mov %dx,%fs

  16.        call [color=Red]_sys_call_table[/color](,%eax,4)

  17.        pushl %eax

  18.        movl _current,%eax

  19.        cmpl $0,state(%eax)             # state

  20.        jne reschedule

  21.        cmpl $0,counter(%eax)           # counter

  22.        je reschedule
复制代码

  1. _system_call 根据系统调用号,结合_sys_call_table计算所要调用的系统调用的地址,然后就call  (call _sys_call_table(,%eax,4))(sys_call_table[]定义在linux-0.11/include/linux/sys.h)

  2. fn_ptr [color=Red]sys_call_table[/color][] = { sys_setup, sys_exit, sys_fork, sys_read,

  3. sys_write, sys_open, sys_close, sys_waitpid, sys_creat, sys_link,

  4. sys_unlink, sys_execve, sys_chdir, sys_time, sys_mknod, sys_chmod,

  5. sys_chown, sys_break, sys_stat, sys_lseek, sys_getpid, sys_mount,

  6. sys_umount, sys_setuid, sys_getuid, sys_stime, sys_ptrace, sys_alarm,

  7. sys_fstat, sys_pause, sys_utime, sys_stty, sys_gtty, sys_access,

  8. sys_nice, sys_ftime, sys_sync, sys_kill, sys_rename, sys_mkdir,

  9. sys_rmdir, sys_dup, sys_pipe, sys_times, sys_prof, sys_brk, sys_setgid,

  10. sys_getgid, sys_signal, sys_geteuid, sys_getegid, sys_acct, sys_phys,

  11. sys_lock, sys_ioctl, sys_fcntl, sys_mpx, sys_setpgid, sys_ulimit,

  12. sys_uname, sys_umask, sys_chroot, sys_ustat, sys_dup2, sys_getppid,

  13. sys_getpgrp, sys_setsid, sys_sigaction, sys_sgetmask, sys_ssetmask,

  14. sys_setreuid,sys_setregid };
复制代码
前面的call _sys_call_table(,%eax,4) 如何找到后面的表 sys_call_table的,我在源码中找不到有用的信息,谢谢!

论坛徽章:
0
发表于 2013-05-07 09:12 |显示全部楼层
编译器在编译C语言的时候,会在每个函数的名称前面添加一个下划线,目的是防止函数名称和库函数重名。 C专家编程 5.4 章节interpositioning 讲解了原理。至于添加下划线的方法,是unix C 的规则。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP