Systèmes d'exploitation - Introduction: shell, noyau, syscalls Guillaume Salagnac 2018-2019 - Plateforme pédagogique Moodle
←
→
Transcription du contenu de la page
Si votre navigateur ne rend pas la page correctement, lisez s'il vous plaît le contenu de la page ci-dessous
Systèmes d’exploitation Introduction: shell, noyau, syscalls Guillaume Salagnac Insa de Lyon – Informatique 2018–2019
IF-3-SYS : Systèmes d’Exploitation Équipe pédagogique • Antoine Boutet, Mohamed Maouche, Mihai Popescu, Guillaume Salagnac, Yohann Uguen Objectifs • Comprendre les «concepts clés» des systèmes d’exploitation • quel est le problème ? pourquoi se pose-t-il ? • quelle sont la/les solutions ? pourquoi ça marche ? • Pratiquer leur usage • TP de programmation C sous Linux (4×2h) • TD sur papier (4×2h) Ressources • http://moodle.insa-lyon.fr > Informatique > IF-3 • transparents de cours ; sujets de TD et de TP ; liens utiles 2/47
Plan du cours • Chap 1 Noyau, processus, appels système TP usage de fork(), exec(), waitpid() • Chap 2 Multitâche, temps partagé, ordonnancement TD ordonnancement de processus • Chap 3 Mémoire virtuelle, caches, isolation TP performances de la hiérarchie mémoire • Chap 4 Allocation dynamique Contrôle continu (30 min, coeff 1) début avril TP implémentation de malloc(), free() • Chap 5 Synchronisation, concurrence, sémaphores TD usage de sémaphores TP programmation avec pthreads • Chap 6 Stockage et systèmes de fichiers • TD révisions, questions/réponses, examen blanc Examen final (1h30, coeff 2) 11 juin 3/47
Vous avez dit «Système d’exploitation» ? OS Contiki e RT User Fr e Android s RIOT iOS ow ux Application nd Lin tu i / un W U Linux Operating System GNMacOS Ub Tiny Debian X Hardware OS 4/47
Quelques définitions Utilisateur = l’humain devant la machine • suivant le contexte : utilisateur final, ou Applications développeur • interagit directement... avec le matériel ! Operating System Applications = les logiciels avec lesquels veut interagir l’utilisateur final • messagerie, traitement de texte, lecteur de musique, etc Hardware Matériel = la machine physique Et donc : Operating System = tout le reste User • logiciel d’infrastructure : «noyau», «pilotes», «services», etc • «entre le matériel et les applications» 5/47
Rôle de l’OS : les deux fonctions essentielles et largement interdépendantes ! Machine virtuelle • cacher la complexité sous une interface «plus jolie» • fournir certains services de base aux applications • IHM, stockage persistant, accès internet, gestion du temps • permettre la portabilité des programmes • faculté d’exécuter un même binaire sur des matériels (plus ou moins) différents Gestionnaire de ressources • partager chaque ressource entre les applications • exploiter «au mieux» les ressources disponibles • assurer la protection des applications (et du système) 6/47
Plan 1. Introduction : définition du terme «Système d’exploitation» 2. Interface entre OS et utilisateur : le shell 3. Interface entre logiciel et matériel : l’architecture 4. Isolation entre noyau et applications : les syscalls 5. Quelques syscalls UNIX incontournables 7/47
Interface entre OS et utilisateur : le shell Les services offerts par un shell : • exécution de programmes • charger un programme en mémoire, le lancer, l’arrêter • choisir quel programme est au premier-plan • exploration et administration des espaces de stockage • naviguer dans les fichiers, copier, supprimer • confort et ergonomie • presse-papiers, drag-and-drop, corbeille • ... 8/47
Différents types de shell : l’interpréteur de commandes Attention : terminal (ou émulateur de terminal) 6= shell ! Interface textuelle = Command-Line Interface = CLI exemples : Bourne shell (1977), bash, zsh... 9/47
Différents types de shell : le bureau graphique Interface graphique = Graphical User Interface = GUI exemples : Gnome, bureau de Windows, Aqua (Mac OSX)... 10/47
et encore : l’écran d’accueil du smartphone exemples : Android Launcher, Google Now, Facebook home... 11/47
Conclusion : le shell différents types de shell : CLI vs GUI à souris vs GUI tactile I fonctionnalités similaires I pour l’OS : une «application» comme les autres ! votre OS contient volontiers des applications pré-installées... • shell, navigateur web, explorateur de fichiers, messagerie, lecteur multimedia, app store, etc ... et aussi plein de «programmes système» : • développement : compilateur, assembleur, linker, etc • sécurité : antivirus, pare-feu, sauvegarde • maintenance : mise à jour OS, panneau de configuration • services réseau : web, base de données, accès distant Remarque : dorénavant je vais appeler tous ces programmes des applications 12/47
Positionnement de l’OS Application 1 Application 2 OS Kernel Hardware Définition : Noyau, ou en VO kernel Le noyau c’est la partie de l’OS qui n’est pas une application 13/47
Plan 1. Introduction : définition du terme «Système d’exploitation» 2. Interface entre OS et utilisateur : le shell 3. Interface entre logiciel et matériel : l’architecture 4. Isolation entre noyau et applications : les syscalls 5. Quelques syscalls UNIX incontournables 14/47
Vous avez dit «une interface plus jolie» ? et c’est vraiment cette formule qui est donnée dans les livres : source : Tanenbaum. Modern Operating Systems (4th ed, 2014). page 5 15/47
L’architecture de von Neumann CPU memory principe de fonctionnement : le cycle de Von Neumann while True do : charger une instruction depuis la «mémoire» décoder ses bits : quelle opération, quelles opérandes, etc exécuter l’opération et enregistrer le résultat repeat exemples d’instructions : ADD R1
Architecture d’une machine typique CPU1 CPU2 CPU3 System bus main I/O bridge memory I/O bus USB disk network controller controller adapter USB bus network disk mouse keyboard VS un seul processeur plusieurs coeurs SMT une unique mémoire DRAM + HDD + periphs + etc une mémoire rapide caches + attentes un seul programme de nombreux processus 17/47
Zoom sur : le processeur register file PC SR ALU ... / FPU cache memory bus interface System bus À l’intérieur d’un CPU, on trouve : • des registres génériques interchangeables : R1..Rn • des registres spécialisés uniques : • Program Counter, Instruction Register, Status Register • une unité de calcul : addition, soustraction... • une interface mémoire connectée au monde extérieur • et à une mémoire interne rapide : le cache (cf chap 3) 18/47
Le processeur : remarques Cycle de von Neumann = fetch / decode / execute • se déroule de part et d’autre du trait pointillé • exécution d’une instruction = atomique (indivisible) I pas d’état intermédiaire visible depuis l’extérieur • fréquence d’horloge = cadence (maximum) de ce cycle • vitesse de pointe 6= vitesse de croisière Rôle du composant «bus interface» : • communiquer avec les «mémoires» : cache, mem principale • faire attendre le processeur lorsque nécessaire • traduire les adresses = servir de MMU/TLB (cf chap 3) • communiquer avec les périphériques : memory-mapped I/O • recevoir les requêtes d’interruption (cf dans un instant) 19/47
Zoom sur : les périphériques périphérique 6= coupleur 6= pilote ou en VO device 6= device controller 6= device driver Interaction logiciel I matériel • instructions spéciales dédiées aux entrées-sorties • port-mapped input/output = PMIO • écriture «mémoire» aux adresses du coupleur • memory-mapped input/output = MMIO Interaction matériel I logiciel • scrutation constante des registres du coupleur • ou en VO polling • inefficace à l’exécution, et compliqué à programmer • interruption de l’exécution par les évènements extérieurs • il faut le support ad hoc dans le processeur • tous les processeurs ont ce mécanisme 20/47
Un processeur avec support des interruptions Le cycle de Von Neumann avec support des interruptions while True do : charger une instruction depuis la mémoire décoder ses bits : quelle opération, quelles opérandes, etc exécuter l’opération et enregistrer le résultat if interruption demandée then : sauvegarder les registres : R1...Rn, PC, SR, etc déterminer l’adresse de la routine de traitement sauter à la routine = copier cette adresse dans PC endif repeat 21/47
Mécanisme d’interruptions : déroulement Routine de Programme traitement principal d’interruption charger dans PC sauvegarder l’adresse de début requête les registres d’interruption de la routine ISR: ... ... ... ... ... RETI instruction restauration ”retour des registres d’interruption” 22/47
Mécanisme d’interruptions : vocabulaire • IRQ = Interrupt Request • un «message» envoyé au processeur par un périphérique • ISR = Interrupt Service Routine • un fragment de programme (= séquence d’instructions) • placé en mémoire à une adresse «bien connue» • termine toujours par une instruction RETI • notion de masquage des interruptions • interruptions masquées = le CPU ignore les IRQ • nouvelles IRQ reçues sont mises en attente • implémentation : drapeau (booléen) dans le registre d’état • les IRQ sont automatiquement masquées pendant une ISR • permet au programmeur d’être «seul au monde» • instruction RETI démasque les interruptions Définition : Noyau, ou en VO kernel Le noyau c’est (seulement) l’ensemble des ISR de la machine • et de toutes les fonctions que celles-ci appellent 23/47
Différentes sources d’interruptions • Minuteur système, ou en VO System Timer • interruptions périodiques, typiquement 100Hz ou 1000Hz • permet à l’OS de percevoir le passage du temps • bonus : permet au noyau de reprendre la main sur les applications (cf chapitre 2) • Périphériques d’entrées-sorties • clavier, souris, disque, réseau, etc • Pannes matérielles • température excessive, coupure de courant, etc • Évènements logiciels exceptionnels • erreurs fatales : division par zéro, instruction invalide, etc • trappes volontaires : (mais on y reviendra plus tard) 24/47
Plan 1. Introduction : définition du terme «Système d’exploitation» 2. Interface entre OS et utilisateur : le shell 3. Interface entre logiciel et matériel : l’architecture 4. Isolation entre noyau et applications : les syscalls 5. Quelques syscalls UNIX incontournables 25/47
Interruptions et jeu d’instructions Pour intégrer les interruptions dans le cycle de Von Neumann, on a été obligé d’ajouter des instructions spécifiques : • RETI : retourner au programme interrompu (x86 : IRET) • DINT : masquer (=désactiver) les interruptions (x86 : CLI) • EINT : démasquer (=activer) les interruptions (x86 : STI) Problème Comment empêcher une application de faire des bêtises avec ? exemple : main: ... ... DINT loop: JMP loop ... 26/47
Solution : “dual-mode operation” un processeur moderne offre deux modes d’exécution : supervisor mode = ring 0 = kernel mode = privileged mode • accès direct au matériel : machine réelle • mode par défaut au démarrage de la machine • nécessaire lorsqu’on exécute du code OS VS slave mode = ring 3 = user mode = restricted mode • architecture restreinte : machine virtuelle • certaines instructions interdites : EINT/DINT, RETI... • utile pour exécuter sereinement du code applicatif implémentation : un drapeau (booléen) dans le registre d’état I ce bit de mode conditionne le comportement du CPU bien sûr : changer ce drapeau est une instruction privilégiée ! 27/47
user mode 6= userland Applications exécutées sur la «machine virtuelle userland» : • jeu d’instructions restreint (CPU en mode utilisateur) • pas accès au mécanisme d’interruptions • accès interdit à certaines adresses mémoire • ex : code et données du noyau, périphériques matériels • implémentation : dans le composant «Bus interface» Sandboxing : une machine virtuelle pour chaque application • CPU virtuel (chap 2), mémoire virtuelle (chap 3) • périphériques : accessibles seulement au travers du noyau Notion de processus (ou en VO process) « Un programme en cours d’exécution » Système d’exploitation = illusionniste (VM) + sous-traitant (HW) 28/47
Notion de processus : remarques Intuitions : • un processus = un programme + un état d’exécution • état d’exécution = valeurs des registres + contenu de la mémoire Le noyau : • partage les ressources matérielles entre les processus actifs • crée/et détruit les processus lorsque nécessaire • un Process Control Block dans le noyau pour chaque processus • contient entre autres un numéro : le PID À faire chez vous : • essayer les commandes ps aux et top • et ensuite : man ps et man top 29/47
Changement de mode d’exécution : interruptions Problème : les ISR ont besoin de pouvoir accéder au matériel Solution : le processeur change de mode lors du saut Le cycle de Von Neumann, le retour while True do : fetch, decode, execute if (IRQ reçue) and (interruptions non masquées) then : sauvegarder les registres déterminer l’adresse de l’ISR passer en mode superviseur sauter à la routine = charger cette adresse dans PC endif repeat Remarque : RETI repasse le processeur en mode utilisateur 30/47
Changement de mode d’exécution : trappes Problème : comment une application peut-elle invoquer une méthode du noyau ? Mauvaise solution : autoriser les applications à sauter vers les fonctions situées dans le noyau • destination arbitraire I failles de sécurité • passage en mode superviseur I quand ? comment ? Solution : se donner une instruction spécialisée pour cet usage • noms variés : TRAP (68k), INT (x86), SWI (ARM) • interruption logicielle = trappe = exception • fonctionnement : similaire aux autres types d’interruption • sauvegarde du contexte CPU • bascule en mode superviseur • branchement à une adresse bien connue, dans le noyau 31/47
Appel système : principe Appel système, ou en VO system call = syscall Fonction située dans le noyau, invoquée par un processus utilisateur via une interruption logicielle Côté application : • l’appel est invoqué avec une instruction TRAP • indifférent au langage de programmation utilisé • encapsulation dans des fonctions de bibliothèque (ex : libc) Côté noyau : • on passe à chaque fois par l’ISR de TRAP • qui appelle la bonne fonction dans le noyau, • puis qui rend la main à l’application avec RETI Exemples : • read(), write(), fork(), gettimeofday()... • plusieurs centaines en tout sous Linux 32/47
Appel système : déroulement Application Bibliothèque C ”syscall Noyau interface” ”syscall ”syscall printf("hello world") wrapper” dispatcher” déballage des arguments write(1,"hello world",11) décodage du numéro de syscall réemballage des arguments ISR TRAP: appel de la bonne procédure TRAP ... ... emballage des ... sys write(1,"hello world",11) arguments et du numéro de syscall ”syscall implementation” RET RETI RET RET 33/47
Une courte page de publicité : ltrace et strace à faire chez vous : hello.c #include void main() { printf("hello linux world !\n"); } • gcc -o ./hello ./hello.c • ltrace ./hello • strace ./hello et ensuite : man ltrace et man strace 34/47
La VM userland : en résumé Application 1 Application syscalls jeu restreint d’instructions Kernel jeu complet d’instructions CPU en CPU en mode utilisateur mode superviseur • code applicatif exécuté par CPU en mode utilisateur • pour faire appel au noyau : interface des appels système 35/47
Positionnement de l’OS Application 1 Application 2 VM1 VM2 OS Kernel Architecture Hardware • chaque application qui s’exécute est un processus userland • le noyau virtualise et arbitre les accès au matériel 36/47
Plan 1. Introduction : définition du terme «Système d’exploitation» 2. Interface entre OS et utilisateur : le shell 3. Interface entre logiciel et matériel : l’architecture 4. Isolation entre noyau et applications : les syscalls 5. Quelques syscalls UNIX incontournables 37/47
Appels système : exemples source : Silberschatz. Operating Systems Concepts Essentials (2011). p 59 38/47
Une fonction qui cache un syscall : gettimeofday() 39/47
Appels système : Remarques Traditionnellement présentés sous la forme de fonctions C Mais même en C, system call 6= library call • un même nom de fonction peut avoir des implémentations différentes sur différentes plates-formes • Windows vs Linux vs OSX vs FreeBSD vs ... RTFM : man gettimeofday = man 2 gettimeofday Sections des pages de manuel : 1 commandes shell : ls , mkdir , cat ... 2 appels système : getpid(), open(), read()... 3 fonctions de bibliothèque : printf(), malloc(), sqrt()... 4 fichiers spéciaux (/dev/...) et drivers associés ... etc 40/47
Une fonction qui cache un syscall : exit() 41/47
Une fonction qui cache un appel système : fork() 42/47
Appel système fork : remarques Unique interface permettant de créer un processus Unix • duplique le processus appelant • les deux processus s’exécutent de façon concurrente • espaces mémoire distincts (bien qu’identiques au début) Paradigme «Call once, return twice» • dans le nouveau processus fork() rend 0 diagramme de • dans le parent, fork() renvoie le PID du fils séquence code source P1 P2 arbre 1 1 int x = fork(); généalogique 2 if ( x != 0 ) { x6=0 x=0 3 // parent only P1 2 2 4 } else { 5 // child only 3 5 6 } P2 7 7 7 // both processes 43/47
Appel système fork : exercice void main() { 1 int i=0; 2 if( fork() != 0 ) 3 { 4 i=i+1; 5 } 6 fork(); 7 i=i+1; 8 printf("i=%d \n", i); } À faire : • Dessiner l’arbre généalogique des processus • Indiquer pour chacun la valeur de i affichée 44/47
Plan 1. Introduction : définition du terme «Système d’exploitation» 2. Interface entre OS et utilisateur : le shell 3. Interface entre logiciel et matériel : l’architecture 4. Isolation entre noyau et applications : les syscalls 5. Quelques syscalls UNIX incontournables 45/47
À retenir Architecture • cycle de Von Neumann avec interruptions • dual-mode operation : utilisateur vs superviseur • instruction TRAP pour lever une interruption Noyau • l’ensemble des routines de traitement d’interruption (ISR) • en particulier le syscall dispatcher Processus • «machine virtuelle» offerte aux applications • vue simplifiée et restreinte de l’architecture Appels système • interface entre les processus et le noyau • accessibles via des fonctions de bibliothèque OS = noyau + bibliothèques + programmes système 46/47
Plan du cours • Chap 1 Noyau, processus, appels système TP usage de fork(), exec(), waitpid() • Chap 2 Multitâche, temps partagé, ordonnancement TD ordonnancement de processus • Chap 3 Mémoire virtuelle, caches, isolation TP performances de la hiérarchie mémoire • Chap 4 Allocation dynamique Contrôle continu (30 min, coeff 1) début avril TP implémentation de malloc(), free() • Chap 5 Synchronisation, concurrence, sémaphores TD usage de sémaphores TP programmation avec pthreads • Chap 6 Stockage et systèmes de fichiers • TD révisions, questions/réponses, examen blanc Examen final (1h30, coeff 2) 11 juin 47/47
Vous pouvez aussi lire