系统调用(int 0x80)

系统调用是一个软中断,中断号是0x80,它是上层应用程序与Linux系统内核进行交互通信的唯一接口。

通过int 0x80,就可使用内核资源。不过,通常应用程序都是使用具有标准接口定义的C函数库间接的使用内核的系统调用,即应用程序调用C函数库中的函数,C函数库中再通过int 0x80进行系统调用。

所以,系统调用过程是这样的:
    应用程序调用libc中的函数->libc中的函数引用系统调用宏->系统调用宏中使用int 0x80完成系统调用并返回

下面是sys_call_table的定义文件

位于./include/sys.h

 extern int sys_setup (); // 系统启动初始化设置函数。 (kernel/blk_drv/hd.c,71)
extern int sys_exit (); // 程序退出。 (kernel/exit.c, 137)
extern int sys_fork (); // 创建进程。 (kernel/system_call.s, 208)
extern int sys_read (); // 读文件。 (fs/read_write.c, 55)
extern int sys_write (); // 写文件。 (fs/read_write.c, 83)
extern int sys_open (); // 打开文件。 (fs/open.c, 138)
extern int sys_close (); // 关闭文件。 (fs/open.c, 192)
extern int sys_waitpid (); // 等待进程终止。 (kernel/exit.c, 142)
extern int sys_creat (); // 创建文件。 (fs/open.c, 187)
extern int sys_link (); // 创建一个文件的硬连接。 (fs/namei.c, 721)
extern int sys_unlink (); // 删除一个文件名(或删除文件)。 (fs/namei.c, 663)
extern int sys_execve (); // 执行程序。 (kernel/system_call.s, 200)
extern int sys_chdir (); // 更改当前目录。 (fs/open.c, 75)
extern int sys_time (); // 取当前时间。 (kernel/sys.c, 102)
extern int sys_mknod (); // 建立块/字符特殊文件。 (fs/namei.c, 412)
extern int sys_chmod (); // 修改文件属性。 (fs/open.c, 105)
extern int sys_chown (); // 修改文件宿主和所属组。 (fs/open.c, 121)
extern int sys_break (); // (-kernel/sys.c, 21)
extern int sys_stat (); // 使用路径名取文件的状态信息。 (fs/stat.c, 36)
extern int sys_lseek (); // 重新定位读/写文件偏移。 (fs/read_write.c, 25)
extern int sys_getpid (); // 取进程id。 (kernel/sched.c, 348)
extern int sys_mount (); // 安装文件系统。 (fs/super.c, 200)
extern int sys_umount (); // 卸载文件系统。 (fs/super.c, 167)
extern int sys_setuid (); // 设置进程用户id。 (kernel/sys.c, 143)
extern int sys_getuid (); // 取进程用户id。 (kernel/sched.c, 358)
extern int sys_stime (); // 设置系统时间日期。 (-kernel/sys.c, 148)
extern int sys_ptrace (); // 程序调试。 (-kernel/sys.c, 26)
extern int sys_alarm (); // 设置报警。 (kernel/sched.c, 338)
extern int sys_fstat (); // 使用文件句柄取文件的状态信息。(fs/stat.c, 47)
extern int sys_pause (); // 暂停进程运行。 (kernel/sched.c, 144)
extern int sys_utime (); // 改变文件的访问和修改时间。 (fs/open.c, 24)
extern int sys_stty (); // 修改终端行设置。 (-kernel/sys.c, 31)
extern int sys_gtty (); // 取终端行设置信息。 (-kernel/sys.c, 36)
extern int sys_access (); // 检查用户对一个文件的访问权限。(fs/open.c, 47)
extern int sys_nice (); // 设置进程执行优先权。 (kernel/sched.c, 378)
extern int sys_ftime (); // 取日期和时间。 (-kernel/sys.c,16)
extern int sys_sync (); // 同步高速缓冲与设备中数据。 (fs/buffer.c, 44)
extern int sys_kill (); // 终止一个进程。 (kernel/exit.c, 60)
extern int sys_rename (); // 更改文件名。 (-kernel/sys.c, 41)
extern int sys_mkdir (); // 创建目录。 (fs/namei.c, 463)
extern int sys_rmdir (); // 删除目录。 (fs/namei.c, 587)
extern int sys_dup (); // 复制文件句柄。 (fs/fcntl.c, 42)
extern int sys_pipe (); // 创建管道。 (fs/pipe.c, 71)
extern int sys_times (); // 取运行时间。 (kernel/sys.c, 156)
extern int sys_prof (); // 程序执行时间区域。 (-kernel/sys.c, 46)
extern int sys_brk (); // 修改数据段长度。 (kernel/sys.c, 168)
extern int sys_setgid (); // 设置进程组id。 (kernel/sys.c, 72)
extern int sys_getgid (); // 取进程组id。 (kernel/sched.c, 368)
extern int sys_signal (); // 信号处理。 (kernel/signal.c, 48)
extern int sys_geteuid (); // 取进程有效用户id。 (kenrl/sched.c, 363)
extern int sys_getegid (); // 取进程有效组id。 (kenrl/sched.c, 373)
extern int sys_acct (); // 进程记帐。 (-kernel/sys.c, 77)
extern int sys_phys (); // (-kernel/sys.c, 82)
extern int sys_lock (); // (-kernel/sys.c, 87)
extern int sys_ioctl (); // 设备控制。 (fs/ioctl.c, 30)
extern int sys_fcntl (); // 文件句柄操作。 (fs/fcntl.c, 47)
extern int sys_mpx (); // (-kernel/sys.c, 92)
extern int sys_setpgid (); // 设置进程组id。 (kernel/sys.c, 181)
extern int sys_ulimit (); // (-kernel/sys.c, 97)
extern int sys_uname (); // 显示系统信息。 (kernel/sys.c, 216)
extern int sys_umask (); // 取默认文件创建属性码。 (kernel/sys.c, 230)
extern int sys_chroot (); // 改变根系统。 (fs/open.c, 90)
extern int sys_ustat (); // 取文件系统信息。 (fs/open.c, 19)
extern int sys_dup2 (); // 复制文件句柄。 (fs/fcntl.c, 36)
extern int sys_getppid (); // 取父进程id。 (kernel/sched.c, 353)
extern int sys_getpgrp (); // 取进程组id,等于getpgid(0)。(kernel/sys.c, 201)
extern int sys_setsid (); // 在新会话中运行程序。 (kernel/sys.c, 206)
extern int sys_sigaction (); // 改变信号处理过程。 (kernel/signal.c, 63)
extern int sys_sgetmask (); // 取信号屏蔽码。 (kernel/signal.c, 15)
extern int sys_ssetmask (); // 设置信号屏蔽码。 (kernel/signal.c, 20)
extern int sys_setreuid (); // 设置真实与/或有效用户id。 (kernel/sys.c,118)
extern int sys_setregid (); // 设置真实与/或有效组id。 (kernel/sys.c, 51)
// 系统调用函数指针表。用于系统调用中断处理程序(int 0x80),作为跳转表。
fn_ptr sys_call_table[] = {

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
};


