106 lines
3.8 KiB
Markdown
106 lines
3.8 KiB
Markdown
---
|
|
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
|