0% ont trouvé ce document utile (0 vote)
21 vues55 pages

Module 3

Le document décrit le fonctionnement des interruptions dans les systèmes d'exploitation, notamment le changement de contexte lors d'une interruption avec le passage du niveau de privilège utilisateur au niveau noyau, et l'impact sur les registres du processeur comme EIP et EAX.

Transféré par

Ons Zaghbouni
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
21 vues55 pages

Module 3

Le document décrit le fonctionnement des interruptions dans les systèmes d'exploitation, notamment le changement de contexte lors d'une interruption avec le passage du niveau de privilège utilisateur au niveau noyau, et l'impact sur les registres du processeur comme EIP et EAX.

Transféré par

Ons Zaghbouni
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

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

Vous aimerez peut-être aussi