--- title: "Programmation Système : Appels systèmes" date: 2018-09-04 tags: ["programmation", "système", "appels système"] categories: ["Programmation système", "Cours"] --- # Qu'est ce que c'est? C'est créer des programmes plutôt bas niveau qui s'interfacent avec le noyau et/ou les librairies du système. Il faut donc une bonne connaissance du fonctionnement du système et être en mesure d'identifier d'éventuels problèmes de performance. # Le système d'exploitation C'est un ensemble de logiciels fournissant les services nécessaires à l'exécution de programmes pour l'utilisateur final : - exécution de programmes - accès aux matériels - accès au(x) système(s) de fichier(s) - accès mémoire - accès réseau ## POSIX et IEEE La norme POSIX, standard IEEE, définie les interfaces utilisateurs et logiciels, la ligne de commande standard et son interface de scripts, les entrées / sorties de base. les attributs de fichiers (permissions) La norme SUS *Single Unix Specification* est une norme plus récente et moins contraignante. elle est basée sur les travaux de l'IEEE et de l'Open Group. [SUS][https://fr.wikipedia.org/wiki/Single_UNIX_Specification] et [POSIX][https://fr.wikipedia.org/wiki/POSIX] sur Wikipedia ## LSB LSB ou *Linux Standard Base* définie l'agencement général du système GNU / Linux : librairies standard, commandes POSIX étendues, hiérarchie du système de fichiers, les runlevels etc. [LSB](https://fr.wikipedia.org/wiki/Linux_Standard_Base) sur Wikipédia. ## Architecture des systèmes "modernes" Ils sont organisés en couches un peu à la façon du modèle OSI : 1. le matériel 2. l'assemblage (assembleur) 3. système (applications système) 4. Application 5. (couche N) Les applications / machines virtuelles (capables de traverser les couches pour atteindre le matériel) Plus la couche est basse, plus la programmation est efficace du point de vue des performances mais plus difficile est la portabilité (un code assembleurs et moins portable qu'un script Python) Les systèmes modernes possèdent deux espaces d'exécutions : - l'espace utilisateur `user-space` ou `user-land` - l'espace noyau `kernel-space` ou `kernel-land` # La libc La `libc` est la librairie standard des système GNU/ Linux, elle implémente les fonctionnalités de base pour la plupart des programmes. C'est une API pour accéder aux services du noyau : - entrées /sorties - allocation fine de la mémoire - gestion du temps - encapsulation des appels noyau et en dehors du noyau (user-land) # Programme et processus Un programme est un fichier exécutable stocké sur un disque (mémoire morte). Un processus et un programme mais en mémoire (et donc en cours d'exécution). Un processus est défini par son identifiant (PID) et accède à un espace d'adressage en mémoire vive (pour la pile, les données ...) # Descripteurs de fichiers Un descripteur de fichier pour *file descriptor* (abrégé *fd*) est un entier positif affecté par le noyau pour référencer un fichier utilisé par un processus. Il est bon de préciser que dans la philosophie Unix, tout est fichier, le *fd* se retrouve donc pour les fichiers, sockets, tubes, périphériques etc. # Les appels système Ils permettent de demander au noyau de réaliser une action précise et se font au travers de la libc. Voici comment cela se passe : - Préparer les arguments en les positionnant dans des registres spécifiques pour le noyau - placer le numéro d'appel système dans un registre spécifique invoquer - l'instruction `trap` qui bascule le processeur en mode noyau Le noyau invoque `system_call` après validation des arguments et retourne le résultat à la libc : - en cas d'erreur la libc invoque `errno` avec en résultat le code erreur - sinon le résultat