Niveau:3
En informatique, un appel système (en anglais, system call, abrégé en syscall) est une fonction primitive fournie par le noyau d’un système d’exploitation et utilisée par les programmes s’exécutant dans l’espace utilisateur (en d’autres termes, tous les processus distincts du noyau). Ce système permet de contrôler de façon sécurisée les applications dans l’espace utilisateur.
Le rôle du noyau est de gérer les ressources matérielles (il contient des pilotes de périphériques) et de fournir aux programmes une interface uniforme pour l’accès à ces ressources.
Nous allons voir l’utilisation des ressources syscall en assembleur avec le Raspberry.
L’appel à la fonction se fait via une interruption software. Plus précisément swi #0.
Les registres permettent de passer les arguments et de transmettre les informations de retour:
Registre | Fonction |
---|---|
R7 | Numéros de la fonction. |
R0 | Paramètre 1 de la fonction |
R1 | Paramètre 2 de la fonction |
R2 | Paramètre 3 de la fonction |
R3 | Paramètre 4 de la fonction |
R4 | Paramètre 5 de la fonction |
R0 | Valeur de retour ou code erreur |
Voici le Tableau des Fonctions:
R7 |
Nom |
Source |
R0 |
R1 |
R2 |
R3 |
R4 |
---|---|---|---|---|---|---|---|
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 |
structoldold_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 |
conststruct old_sigaction * |
structold_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 |
structmmap_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 |
structvm86plus_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 |
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 |
structsched_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 * |
conststruct 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 |
– |
– |
– |
– |