其中sys_call_table的类型是fn_ptr类型,其中sys_call_table[0]元素为sys_setup,它的类型是fn_ptr类型,它实际上是函数sys_setup的

入口地址。

它的定义如下:

typedef int (*fn_ptr) (); // 定义函数指针类型。

  1. // 以下是内核实现的系统调用符号常数,用于作为系统调用函数表中的索引值。( include/linux/sys.h )  
  2. #define __NR_setup 0        /* used only by init, to get system going */  
  3. /* __NR_setup 仅用于初始化,以启动系统 */  
  4. #define __NR_exit 1  
  5. #define __NR_fork 2  
  6. #define __NR_read 3  
  7. #define __NR_write 4  
  8. #define __NR_open 5  
  9. #define __NR_close 6  
  10. #define __NR_waitpid 7  
  11. #define __NR_creat 8  
  12. #define __NR_link 9  
  13. #define __NR_unlink 10  
  14. #define __NR_execve 11  
  15. #define __NR_chdir 12  
  16. #define __NR_time 13  
  17. #define __NR_mknod 14  
  18. #define __NR_chmod 15  
  19. #define __NR_chown 16  
  20. #define __NR_break 17  
  21. #define __NR_stat 18  
  22. #define __NR_lseek 19  
  23. #define __NR_getpid 20  
  24. #define __NR_mount 21  
  25. #define __NR_umount 22  
  26. #define __NR_setuid 23  
  27. #define __NR_getuid 24  
  28. #define __NR_stime 25  
  29. #define __NR_ptrace 26  
  30. #define __NR_alarm 27  
  31. #define __NR_fstat 28  
  32. #define __NR_pause 29  
  33. #define __NR_utime 30  
  34. #define __NR_stty 31  
  35. #define __NR_gtty 32  
  36. #define __NR_access 33  
  37. #define __NR_nice 34  
  38. #define __NR_ftime 35  
  39. #define __NR_sync 36  
  40. #define __NR_kill 37  
  41. #define __NR_rename 38  
  42. #define __NR_mkdir 39  
  43. #define __NR_rmdir 40  
  44. #define __NR_dup 41  
  45. #define __NR_pipe 42  
  46. #define __NR_times 43  
  47. #define __NR_prof 44  
  48. #define __NR_brk 45  
  49. #define __NR_setgid 46  
  50. #define __NR_getgid 47  
  51. #define __NR_signal 48  
  52. #define __NR_geteuid 49  
  53. #define __NR_getegid 50  
  54. #define __NR_acct 51  
  55. #define __NR_phys 52  
  56. #define __NR_lock 53  
  57. #define __NR_ioctl 54  
  58. #define __NR_fcntl 55  
  59. #define __NR_mpx 56  
  60. #define __NR_setpgid 57  
  61. #define __NR_ulimit 58  
  62. #define __NR_uname 59  
  63. #define __NR_umask 60  
  64. #define __NR_chroot 61  
  65. #define __NR_ustat 62  
  66. #define __NR_dup2 63  
  67. #define __NR_getppid 64  
  68. #define __NR_getpgrp 65  
  69. #define __NR_setsid 66  
  70. #define __NR_sigaction 67  
  71. #define __NR_sgetmask 68  
  72. #define __NR_ssetmask 69  
  73. #define __NR_setreuid 70  
  74. #define __NR_setregid 71 

这是一系列宏,它们的定义在unistd.h中,基本形式为#define _NR_name value,name为系统函数名字,value是一个整数值,是name所对应的系统函数指针在sys_call_table中的偏移量。



http://blog.csdn.net/geekcome/article/details/6398414




  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值