系统调用是一个软中断,中断号是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) (); // 定义函数指针类型。
- // 以下是内核实现的系统调用符号常数,用于作为系统调用函数表中的索引值。( include/linux/sys.h )
- #define __NR_setup 0 /* used only by init, to get system going */
- /* __NR_setup 仅用于初始化,以启动系统 */
- #define __NR_exit 1
- #define __NR_fork 2
- #define __NR_read 3
- #define __NR_write 4
- #define __NR_open 5
- #define __NR_close 6
- #define __NR_waitpid 7
- #define __NR_creat 8
- #define __NR_link 9
- #define __NR_unlink 10
- #define __NR_execve 11
- #define __NR_chdir 12
- #define __NR_time 13
- #define __NR_mknod 14
- #define __NR_chmod 15
- #define __NR_chown 16
- #define __NR_break 17
- #define __NR_stat 18
- #define __NR_lseek 19
- #define __NR_getpid 20
- #define __NR_mount 21
- #define __NR_umount 22
- #define __NR_setuid 23
- #define __NR_getuid 24
- #define __NR_stime 25
- #define __NR_ptrace 26
- #define __NR_alarm 27
- #define __NR_fstat 28
- #define __NR_pause 29
- #define __NR_utime 30
- #define __NR_stty 31
- #define __NR_gtty 32
- #define __NR_access 33
- #define __NR_nice 34
- #define __NR_ftime 35
- #define __NR_sync 36
- #define __NR_kill 37
- #define __NR_rename 38
- #define __NR_mkdir 39
- #define __NR_rmdir 40
- #define __NR_dup 41
- #define __NR_pipe 42
- #define __NR_times 43
- #define __NR_prof 44
- #define __NR_brk 45
- #define __NR_setgid 46
- #define __NR_getgid 47
- #define __NR_signal 48
- #define __NR_geteuid 49
- #define __NR_getegid 50
- #define __NR_acct 51
- #define __NR_phys 52
- #define __NR_lock 53
- #define __NR_ioctl 54
- #define __NR_fcntl 55
- #define __NR_mpx 56
- #define __NR_setpgid 57
- #define __NR_ulimit 58
- #define __NR_uname 59
- #define __NR_umask 60
- #define __NR_chroot 61
- #define __NR_ustat 62
- #define __NR_dup2 63
- #define __NR_getppid 64
- #define __NR_getpgrp 65
- #define __NR_setsid 66
- #define __NR_sigaction 67
- #define __NR_sgetmask 68
- #define __NR_ssetmask 69
- #define __NR_setreuid 70
- #define __NR_setregid 71
这是一系列宏,它们的定义在unistd.h中,基本形式为#define _NR_name value,name为系统函数名字,value是一个整数值,是name所对应的系统函数指针在sys_call_table中的偏移量。
http://blog.youkuaiyun.com/geekcome/article/details/6398414