Linux sys call table
The following table lists the system calls for the Linux 2.2 kernel. It could also be thought of as an API for the interface between user space and kernel space. My motivation for making this table was to make programming in assembly language easier when using only system calls and not the C library (for more information on this topic, go to http://www.linuxassembly.org). On the left are the numbers of the system calls. This number will be put in register %eax. On the right of the table are the types of values to be put into the remaining registers before calling the software interrupt ‘int 0x80’. After each syscall, an integer is returned in %eax.
For convenience, the kernel source file where each system call is located is linked to in the column labelled «Source». In order to use the hyperlinks, you must first copy this page to your own machine because the links take you directly to the source code on your system. You must have the kernel source installed (or linked from) under ‘/usr/src/linux’ for this to work.
%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 | — | — | — | — |
Note for sys_ipc (117): this syscall takes six arguments, so it can’t fit into the five registers %ebx — %edi; the last parameter (not shown) is of type ‘long’. This syscall requires a special call method where a pointer is put in %ebx which points to an array containing the six arguments.
I will now explain exactly where in the kernel source that I got the information in the table above. I do this because 1) changes in the source are bound to happen, 2) you might be curious, or 3) I might’ve made an error.
System Call Numbers
For the numbers of the syscalls, look in arch/i386/kernel/entry.S for sys_call_table. The syscall numbers are offsets into that table. Several spots in the table are occupied by the syscall sys_ni_syscall. This is a placeholder that either replaces an obsolete syscall or reserves a spot for future syscalls.
Incidentally, the system calls are called from the function system_call in the same file; in particular, they are called with the assembly instruction ‘call *SYMBOL_NAME(sys_call_table)(,%eax,4)’. The part ‘*SYMBOL_NAME(sys_call_table)’ just gets replaced by a symbol name in sys_call_table. SYMBOL_NAME is a macro defined in include/linux/linkage.h, and it just replaces itself with its argument.
Typedefs
Here are the typedef declarations in the prototypes above:
typedef struct siginfo int si_signo;
int si_errno;
int si_code;
union int _pad[SI_PAD_SIZE];
/* kill() */
struct pid_t _pid; /* sender’s pid */
uid_t _uid; /* sender’s uid */
> _kill;
/* POSIX.1b timers */
struct unsigned int _timer1;
unsigned int _timer2;
> _timer;
/* POSIX.1b signals */
struct pid_t _pid; /* sender’s pid */
uid_t _uid; /* sender’s uid */
sigval_t _sigval;
> _rt;
/* SIGCHLD */
struct pid_t _pid; /* which child */
uid_t _uid; /* sender’s uid */
int _status; /* exit code */
clock_t _utime;
clock_t _stime;
> _sigchld;
/* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
struct void *_addr; /* faulting insn/memory ref. */
> _sigfault;
Struct Declarations
Here are the struct declarations for the table at the top: