SYSTÈMES D’EXPLOITATION 2
Module 3
Mondher Bouden
Maître assistant
Semestre 2
2023-2024
Interruption
2
Interruption
n
• Déroutement du fil d’exécution
en cours
– division par zéro,
– débuggeur
– instruction invalide,
– erreur mémoire (segmentation
fault),
– temporisateur (timer),
– entrée/sortie,
– définissable
Liste des interrupts
– etc.. pour IA-32 3
CPU
Interrupt Description Table
• Architecture Intel x86
tableau
vecteurs
(mémoire)
4
Interrupt Description Table (IDT)
• Contient les adresses (vecteurs) des routines à
exécuter pour chaque type d’interruption
fait parti du
noyau (kernel)
• Changement du niveau de privilège va s’effectuer
5
USS Yorktown (CG-48)
• Un des premiers Smart Ship de la US Navy
• Basé sur Windows NT (au lieu de UNIX)
• Le 21 septembre 1997…
6
USS Yorktown (CG-48)
• Un des premiers Smart Ship de la US Navy
• Basé sur Windows NT (au lieu de UNIX)
• Le 21 septembre 1997, un opérateur entre un 0
par erreur → division par zéro
• Paralysé pendant plusieurs heures
0 7
Impact des Interruptions
sur les registres
8
Interruption et registres
Privilège
mémoire
utilisateur (3)
A=?
Registre EIP Registre EAX
---- ---- -
code du processus code de l’interrupt
int A; 00000A45 mov eax,666
A = 3; ...
001F138E mov dword ptr [A],3
A = A + 4;
001F1395 mov eax,dword ptr [A] table des interruptions
001F1398 add eax,4 numéro adresse
001F139B mov dword ptr [A],eax 0x44 0x00000A45
pile ESP pile
noyau utilisateur 9
Interruption et registres
Privilège
action CPU: charge instruction mémoire
utilisateur (3)
A=?
Registre EIP Registre EAX
0x001F138E- ---- -
code du processus code de l’interrupt
int A; 00000A45 mov eax,666
A = 3; ...
001F138E mov dword ptr [A],3
A = A + 4;
001F1395 mov eax,dword ptr [A] table des interruptions
001F1398 add eax,4 numéro adresse
001F139B mov dword ptr [A],eax 0x44 0x00000A45
pile ESP pile
noyau utilisateur 10
Interruption et registres
Privilège
action CPU: exécute instruction mémoire
utilisateur (3)
A=3
Registre EIP Registre EAX
0x001F138E- ---- -
code du processus code de l’interrupt
int A; 00000A45 mov eax,666
A = 3; ...
001F138E mov dword ptr [A],3
A = A + 4;
001F1395 mov eax,dword ptr [A] table des interruptions
001F1398 add eax,4 numéro adresse
001F139B mov dword ptr [A],eax 0x44 0x00000A45
pile ESP pile
noyau utilisateur 11
Interruption et registres
Privilège
action CPU: charge instruction mémoire
utilisateur (3)
A=3
Registre EIP Registre EAX
0x001F1395- ---- -
code du processus code de l’interrupt
int A; 00000A45 mov eax,666
A = 3; ...
001F138E mov dword ptr [A],3
A = A + 4;
001F1395 mov eax,dword ptr [A] table des interruptions
001F1398 add eax,4 numéro adresse
001F139B mov dword ptr [A],eax 0x44 0x00000A45
pile ESP pile
noyau utilisateur 12
Interruption et registres
Privilège
action CPU: exécute instruction mémoire
utilisateur (3)
A=3
Registre EIP Registre EAX
0x001F1395- 3 -
code du processus code de l’interrupt
int A; 00000A45 mov eax,666
A = 3; ...
001F138E mov dword ptr [A],3
A = A + 4;
001F1395 mov eax,dword ptr [A] table des interruptions
001F1398 add eax,4 numéro adresse
001F139B mov dword ptr [A],eax 0x44 0x00000A45
pile ESP pile
noyau utilisateur 13
Interruption et registres
Privilège
action CPU: charge instruction mémoire
utilisateur (3)
A=3
Registre EIP Registre EAX
0x001F1398- 3 -
code du processus code de l’interrupt
int A; 00000A45 mov eax,666
A = 3; ...
001F138E mov dword ptr [A],3
A = A + 4;
001F1395 mov eax,dword ptr [A] table des interruptions
001F1398 add eax,4 numéro adresse
001F139B mov dword ptr [A],eax 0x44 0x00000A45
pile ESP pile
noyau utilisateur 14
Interruption et registres
Privilège
action CPU: exécute instruction mémoire
utilisateur (3)
A=3
Registre EIP Registre EAX
0x001F1398- 7 -
code du processus code de l’interrupt
int A; 00000A45 mov eax,666
A = 3; ...
001F138E mov dword ptr [A],3
A = A + 4;
001F1395 mov eax,dword ptr [A] table des interruptions
001F1398 add eax,4 numéro adresse
001F139B mov dword ptr [A],eax 0x44 0x00000A45
pile ESP pile
noyau utilisateur 15
Interruption et registres
Privilège
action CPU: interruption 0x44 mémoire
utilisateur (3)
A=3
Registre EIP Registre EAX
0x001F1398- 7 -
code du processus code de l’interrupt
INTERRUPTION 0x44!
int A; 00000A45 mov eax,666
A = 3; ...
001F138E mov dword ptr [A],3
A = A + 4;
001F1395 mov eax,dword ptr [A] table des interruptions
001F1398 add eax,4 code adresse
001F139B mov dword ptr [A],eax 0x44 0x00000A45
pile ESP pile
IFT-2001 Systèmes d'exploitation noyau utilisateur 16
Interruption et registres
Privilège
action CPU: interruption 0x44 mémoire
utilisateur (3)
A=3
Registre EIP Registre EAX
0x001F1398- 7 -
code du processus code de l’interrupt
INTERRUPTION 0x44!
int A; 00000A45 mov eax,666
• CPU consulte
A = 3; la table des
001F138E mov dword ptr [A],3
...
interruptions
A = A +IDT
4;
001F1395 mov eax,dword ptr [A] table des interruptions
001F1398 add eax,4 numéro adresse
001F139B mov dword ptr [A],eax 0x44 0x00000A45
17
Interruption et registres
Privilège
action CPU: interruption 0x44 mémoire
noyau (0)
A=3
Registre EIP Registre EAX
0x001F1398- 7 -
code du processus code de l’interrupt
INTERRUPTION 0x44!
int A; 00000A45 mov eax,666
• CPU consulte
A = 3; la table des
001F138E mov dword ptr [A],3
...
interruptions
A = A +IDT
4;
table des interruptions
• Change niveau privilège vers
001F1395 mov eax,dword ptr [A]
001F1398 add eax,4 numéro adresse
noyau (0) etmov
001F139B piledword
versptr
noyau
[A],eax 0x44 0x00000A45
pile ESP pile
noyau utilisateur 18
Interruption et registres
charge adresse Privilège
action CPU: mémoire
interrupt 0x44 noyau (0)
A=3
Registre EIP Registre EAX
0x00000A45- 7 -
code du processus code de l’interrupt
int A; 00000A45 mov eax,666
A = 3; ...
001F138E mov dword ptr [A],3
A = A + 4;
001F1395 mov eax,dword ptr [A] table des interruptions
001F1398 add eax,4 numéro adresse
001F139B mov dword ptr [A],eax 0x44 0x00000A45
pile ESP pile
noyau utilisateur 19
Interruption et registres
Privilège
action CPU: charge instruction mémoire
noyau (0)
A=3
Registre EIP Registre EAX
0x00000A45- 7 -
code du processus code de l’interrupt
int A; 00000A45 mov eax,666
A = 3; ...
001F138E mov dword ptr [A],3
A = A + 4;
001F1395 mov eax,dword ptr [A] table des interruptions
001F1398 add eax,4 numéro adresse
001F139B mov dword ptr [A],eax 0x44 0x00000A45
pile ESP pile
noyau utilisateur 20
Interruption et registres
Privilège
action CPU: exécute instruction mémoire
noyau (0)
A=3
Registre EIP Registre EAX
0x00000A45- 666 -
écrase la valeur
code du processus code de l’interrupt
int A; 00000A45 mov eax,666
A = 3; ...
001F138E mov dword ptr [A],3
A = A + 4;
001F1395 mov eax,dword ptr [A] table des interruptions
001F1398 add eax,4 numéro adresse
001F139B mov dword ptr [A],eax 0x44 0x00000A45
pile ESP pile
noyau utilisateur 21
Interruption et registres
Privilège
action CPU: continue… mémoire
noyau (0)
A=3
Registre EIP Registre EAX
0x00000A45- 666 -
code du processus code de l’interrupt
int A; 00000A45 mov eax,666
A = 3; ...
001F138E mov dword ptr [A],3
A = A + 4;
001F1395 mov eax,dword ptr [A] table des interruptions
001F1398 add eax,4 numéro adresse
001F139B mov dword ptr [A],eax 0x44 0x00000A45
pile ESP pile
noyau utilisateur 22
Interruption et registres
Privilège
action CPU: continue… mémoire
noyau (0)
A=3
Registre EIP Registre EAX
0x00000A45- 666 -
code du processus code de l’interrupt
int A; 00000A45 mov eax,666
retour
dwordde
ptr l’interruption
A = 3; ...
001F138E mov [A],3
A = A + 4;
001F1395 mov eax,dword ptr [A] table des interruptions
001F1398 add eax,4 numéro adresse
001F139B mov dword ptr [A],eax 0x44 0x00000A45
pile ESP pile
noyau utilisateur 23
Interruption et registres
Privilège
restaurer le registre mémoire
action CPU: noyau (0)
de pointeur de pile A=3
Registre EIP Registre EAX
0x00000A45- 666 -
code du processus code de l’interrupt
int A; 00000A45 mov eax,666
A = 3; ...
001F138E mov dword ptr [A],3
A = A + 4;
001F1395 mov eax,dword ptr [A] table des interruptions
001F1398 add eax,4 numéro adresse
001F139B mov dword ptr [A],eax 0x44 0x00000A45
pile ESP pile
noyau utilisateur 24
Interruption et registres
Privilège
action CPU: restaurer EIP mémoire
noyau (0)
A=3
Registre EIP Registre EAX
0x001F139B- 666 -
code du processus code de l’interrupt
int A; 00000A45 mov eax,666
A = 3; ...
001F138E mov dword ptr [A],3
A = A + 4;
001F1395 mov eax,dword ptr [A] table des interruptions
001F1398 add eax,4 numéro adresse
001F139B mov dword ptr [A],eax 0x44 0x00000A45
pile ESP pile
noyau utilisateur 25
Interruption et registres
Privilège
action CPU: retour au privilège utilisateur (3)
mémoire
utilisateur A=3
Registre EIP Registre EAX
0x001F139B- 666 -
code du processus code de l’interrupt
int A; 00000A45 mov eax,666
A = 3; ...
001F138E mov dword ptr [A],3
A = A + 4;
001F1395 mov eax,dword ptr [A] table des interruptions
001F1398 add eax,4 numéro adresse
001F139B mov dword ptr [A],eax 0x44 0x00000A45
pile ESP pile
noyau utilisateur 26
Interruption et registres
Privilège
action CPU: charge instruction mémoire
utilisateur (3)
A=3
Registre EIP Registre EAX
0x001F139B- 666 -
code du processus code de l’interrupt
int A; 00000A45 mov eax,666
A = 3; ...
001F138E mov dword ptr [A],3
A = A + 4;
001F1395 mov eax,dword ptr [A] table des interruptions
001F1398 add eax,4 numéro adresse
001F139B mov dword ptr [A],eax 0x44 0x00000A45
pile ESP pile
noyau utilisateur 27
Interruption et registres
Privilège
action CPU: exécute instruction mémoire
utilisateur (3)
A=666
Registre EIP Registre EAX
0x001F139B- 666 -
code du processus code de l’interrupt
int A; 00000A45 mov eax,666
A = 3; ...
001F138E mov dword ptr [A],3
A = A + 4;
001F1395 mov eax,dword ptr [A] table des interruptions
001F1398 add eax,4 numéro adresse
001F139B mov dword ptr [A],eax 0x44 0x00000A45
pile ESP pile
noyau utilisateur 28
Interruption et registres
Privilège
action CPU: exécute instruction mémoire
utilisateur (3)
A=666
Registre EIP Registre EAX réponse attendue
0x001F139B- 666 est A=7!!!
-
code du processus code de l’interrupt
int A; 00000A45 mov eax,666
A = 3; ...
001F138E mov dword ptr [A],3
A = A + 4;
001F1395 mov eax,dword ptr [A] table des interruptions
001F1398 add eax,4 numéro adresse
001F139B mov dword ptr [A],eax 0x44 0x00000A45
d’où l’importance de pile ESP pile
préserver
IFT-2001le contexte!
Systèmes d'exploitation noyau utilisateur 29
Contexte du processeur
• Une photo instantanée de l’état du CPU (registres)
30
Processus
31
Processus : définition
• Une instance de programme qui s’exécute
• Processus comprend :
– Séries d’instructions (code compilé ou texte → .exe)
– Contexte (valeurs dans les registres du CPU)
– Espace d’adressage : mémoire, pile(s)
– Ressources utilisées (fichiers ouverts, réseau, port sériel)
– etc.
32
Systèmes d’exploitation : gestion des processus
• Une des tâches principales du S.E.
• Transforme un CPU en plusieurs CPU apparents
– multitâches / multiprogrammation
• Essentiel aux S.E. modernes, car de nombreux
processus sont lancés :
– vérifier courriel
– antivirus
– mise-à-jour
– agenda/calendrier
– Firefox
33
Illustration d’un processus
Espace d’adressage
virtuel
Adresse basse
Registres SP do_one_thing() i Pile (stack)
PC j
GP0 k
GP1 main()
... main()
Texte (instructions)
do_one_thing()
Identité PID
do_another_thing()
UID
GID
... r1 Données
r2
Ressources Fichiers ouverts Tas (heap)
Verrous
Sockets
Adresse haute
...
34
3 états possibles d’un processus
provoqué par ordonnanceur:
le processus n’est pas
informé
appel sur
E/S lecture disque /
attend sur clavier
ordonnanceur : partie du système d’exploitation
responsable de choisir le processus à exécuter
35
Quand crée-t-on un processus?
• 4 événements
– 1 : initialisation du système (processus init)
– 2 : exécution d’un appel système de création de
processus par un processus en cours
– 3 : requête d’utilisateur (GUI/shell)
– 4 : lancement de travail en lot
• pour les mainframes/Super-ordinateur colosse
36
Démarrage : bootstrapping
• De l’expression anglaise « to pull yourself up by
your bootstraps»
Baron de Münchhausen
37
Processus créés au démarrage
• Arrière-plan (pas d’emprise sur clavier/écran)
• appelé daemon sur UNIX
– web server
– impression
• appelé services sur Windows
– tapez Services.msc dans un shell DOS
38
daemon sur UNIX
nom qui se
termine
avec lettre d
39
services sur Windows
40
Création de processus UNIX/Linux : fork()
• Objectif : création rapide de processus
• Dupliquer le processus en cours
– copie d’une bonne partie du PCB
• mais attribuer un PID différent
– « copie » de la mémoire
• fork() retourne
–0 pour le processus enfant
– PID de l’enfant pour le parent
41
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
main ( int argc, char *argv[ ] ) {
int LePid;
LePid=fork();
if (LePid==0) { /* fils */
printf(“je suis le fils %d\n”,getpid());
sleep(10); exit();
}
else { /* le parent seulement */
printf(“je suis le père %d\n”,getpid());
wait(0);
}
}
écran
PID = 34
LePid=?
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
main ( int argc, char *argv[ ] ) {
int LePid;
LePid=fork();
if (LePid==0) { /* fils */
printf(“je suis le fils %d\n”,getpid());
sleep(10); exit();
}
else { /* le parent seulement */
printf(“je suis le père %d\n”,getpid());
wait(0);
}
}
écran
PID = 34
LePid=?
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
main ( int argc, char *argv[ ] ) {
2 processus! int LePid;
LePid=fork();
if (LePid==0) { /* fils */
printf(“je suis le fils %d\n”,getpid());
sleep(10); exit();
}
else { /* le parent seulement */
printf(“je suis le père %d\n”,getpid());
wait(0);
}
}
Deux espaces d’adressage
écran PID = 35
PID = 34
LePid=? LePid=?
#include <unistd.h> Ordonnanceur choisit le
#include <sys/types.h>
#include <sys/wait.h> processus enfant pour
main ( int argc, char *argv[ ] ) { l’exécution en premier
int LePid;
LePid=fork();
if (LePid==0) { /* fils */
printf(“je suis le fils %d\n”,getpid());
sleep(10); exit();
}
else { /* le parent seulement */
printf(“je suis le père %d\n”,getpid());
wait(0);
}
}
Deux espaces d’adressage
écran PID = 35
PID = 34
LePid=? LePid=0
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
main ( int argc, char *argv[ ] ) {
int LePid;
LePid=fork();
if (LePid==0) { /* fils */
printf(“je suis le fils %d\n”,getpid());
sleep(10); exit();
}
else { /* le parent seulement */
printf(“je suis le père %d\n”,getpid());
wait(0);
}
}
écran PID = 35
PID = 34 je suis le fils 35
LePid=? LePid=0
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
main ( int argc, char *argv[ ] ) {
int LePid;
LePid=fork();
if (LePid==0) { /* fils */
printf(“je suis le fils %d\n”,getpid());
sleep(10); exit();
}
else { /* le parent seulement */
printf(“je suis le père %d\n”,getpid());
wait(0);
}
}
écran PID = 35
PID = 34 je suis le fils 35
LePid=35 LePid=0
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
main ( int argc, char *argv[ ] ) {
int LePid;
LePid=fork();
if (LePid==0) { /* fils */
printf(“je suis le fils %d\n”,getpid());
sleep(10); exit();
}
else { /* le parent seulement */
printf(“je suis le père %d\n”,getpid());
wait(0);
}
}
écran PID = 35
PID = 34 je suis le fils 35
je suis le père 34
LePid=35 LePid=0
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
main ( int argc, char *argv[ ] ) {
int LePid;
LePid=fork();
if (LePid==0) { /* fils */
printf(“je suis le fils %d\n”,getpid());
sleep(10); exit();
}
else { /* le parent seulement */
printf(“je suis le père %d\n”,getpid());
wait(0);
}
}
écran PID = 35
PID = 34 je suis le fils 35
je suis le père 34
LePid=35 LePid=0
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
main ( int argc, char *argv[ ] ) {
int LePid;
LePid=fork();
if (LePid==0) { /* fils */
printf(“je suis le fils %d\n”,getpid());
sleep(10); exit();
}
else { /* le parent seulement */
printf(“je suis le père %d\n”,getpid());
wait(0);
}
}
écran
PID = 34 je suis le fils 35
je suis le père 34
LePid=35
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
main ( int argc, char *argv[ ] ) {
int LePid;
LePid=fork();
if (LePid==0) { /* fils */
printf(“je suis le fils %d\n”,getpid());
sleep(10); exit();
}
else { /* le parent seulement */
printf(“je suis le père %d\n”,getpid());
wait(0);
}
}
écran
je suis le fils 35
je suis le père 34
#include <unistd.h>
#include <sys/types.h> Note : les valeurs des
#include <sys/wait.h> données avant le
main ( int argc, char *argv[ ] ) { fork seront copiées
int LePid; int Toto = 3;
LePid=fork(); et identiques
if (LePid==0) { /* fils */
printf(“je suis le fils %d\n”,getpid());
sleep(10); exit();
}
else { /* le parent seulement */
printf(“je suis le père %d\n”,getpid());
wait(0);
}
}
Deux espaces d’adressage
écran PID = 35
PID = 34
LePid=35 LePid=0
Toto=3 Toto=3
#include <unistd.h>
#include <sys/types.h> Note : les données
#include <sys/wait.h> sont indépendantes
main ( int argc, char *argv[ ] ) { entre les processus
int LePid; int Toto = 3;
LePid=fork();
if (LePid==0) { /* fils */
Toto = 999;
sleep(10); exit();
}
else { /* le parent seulement */
printf(“je suis le père %d\n”,getpid());
wait(0);
}
}
Deux espaces d’adressage
écran PID = 35
PID = 34
LePid=35 LePid=0
Toto=3 Toto=999
Différence fondamentale UNIX vs Win32
• Avec UNIX, fork()
– une copie conforme du processus en mémoire
– relation parent-enfant
• Avec Win32 CreateProcess(), le nouveau
processus n’a pas de relation avec le processus
créateur
54
Fin d’un processus
• 4 motifs d’arrêt
– 1 : arrêt normal (volontaire)
• fin du traitement (exit (UNIX) / ExitProcess (Windows))
– 2 : arrêt pour erreur (volontaire)
• mauvais nom de fichier
– 3 : arrêt pour erreur fatale (involontaire)
• segmentation fault (accès mémoire interdit)
– 4 : arrêt par autre processus (involontaire)
• kill (UNIX) / TerminateProcess (Windows)
55