242 - exec et recouvrement de processus Flashcards
Principe du recouvrement de processus (demander à changer de programme exécuté)
- Vérifier l’existence et droits d’exécution
- Écraser le segment de code avec le nouvel exécutable * Écraser les données statiques
- Réinitialiser tas et pile
- Positionner correctement les registres
- Mettre à jour les données internes du SE
Autodestruction car…
- Pendant un recouvrement, code et données sont inutilisables
- À la fin il n’en reste rien
Autodestruction sans risque car…
- Tout est fait par le SE avec les données du SE
- Le code et les données du processus ne participent pas au
recouvrement (heureusement)
Appel système exec
int execve(const char *filename, char *argv[], char *envp[])
execl, execlp, execle, execv, execvp
* v : passage par vecteur (char *argv[])
* l : passage par liste (char *argv, …)
* p : utilisation de PATH pour trouver l’exécutable
* e : précision des variables d’environnement
perdues après un execve
Perdu : quelques trucs
* Segments mémoires (code, données statiques, tas, pile, etc.)
* Threads
* Gestionnaires de signaux…
conservé après un execve
Conservé : tout le reste
* Identité : pid, parent, etc.
* Caractéristiques : Utilisateur, droits, priorité, etc.
* Entrées sorties : répertoire courant, fichiers ouverts, etc.
* Statistiques : consommation ressources
Format des exécutables binaires
- ELF pour Unix
- PE pour Windows
- D’autres formats historiques ou +/- répandus existent
→ Un noyau pourrait connaitre plusieurs formats
Point d’entrée indique…
l’adresse de la première instruction machine du programme
ELF: Executable and Linking Format
ELF: Executable and Linking Format
* elf(5) pour le format
* objdump(1) ou readelf(1) pour afficher l’information
* nm(1) pour juste lister les symboles
Contenu des exécutables binaires
De l’information pour le système
* Quels blocs d’octets charger ?
* À quelle adresse dans la mémoire ? * Avec quels droits rwx ?
* Quelle est la taille du BSS ?
* Etc.
Et plein d’autres choses
* Pour l’éditeur de liens
* Pour l’éditeur de liens dynamiques * Pour le débogueur
* Etc.
Que se passe-t-il entre _start et main ?
Quoi faire entre _start et main ?
* Charger les bibliothèques (dont la libc!)
* Préparer des segments mémoires
* Instancier des objets globaux
→ Le processus est responsable
Symbole _start
- Sous Unix, c’est souvent le point d’entrée
- L’éditeur de liens décide
Comment forcer le start a une fct qui n’est pas main ?
gcc nostart.c -nostdlib -static -e debut
→ Pas portable, mais ça fonctionne
Interpréteurs de scripts (shebang #!)
Si un fichier est exécutable et commence par « #! » :
* Le système exécute le programme
* Avec le chemin du fichier en argument
→ Ça peut être n’importe quel programme
→ C’est automatique
Utilisation habituelle du shebang
Exécuter un programme dans un langage de script
* Exemple « #!/bin/bash »