Systèmes d'exploitation - Introduction: shell, noyau, syscalls Guillaume Salagnac 2018-2019 - Plateforme pédagogique Moodle

 
CONTINUER À LIRE
Systèmes d'exploitation - Introduction: shell, noyau, syscalls Guillaume Salagnac 2018-2019 - Plateforme pédagogique Moodle
Systèmes d’exploitation
Introduction: shell, noyau, syscalls

       Guillaume Salagnac

       Insa de Lyon – Informatique

             2018–2019
Systèmes d'exploitation - Introduction: shell, noyau, syscalls Guillaume Salagnac 2018-2019 - Plateforme pédagogique Moodle
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
Systèmes d'exploitation - Introduction: shell, noyau, syscalls Guillaume Salagnac 2018-2019 - Plateforme pédagogique Moodle
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
Systèmes d'exploitation - Introduction: shell, noyau, syscalls Guillaume Salagnac 2018-2019 - Plateforme pédagogique Moodle
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
Systèmes d'exploitation - Introduction: shell, noyau, syscalls Guillaume Salagnac 2018-2019 - Plateforme pédagogique Moodle
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
Systèmes d'exploitation - Introduction: shell, noyau, syscalls Guillaume Salagnac 2018-2019 - Plateforme pédagogique Moodle
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
Systèmes d'exploitation - Introduction: shell, noyau, syscalls Guillaume Salagnac 2018-2019 - Plateforme pédagogique Moodle
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
Systèmes d'exploitation - Introduction: shell, noyau, syscalls Guillaume Salagnac 2018-2019 - Plateforme pédagogique Moodle
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
Systèmes d'exploitation - Introduction: shell, noyau, syscalls Guillaume Salagnac 2018-2019 - Plateforme pédagogique Moodle
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
Systèmes d'exploitation - Introduction: shell, noyau, syscalls Guillaume Salagnac 2018-2019 - Plateforme pédagogique Moodle
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