在网上找了好一会儿才找到,自己整理一下,也方便以后查看。
参考网址:
http://zh.wikipedia.org/wiki/%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8
http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html
1.系统调用
在计算机中,系统调用(英语:system call),又称为系统呼叫,指运行在使用者空间的程序向操作系统内核请求需要更高权限运行的服务。 系统调用提供了用户程序与操作系统之间的接口。大多数系统交互式操作需求在内核态执行。如设备IO操作或者进程间通信。
Linux的系统调用通过int 80h实现,用系统调用号来区分入口函数。 操作系统实现系统调用的基本过程是:
应用程序调用库函数(API);
API将系统调用号存入EAX,然后通过中断调用使系统进入内核态;
内核中的中断处理函数根据系统调用号,调用对应的内核函数(系统调用);
系统调用完成相应功能,将返回值存入EAX,返回到中断处理函数;
中断处理函数返回到API中;
API将EAX返回给应用程序。
2.系统调用表(表格我整理成了excel下载,基于linux2.2的,不过应该都差不多)
寄存器eax存放调用号,剩下的几个寄存器存放参数。
以sys_write为例说明:
函数原型:
sys_write(unsigned int fd, const char * buf, size_t count)
下面是对于Linux汇编Helloworld的一些注释,可以对应系统调用表来看
[section .data]
strHello db "Hello, world!",0Ah
STRLEN equ $ - strHello
[section .text]
global _start
_start:
mov edx,STRLEN;对应参数count
mov ecx,strHello;对应参数buf
mov ebx,1;对应参数fd,fd = 1,在linux中对应于stdout,指的是显示屏
mov eax,4;系统调用号为4,sys_write
int 0x80
mov ebx,0;参数为0,exit(0)
mov eax,1;系统调用号为1,sys_exit
int 0x80
%eax |
Name |
Source |
%ebx |
%ecx |
%edx |
%esx |
%edi |
1 |
sys_exit |
kernel/exit.c |
int |
- |
- |
- |
- |
2 |
sys_fork |
arch/i386/kernel/process.c |
struct pt_regs |
- |
- |
- |
- |
3 |
sys_read |
fs/read_write.c |
unsigned int |
char * |
size_t |
- |
- |
4 |
sys_write |
fs/read_write.c |
unsigned int |
const char * |
size_t |
- |
- |
5 |
sys_open |
fs/open.c |
const char * |
int |
int |
- |
- |
6 |
sys_close |
fs/open.c |
unsigned int |
- |
- |
- |
- |
7 |
sys_waitpid |
kernel/exit.c |
pid_t |
unsigned int * |
int |
- |
- |
8 |
sys_creat |
fs/open.c |
const char * |
int |
- |
- |
- |
9 |
sys_link |
fs/namei.c |
const char * |
const char * |
- |
- |
- |
10 |
sys_unlink |
fs/namei.c |
const char * |
- |
- |
- |
- |
11 |
sys_execve |
arch/i386/kernel/process.c |
struct pt_regs |
- |
- |
- |
- |
12 |
sys_chdir |
fs/open.c |
const char * |
- |
- |
- |
- |
13 |
sys_time |
kernel/time.c |
int * |
- |
- |
- |
- |
14 |
sys_mknod |
fs/namei.c |
const char * |
int |
dev_t |
- |
- |
15 |
sys_chmod |
fs/open.c |
const char * |
mode_t |
- |
- |
- |
16 |
sys_lchown |
fs/open.c |
const char * |
uid_t |
gid_t |
- |
- |
18 |
sys_stat |
fs/stat.c |
char * |
struct __old_kernel_stat * |
- |
- |
- |
19 |
sys_lseek |
fs/read_write.c |
unsigned int |
off_t |
unsigned int |
- |
- |
20 |
sys_getpid |
kernel/sched.c |
- |
- |
- |
- |
- |
21 |
sys_mount |
fs/super.c |
char * |
char * |
char * |
- |
- |
22 |
sys_oldumount |
fs/super.c |
char * |
- |
- |
- |
- |
23 |
sys_setuid |
kernel/sys.c |
uid_t |
- |
- |
- |
- |
24 |
sys_getuid |
kernel/sched.c |
- |
- |
- |
- |
- |
25 |
sys_stime |
kernel/time.c |
int * |
- |
- |
- |
- |
26 |
sys_ptrace |
arch/i386/kernel/ptrace.c |
long |
long |
long |
long |
- |
27 |
sys_alarm |
kernel/sched.c |
unsigned int |
- |
- |
- |
- |
28 |
sys_fstat |
fs/stat.c |
unsigned int |
struct __old_kernel_stat * |
- |
- |
- |
29 |
sys_pause |
arch/i386/kernel/sys_i386.c |
- |
- |
- |
- |
- |
30 |
sys_utime |
fs/open.c |
char * |
struct utimbuf * |
- |
- |
- |
33 |
sys_access |
fs/open.c |
const char * |
int |
- |
- |
- |
34 |
sys_nice |
kernel/sched.c |
int |
- |
- |
- |
- |
36 |
sys_sync |
fs/buffer.c |
- |
- |
- |
- |
- |
37 |
sys_kill |
kernel/signal.c |
int |
int |
- |
- |
- |
38 |
sys_rename |
fs/namei.c |
const char * |
const char * |
- |
- |
- |
39 |
sys_mkdir |
fs/namei.c |
const char * |
int |
- |
- |
- |
40 |
sys_rmdir |
fs/namei.c |
const char * |
- |
- |
- |
- |
41 |
sys_dup |
fs/fcntl.c |
unsigned int |
- |
- |
- |
- |
42 |
sys_pipe |
arch/i386/kernel/sys_i386.c |
unsigned long * |
- |
- |
- |
- |
43 |
sys_times |
kernel/sys.c |
struct tms * |
- |
- |
- |
- |
45 |
sys_brk |
mm/mmap.c |
unsigned long |
- |
- |
- |
- |
46 |
sys_setgid |
kernel/sys.c |
gid_t |
- |
- |
- |
- |
47 |
sys_getgid |
kernel/sched.c |
- |
- |
- |
- |
- |
48 |
sys_signal |
kernel/signal.c |
int |
__sighandler_t |
- |
- |
- |
49 |
sys_geteuid |
kernel/sched.c |
- |
- |
- |
- |
- |
50 |
sys_getegid |
kernel/sched.c |
- |
- |
- |
- |
- |
51 |
sys_acct |
kernel/acct.c |
const char * |
- |
- |
- |
- |
52 |
sys_umount |
fs/super.c |
char * |
int |
- |
- |
- |
54 |
sys_ioctl |
fs/ioctl.c |
unsigned int |
unsigned int |
unsigned long |
- |
- |
55 |
sys_fcntl |
fs/fcntl.c |
unsigned int |
unsigned int |
unsigned long |
- |
- |
57 |
sys_setpgid |
kernel/sys.c |
pid_t |
pid_t |
- |
- |
- |
59 |
sys_olduname |
arch/i386/kernel/sys_i386.c |
struct oldold_utsname * |
- |
- |
- |
- |
60 |
sys_umask |
kernel/sys.c |
int |
- |
- |
- |
- |
61 |
sys_chroot |
fs/open.c |
const char * |
- |
- |
- |
- |
62 |
sys_ustat |
fs/super.c |
dev_t |
struct ustat * |
- |
- |
- |
63 |
sys_dup2 |
fs/fcntl.c |
unsigned int |
unsigned int |
- |
- |
- |
64 |
sys_getppid |
kernel/sched.c |
- |
- |
- |
- |
- |
65 |
sys_getpgrp |
kernel/sys.c |
- |
- |
- |
- |
- |
66 |
sys_setsid |
kernel/sys.c |
- |
- |
- |
- |
- |
67 |
sys_sigaction |
arch/i386/kernel/signal.c |
int |
const struct old_sigaction * |
struct old_sigaction * |
- |
- |
68 |
sys_sgetmask |
kernel/signal.c |
- |
- |
- |
- |
- |
69 |
sys_ssetmask |
kernel/signal.c |
int |
- |
- |
- |
- |
70 |
sys_setreuid |
kernel/sys.c |
uid_t |
uid_t |
- |
- |
- |
71 |
sys_setregid |
kernel/sys.c |
gid_t |
gid_t |
- |
- |
- |
72 |
sys_sigsuspend |
arch/i386/kernel/signal.c |
int |
int |
old_sigset_t |
- |
- |
73 |
sys_sigpending |
kernel/signal.c |
old_sigset_t * |
- |
- |
- |
- |
74 |
sys_sethostname |
kernel/sys.c |
char * |
int |
- |
- |
- |
75 |
sys_setrlimit |
kernel/sys.c |
unsigned int |
struct rlimit * |
- |
- |
- |
76 |
sys_getrlimit |
kernel/sys.c |
unsigned int |
struct rlimit * |
- |
- |
- |
77 |
sys_getrusage |
kernel/sys.c |
int |
struct rusage * |
- |
- |
- |
78 |
sys_gettimeofday |
kernel/time.c |
struct timeval * |
struct timezone * |
- |
- |
- |
79 |
sys_settimeofday |
kernel/time.c |
struct timeval * |
struct timezone * |
- |
- |
- |
80 |
sys_getgroups |
kernel/sys.c |
int |
gid_t * |
- |
- |
- |
81 |
sys_setgroups |
kernel/sys.c |
int |
gid_t * |
- |
- |
- |
82 |
old_select |
arch/i386/kernel/sys_i386.c |
struct sel_arg_struct * |
- |
- |
- |
- |
83 |
sys_symlink |
fs/namei.c |
const char * |
const char * |
- |
- |
- |
84 |
sys_lstat |
fs/stat.c |
char * |
struct __old_kernel_stat * |
- |
- |
- |
85 |
sys_readlink |
fs/stat.c |
const char * |
char * |
int |
- |
- |
86 |
sys_uselib |
fs/exec.c |
const char * |
- |
- |
- |
- |
87 |
sys_swapon |
mm/swapfile.c |
const char * |
int |
- |
- |
- |
88 |
sys_reboot |
kernel/sys.c |
int |
int |
int |
void * |
- |
89 |
old_readdir |
fs/readdir.c |
unsigned int |
void * |
unsigned int |
- |
- |
90 |
old_mmap |
arch/i386/kernel/sys_i386.c |
struct mmap_arg_struct * |
- |
- |
- |
- |
91 |
sys_munmap |
mm/mmap.c |
unsigned long |
size_t |
- |
- |
- |
92 |
sys_truncate |
fs/open.c |
const char * |
unsigned long |
- |
- |
- |
93 |
sys_ftruncate |
fs/open.c |
unsigned int |
unsigned long |
- |
- |
- |
94 |
sys_fchmod |
fs/open.c |
unsigned int |
mode_t |
- |
- |
- |
95 |
sys_fchown |
fs/open.c |
unsigned int |
uid_t |
gid_t |
- |
- |
96 |
sys_getpriority |
kernel/sys.c |
int |
int |
- |
- |
- |
97 |
sys_setpriority |
kernel/sys.c |
int |
int |
int |
- |
- |
99 |
sys_statfs |
fs/open.c |
const char * |
struct statfs * |
- |
- |
- |
100 |
sys_fstatfs |
fs/open.c |
unsigned int |
struct statfs * |
- |
- |
- |
101 |
sys_ioperm |
arch/i386/kernel/ioport.c |
unsigned long |
unsigned long |
int |
- |
- |
102 |
sys_socketcall |
net/socket.c |
int |
unsigned long * |
- |
- |
- |
103 |
sys_syslog |
kernel/printk.c |
int |
char * |
int |
- |
- |
104 |
sys_setitimer |
kernel/itimer.c |
int |
struct itimerval * |
struct itimerval * |
- |
- |
105 |
sys_getitimer |
kernel/itimer.c |
int |
struct itimerval * |
- |
- |
- |
106 |
sys_newstat |
fs/stat.c |
char * |
struct stat * |
- |
- |
- |
107 |
sys_newlstat |
fs/stat.c |
char * |
struct stat * |
- |
- |
- |
108 |
sys_newfstat |
fs/stat.c |
unsigned int |
struct stat * |
- |
- |
- |
109 |
sys_uname |
arch/i386/kernel/sys_i386.c |
struct old_utsname * |
- |
- |
- |
- |
110 |
sys_iopl |
arch/i386/kernel/ioport.c |
unsigned long |
- |
- |
- |
- |
111 |
sys_vhangup |
fs/open.c |
- |
- |
- |
- |
- |
112 |
sys_idle |
arch/i386/kernel/process.c |
- |
- |
- |
- |
- |
113 |
sys_vm86old |
arch/i386/kernel/vm86.c |
unsigned long |
struct vm86plus_struct * |
- |
- |
- |
114 |
sys_wait4 |
kernel/exit.c |
pid_t |
unsigned long * |
int options |
struct rusage * |
- |
115 |
sys_swapoff |
mm/swapfile.c |
const char * |
- |
- |
- |
- |
116 |
sys_sysinfo |
kernel/info.c |
struct sysinfo * |
- |
- |
- |
- |
117 |
sys_ipc (*Note) |
arch/i386/kernel/sys_i386.c |
uint |
int |
int |
int |
void * |
118 |
sys_fsync |
fs/buffer.c |
unsigned int |
- |
- |
- |
- |
119 |
sys_sigreturn |
arch/i386/kernel/signal.c |
unsigned long |
- |
- |
- |
- |
120 |
sys_clone |
arch/i386/kernel/process.c |
struct pt_regs |
- |
- |
- |
- |
121 |
sys_setdomainname |
kernel/sys.c |
char * |
int |
- |
- |
- |
122 |
sys_newuname |
kernel/sys.c |
struct new_utsname * |
- |
- |
- |
- |
123 |
sys_modify_ldt |
arch/i386/kernel/ldt.c |
int |
void * |
unsigned long |
- |
- |
124 |
sys_adjtimex |
kernel/time.c |
struct timex * |
- |
- |
- |
- |
125 |
sys_mprotect |
mm/mprotect.c |
unsigned long |
size_t |
unsigned long |
- |
- |
126 |
sys_sigprocmask |
kernel/signal.c |
int |
old_sigset_t * |
old_sigset_t * |
- |
- |
127 |
sys_create_module |
kernel/module.c |
const char * |
size_t |
- |
- |
- |
128 |
sys_init_module |
kernel/module.c |
const char * |
struct module * |
- |
- |
- |
129 |
sys_delete_module |
kernel/module.c |
const char * |
- |
- |
- |
- |
130 |
sys_get_kernel_syms |
kernel/module.c |
struct kernel_sym * |
- |
- |
- |
- |
131 |
sys_quotactl |
fs/dquot.c |
int |
const char * |
int |
caddr_t |
- |
132 |
sys_getpgid |
kernel/sys.c |
pid_t |
- |
- |
- |
- |
133 |
sys_fchdir |
fs/open.c |
unsigned int |
- |
- |
- |
- |
134 |
sys_bdflush |
fs/buffer.c |
int |
long |
- |
- |
- |
135 |
sys_sysfs |
fs/super.c |
int |
unsigned long |
unsigned long |
- |
- |
136 |
sys_personality |
kernel/exec_domain.c |
unsigned long |
- |
- |
- |
- |
138 |
sys_setfsuid |
kernel/sys.c |
uid_t |
- |
- |
- |
- |
139 |
sys_setfsgid |
kernel/sys.c |
gid_t |
- |
- |
- |
- |
140 |
sys_llseek |
fs/read_write.c |
unsigned int |
unsigned long |
unsigned long |
loff_t * |
unsigned int |
141 |
sys_getdents |
fs/readdir.c |
unsigned int |
void * |
unsigned int |
- |
- |
142 |
sys_select |
fs/select.c |
int |
fd_set * |
fd_set * |
fd_set * |
struct timeval * |
143 |
sys_flock |
fs/locks.c |
unsigned int |
unsigned int |
- |
- |
- |
144 |
sys_msync |
mm/filemap.c |
unsigned long |
size_t |
int |
- |
- |
145 |
sys_readv |
fs/read_write.c |
unsigned long |
const struct iovec * |
unsigned long |
- |
- |
146 |
sys_writev |
fs/read_write.c |
unsigned long |
const struct iovec * |
unsigned long |
- |
- |
147 |
sys_getsid |
kernel/sys.c |
pid_t |
- |
- |
- |
- |
148 |
sys_fdatasync |
fs/buffer.c |
unsigned int |
- |
- |
- |
- |
149 |
sys_sysctl |
kernel/sysctl.c |
struct __sysctl_args * |
- |
- |
- |
- |
150 |
sys_mlock |
mm/mlock.c |
unsigned long |
size_t |
- |
- |
- |
151 |
sys_munlock |
mm/mlock.c |
unsigned long |
size_t |
- |
- |
- |
152 |
sys_mlockall |
mm/mlock.c |
int |
- |
- |
- |
- |
153 |
sys_munlockall |
mm/mlock.c |
- |
- |
- |
- |
- |
154 |
sys_sched_setparam |
kernel/sched.c |
pid_t |
struct sched_param * |
- |
- |
- |
155 |
sys_sched_getparam |
kernel/sched.c |
pid_t |
struct sched_param * |
- |
- |
- |
156 |
sys_sched_setscheduler |
kernel/sched.c |
pid_t |
int |
struct sched_param * |
- |
- |
157 |
sys_sched_getscheduler |
kernel/sched.c |
pid_t |
- |
- |
- |
- |
158 |
sys_sched_yield |
kernel/sched.c |
- |
- |
- |
- |
- |
159 |
sys_sched_get_priority_max |
kernel/sched.c |
int |
- |
- |
- |
- |
160 |
sys_sched_get_priority_min |
kernel/sched.c |
int |
- |
- |
- |
- |
161 |
sys_sched_rr_get_interval |
kernel/sched.c |
pid_t |
struct timespec * |
- |
- |
- |
162 |
sys_nanosleep |
kernel/sched.c |
struct timespec * |
struct timespec * |
- |
- |
- |
163 |
sys_mremap |
mm/mremap.c |
unsigned long |
unsigned long |
unsigned long |
unsigned long |
- |
164 |
sys_setresuid |
kernel/sys.c |
uid_t |
uid_t |
uid_t |
- |
- |
165 |
sys_getresuid |
kernel/sys.c |
uid_t * |
uid_t * |
uid_t * |
- |
- |
166 |
sys_vm86 |
arch/i386/kernel/vm86.c |
struct vm86_struct * |
- |
- |
- |
- |
167 |
sys_query_module |
kernel/module.c |
const char * |
int |
char * |
size_t |
size_t * |
168 |
sys_poll |
fs/select.c |
struct pollfd * |
unsigned int |
long |
- |
- |
169 |
sys_nfsservctl |
fs/filesystems.c |
int |
void * |
void * |
- |
- |
170 |
sys_setresgid |
kernel/sys.c |
gid_t |
gid_t |
gid_t |
- |
- |
171 |
sys_getresgid |
kernel/sys.c |
gid_t * |
gid_t * |
gid_t * |
- |
- |
172 |
sys_prctl |
kernel/sys.c |
int |
unsigned long |
unsigned long |
unsigned long |
unsigned long |
173 |
sys_rt_sigreturn |
arch/i386/kernel/signal.c |
unsigned long |
- |
- |
- |
- |
174 |
sys_rt_sigaction |
kernel/signal.c |
int |
const struct sigaction * |
struct sigaction * |
size_t |
- |
175 |
sys_rt_sigprocmask |
kernel/signal.c |
int |
sigset_t * |
sigset_t * |
size_t |
- |
176 |
sys_rt_sigpending |
kernel/signal.c |
sigset_t * |
size_t |
- |
- |
- |
177 |
sys_rt_sigtimedwait |
kernel/signal.c |
const sigset_t * |
siginfo_t * |
const struct timespec * |
size_t |
- |
178 |
sys_rt_sigqueueinfo |
kernel/signal.c |
int |
int |
siginfo_t * |
- |
- |
179 |
sys_rt_sigsuspend |
arch/i386/kernel/signal.c |
sigset_t * |
size_t |
- |
- |
- |
180 |
sys_pread |
fs/read_write.c |
unsigned int |
char * |
size_t |
loff_t |
- |
181 |
sys_pwrite |
fs/read_write.c |
unsigned int |
const char * |
size_t |
loff_t |
- |
182 |
sys_chown |
fs/open.c |
const char * |
uid_t |
gid_t |
- |
- |
183 |
sys_getcwd |
fs/dcache.c |
char * |
unsigned long |
- |
- |
- |
184 |
sys_capget |
kernel/capability.c |
cap_user_header_t |
cap_user_data_t |
- |
- |
- |
185 |
sys_capset |
kernel/capability.c |
cap_user_header_t |
const cap_user_data_t |
- |
- |
- |
186 |
sys_sigaltstack |
arch/i386/kernel/signal.c |
const stack_t * |
stack_t * |
- |
- |
- |
187 |
sys_sendfile |
mm/filemap.c |
int |
int |
off_t * |
size_t |
- |
190 |
sys_vfork |
arch/i386/kernel/process.c |
struct pt_regs |
- |
- |
- |
- |