Imaginez que vous êtes à un grand concert. Pour passer de la zone du public général aux coulisses exclusives, vous ne pouvez pas simplement marcher. Vous avez besoin d'un laissez-passer spécial qui vous donne accès par une porte spécifique et gardée. Dans le monde de l'informatique, les appels système (system calls) sont ces laissez-passer spéciaux.
Que sont les appels système ?
Les appels système, souvent abrégés en syscalls, fournissent un moyen aux processus en espace utilisateur de demander des services directement au noyau. Le noyau expose un ensemble de services via l'API des appels système. Ces services sont essentiels pour des opérations telles que la lecture ou l'écriture dans un fichier, la gestion de la mémoire ou le traitement des connexions réseau. Le nombre d'appels système disponibles est fixe ; vous ne pouvez pas en ajouter de nouveaux arbitrairement. Votre système maintient une table d'appels système (syscall table) où chaque appel système est enregistré avec un ID unique.
Le mécanisme d'appel système sous Linux
Lorsque vous exécutez un programme comme ls, le code qu'il contient n'exécute pas directement la commande system call linux. Au lieu de cela, il utilise une fonction de bibliothèque, qui agit comme un enveloppeur (wrapper). Cette fonction enveloppe prépare les paramètres nécessaires, puis déclenche une interruption logicielle, ou un « piège » (trap).
Ce piège signale au processeur de passer du mode utilisateur non privilégié au mode noyau privilégié. Une fois en mode noyau, un gestionnaire d'appel système prend le relais. Il utilise l'ID unique pour rechercher la fonction demandée dans la table d'appels système et l'exécute. Par exemple, l'appel système stat(), utilisé pour interroger l'état d'un fichier, est trouvé et exécuté de cette manière. Une fois que le noyau a terminé la tâche, il bascule le contexte en mode utilisateur et renvoie un code d'état à votre processus, indiquant le succès ou une erreur.
Visualiser les appels système avec strace
Vous pouvez observer les appels système effectués par un processus en temps réel à l'aide de la commande strace. Cet outil est incroyablement utile pour le débogage et pour comprendre comment un programme interagit avec le noyau.
Pour voir les appels système effectués par la commande ls, vous exécuteriez :
strace ls
Ceci affichera une liste détaillée de chaque appel système effectué par ls lors de son exécution.