Systèmes temps réel et systèmes embarqués Elements d’architecture des ordinateurs Jacques Gangloff, Loı̈c Cuvillon 12 février 2008 Bibliographie Bibliographie – Livres : – Architecture et technologie des ordinateurs, P.Zanella et Y.Ligier, Dunod, 1998. – Architecture de l’ordinateur, 5ème édition, Andrew Tanenbaum, Pearson education, 2005. Une référence : par le créateur de l’OS minix, extrêmement détaillé. – Systèmes d’exploitation, 2ème édition, Andrew Tanenbaum, Pearson education, 2003. – WEB : – http ://www.intel.com – http ://en.wikipedia.org – Iconographie : wikipédia et A. Tanenbaum Acronymes Acronymes – DMA : Direct Memory Access – FSB : Front Side Bus – INT : Interruption – IRQ : Interrupt ReQuest – ISR : Interrupt Service Routine – MMU : Memory Management Unit – OS : Operating System – PIC : Programmable Interrupt Controleur – RAM : Random Access Memory – RTC : Real Time Clock Note Le Propos – quelques éléments d’architecture des ordinateurs pertinents pour les systèmes temps réel et embarqués (en particulier à base de Linux). 1 Plan Plan Table des matières 1 Le temps : Horloge et Timers 1.1 L’horloge temps réel . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Les timers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 3 2 Interruption 2.1 Contrôleur d’interruptions . . . . . . . . . . . . . . . . . . . . . . . 2.2 Partage d’interruptions . . . . . . . . . . . . . . . . . . . . . . . . . 4 5 5 3 Mémoire 3.1 Mode réel et protégé . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 Segmentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3 Pagination . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 7 8 11 4 Les entrées-sorties (I/0) : adressage 4.1 I/O par port . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 I/O mappées en mémoire . . . . . . . . . . . . . . . . . . . . . . . . 14 14 15 Rappel : Architecture des cartes-mères Rappel : Architecture des cartes-mères Northbridge – contrôleur mémoire (rafraı̂chissement, sélection,.) – bande passante élevée – compatibilité limité avec 1 type de mémoire et 1 CPU – terminologie Intel : Graphics and Memory Controller Hub (GMCH) Southbridge – dédié aux bus de moindres débits – peut inclure : DMA, RTC, PIC – terminologie Intel : I/O Controller Hub (ICH). 2 1 Le temps : Horloge et Timers 1.1 L’horloge temps réel L’horloge temps réel ou Real-time Clock (RTC) – quartz 32.768 kHz (maximum≈30MHz) – alimentation : batterie lithium ou supercondensateur – avantages : – indépendante du reste du système (1 utilisation : réveil programmé) – sauvegarde de l’heure et du jour en absence d’alimentation – inconvénients : – consultation lente (I/O) – résolution faible (ms : milliseconde) Circuit intégré RTC Puce southbridge (RTC inclus) 3 1.2 Les timers Les timers Programmable Interrupt Timer (PIT) – compteurs programmables en mode one-shot ou périodique – résolution temporelle : µs – un des compteur est utilisé comme ”timer système” – le timer système génère l’INT de plus haute priorité : l’INT timer (IRQ 0) – Ex : puce intel 825x, inclus dans le southbridge à l’adresse I/O : 0x40-43 Time Stamp Counter (TSC) – compteur (registre) 64 bits interne au CPU ix86 – incrémentation de 1 à chaque signal d’horloge CPU – 190 ans pour le remplir à 3GHz, résolution : nanosecondes (ns) – accessible par une instruction processeur (asm) ”RDTSC” Timers Linux : usage des timers – variable kernel xtime – initialisée à partir de la Real Time Clock – fréquence de rafraı̂chissement 1000Hz – usage : gettimeofday() – variable kernel jiffies – variable 32 bits – incrémentée à chaque interruption timer (100 ou 1000Hz pour linux, défini à la compilation du kernel) – utilisée par le noyau et pour la fréquence de réordonnancement des threads – usage : void init timer (struct timer list* timer) et scheduler tick() – registre TSC – la meilleur résolution (ns) – usage : rtdsc(low,high), lecture en 2 variable 32 bits du TSC – utilisé par le Linux temps réel Xenomai sur architecture intel386 2 Interruption Interruption Définition d’une interruption matérielle – signal sur une broche (INT) du CPU déclenchant l’exécution d’une routine – notification au CPU d’événements asynchrones en provenance des périphériques (ex : touche enfoncée, fin d’un transfert mémoire) – économie pour le CPU du temps de scrutation des périphériques 4 Scrutation périodique par le CPU de l’état du périphèrique INT CPU CPU RAM PIC INT 1 I/O (1) RAM (controleur) I/O (1) I/O (2) (controleur) I/O (2) INT 2 (controleur) (controleur) Entrée−Sortie programmée avec attente de disponibilité Entrée−Sortie programmée avec interruption Interruption Exemple : convertisseur analogique-numérique Séliatec – une interruption est utilisée pour notifier au CPU que la conversion de la tension analogique en valeur numérique est achevée 1. la conversion démarre par une écriture fictive sur le port d’un des convertisseurs analogique-numeriques 2. une interruption est générée par la carte seliatec en fin de conversion 3. le CPU notifié, exécute l’ISR correspondant : – lecture d’un registre de la carte indiquant quel CNA a fini la conversion ; cette lecture désactive l’interruption – lecture de la valeur de la tension dans un registre de la carte 2.1 Contrôleur d’interruptions Contrôleur d’interruptions Gestion des interruptions – définition de priorités pour arbitrer les concurrences – présentation d’une interruption à la fois au CPU – nécessité de masquer des interruptions et de les mémoriser (buffer) → Utilisation d’un contrôleur d’interruption (PIC) Note : Temps de réponse (latence) à une interruption – minimum : fonction du contrôleur d’interruption et sa configuration – maximum : fonction de l’OS (taille code critique non-interruptible + priorité d’ordre supérieur qui retarde l’exécution) – un OS temps réel doit garantir un maximum – ordre de grandeur de la latence (micro-secondes) OS moyenne max min écart-type Linux 2.6.12 15.8 179.9 15.2 1.3 Linux temps réel (xenomai) 13.9 53.2 13.2 0.5 5 Interruption Un contrôleur programmable d’interruptions (PIC) : le 8259 – utilisé par le PC IBM et ses successeurs, peut être mis en cascade (deux 8259 en cascade = 15 INT) – 1 registre de masque, 1 d’interruption activée, 1 d’interruption servie – programmation/lecture via le bus de données du CPU (DO-D7) – priorité par ordre décroissant (0(+prioritaire),2,...,7(-)) INT INTA RD WR A0 CS CPU 8259A Interrupt controller D0-D7 Clock IR0 IR1 IR2 IR3 IR4 IR5 IR6 IR7 Keyboard Disk Printer +5 v 2.2 Partage d’interruptions Signaux d’Interruption : sur front ou niveau ”Edge sensitive” interruption periph 1 periph 2 V t ligne INT1 – – – – actif sur un front du pulse sensible au bruit, pertes par masquage temporaire ou recouvrement de 2 INT requiert : capture par une bascule flip-flop norme du bus ISA ”Level sensitive” interruption periph 1 periph 2 V t ligne INT2 fin traintement int – – – – actif sur un niveau actif (niveau haut) tant que l’interruption n’est pas acquittée indépendance au bruit, immanquable norme du bus PCI Signaux d’Interruption : Partage de lignes d’interruption – configuration à 15 interruptions est classique (2x8259 en cascade) – or, plus de périph. que d’interruptions → partage des lignes d’INT 6 Problèmes du partage d’une ligne d’interruption par n périph. ”Edge-sensitve” interruption ”Level-sensitive” interruption – inconvénients : – obligation de tester les n périph. (2 INTs confondues) – pas de retour sur le résultat du traitement de l’interruption – avantage : – si un périph. ne peut pas être acquitté : pas de problème (ligne d’INT libre) – avantages (/edge level) : – parcours des périph. jusqu’à disparition du niveau haut de la ligne – ordre de traitement important pour l’efficacité (d’abord celui qui génère beaucoup d’INT) – inconvénients : – si un périph. ne peut pas être acquitté : Int bloqué niveau haut (ligne d’INT bloquée) Interruption : Partage de lignes d’interruption Conclusion sur le partage d’une ligne d’interruption par n périph. – augmentation du temps de traitement des interruptions en n2 – gestion des interruptions plus complexe Nouvelles approches → supprimer les lignes d’interruptions partagées – APIC : Advance Programmable Interrupts Controller – chaque processeur possède un local APIC (LAPIC) de 24 à 64 interruptions – jusqu’à 8 I/0 APIC collectent les interruptions et les renvoient vers les LAPIC (8x 24-64 interruptions possibles) – permet de partager des interruptions entre multiprocesseurs, flexible – ”message-signalled” interruptions – supprime les lignes physiques d’interruption sur la carte-mère – requête envoyée par un message court sur un médium unique (un peu comme Ethernet) – le message contient un identifiant du périphérique qui a généré une interuption (Ex : PCI-Express (bus série avec des trames) 3 Mémoire 3.1 Mode réel et protégé Mode réel et protégé Le mode réel : définition – le mode d’exécution du 8086 – 8086 : processeur 16 bits (1978-320$) avec bus d’adresse de 220 bits (1Mo) – des registres de 16 bits permettent d’adresser une mémoire linéaire de 216 bits (64 Ko) – pour accéder au 1Mo de mémoire : – un registre segment de 16bits – offset : l’adresse mémoire sur 16bits – adresse finale= segment x16 + offset 7 – système complexe, où l’on définit des segments adressables de 64 Ko commençant à l’adresse de base (segment x16) 8086 Mode réel et protégé Le mode protégé – introduit avec le 80286 (1982) – 80286 : processeur 16 bits (bus adresse de 24 bits) – mode augmentant via le hardware, la sécurité et stabilité des OS multi-tâches – par opposition avec le mode réel, il apporte : – des niveaux de privilège d’exécution – un accès à la mémoire > 1Mo – mémoire virtuelle et protection mémoire (MMU de 1Go d’adresses virtuelles) – pour compatibilité avec le 8086 : tous les CPUs Intel démarrent en mode réel 80286 (i286) Gestion de la mémoire Problématiques liées à un système multi-tâche – cohabitation de nombreux programmes dans une mémoire limitée – protection de l’intégrité du code et données de chaque processus (empêcher le programme d’un utilisateur d’aller modifier le code du système ou d’un autre utilisateur) Problématique de la réallocation dynamique – le compilateur produit un code A sans savoir où il sera exécuté en mémoire – hypothèse : la première instruction est un appel à une procédure (fonction) à l’adresse absolue 100 dans le fichier binaire. – si le binaire est chargé à l’adresse 100K, l’instruction sautera à l’adresse absolu 100 (où peut se trouver le code d’un autre utilisateur). L’adresse où sauter devrait en fait être 100K+100. – de même, si le binaire est chargé à l’adresse 250K, l’instruction doit sauter en 250K+100. 8 3.2 Segmentation Gestion de la mémoire : la réallocation dynamique 000 Code A 900K Système d’exploitation 1M OS mono-tâche : pas de problème – un seul processus toujours chargé à l’adresse 0 et de taille maximale limitée (900K, ici) – pas de nécessité de réallocation (translation d’adresses) car chargé en 0. – quand le processus est fini, il est écrasé par le code du suivant Gestion de la mémoire : la réallocation dynamique 000 000 Processus H 10K 70K Processus H (libre) Processus A 270K 100K Processus A Processus B 580K 280K Processus B (libre) 900K 900K Système d’exploitation Système d’exploitation 1M 1M Mémoire après un temps de fonctionnement Retassement par réallocation dynamique OS multi-tâche – plusieurs tâches chargées en mémoire aux adresses où il y a de la place – nécessite un mécanisme de réallocation pour déplacer les programmes tout en permettant leur exécution correcte (nouvelles adresses des procédures dans le code) – le retassement permet de supprimer la fragmentation et libérer un bloc mémoire contiguë 9 Réallocation dynamique et segmentation Mécanisme de translation d’adresses – lors du chargement en mémoire d’un processus, l’adresse de départ, où il est chargé, est stockée dans le registre base – à toute adresse à laquelle fait référence le processus (offset), on ajoute la valeur du registre de base : adresse effective = base + adresse relative au début du processus (offset) (1) – ainsi, lors du déplacement d’un processus en mémoire : – le code binaire est déplacé sans aucune modification – le registre base est mis à jour avec la nouvelle valeur – on utilise l’équation précédente pour le calcul des adresses effectives Réallocation dynamique et segmentation Mécanisme de translation d’adresses – illustration avec l’appel d’une procédure stockée à l’adresse 100 dans le binaire Mémoire 100K Table de segment Processus A Exécution procédure 1 adresse effective 100,1K base CALL 100 CALL 100 base 100,1K 100K procédure 1 Processus A Code appel procédure 1 CALL 100,1K Réallocation dynamique et segmentation Mécanisme de protection mémoire – risque de débordement (involontaire ou mal intentionné) d’un processus dans la zone mémoire d’un autre processus – taille du segment mémoire du processus stockée dans un registre limite – pour chaque adresse effective, on teste si : adresse effective < base + limite – en cas de tentative de dépassement : interruption SIGSEGV Mémoire 100K Table de segment Processus A Exécution procédure 1 adresse effective 100,1K CALL 100 CALL 100 limite base 130K 100K 100,1K CALL 100,1K 230K Test sécurité adresse < base+limite base procédure 1 Processus A Code appel procédure 1 Ok 10 limite Gestion de la mémoire : Segmentation – mécanisme présenté précédemment de réallocation et protection mémoire : la segmentation (cas 1 seul segment) – la segmentation, plus généralement consiste à : – définir un ou plusieurs segments pour un programme (code, données, pile,..) – associer des droits (lecture/écriture) à chaque segment – partager des segments communs pour éviter la duplication de code en mémoire (ex : 2 exécution de l’éditeur ed (ED1 et ED2) ) 3.3 Pagination Gestion de la mémoire : Mémoire virtuelle Apport de la segmentation – la segmentation permet aisément de faire coexister plusieurs programmes en mémoire (réallocation) avec des protections adéquates – la segmentation cause une fragmentation externe de la mémoire qui peut être corrigée périodiquement par un processus très coûteux en temps CPU : le retassement de la mémoire Limitation – la segmentation n’apporte pas de solutions efficaces pour exécuter un programme (ou plusieurs) nécessitant plus de RAM que celle disponible – or, à un instant donné, seules quelques parties du programme et de ses données sont nécessaires en mémoire, le reste pouvant être stocké en mémoire secondaire (disque dur) – la mémoire virtuelle : méthode permettant d’implémenter la stratégie ci-dessus avec utilisation de la mémoire secondaire Gestion de la mémoire : Mémoire virtuelle Principe – le CPU (et l’OS) travaille sur une mémoire virtuelle importante – un démon ou une unité de gestion de la mémoire (MMU) se charge de : – mise en mémoire physique des données nécessaires à un instant donné – copie temporaire des données sur le disque pour libérer de la mémoire physique – translation d’adresses entre l’adresse virtuelle accédée par le CPU et l’adresse mémoire réelle de la donnée 11 Mémoire secondaire Mémoire virtuelle 4Go (2^32) Disque dur Mémoire physique (RAM) 32Ko (2^15) 0 MMU CPU Adresse réelle Adresse virtuelle (32 bits) Bus adresse mémoire Bus données 0 Mémoire virtuelle : Pagination Pagination : une technique de mémoire virtuelle – découpage d’un espace d’adressage virtuel de grande dimension (2m adresses) en pages de petite taille (2p bits) – découpage de la mémoire physique (2n adresses, n ≤ m) également en pages – une [adresse mémoire] est découpée en : [numéro de page | position dans la page (offset)] – une table des pages virtuelles de 2m−p entrées stocke les informations liées à chaque page virtuelle : – un flag indiquant si la page virtuelle est en mémoire physique ou sur le disque – si en mémoire, l’adresse physique de la page – dans la cas où n ≤ m : à un instant donné, il est forcément impossible d’avoir toutes les pages virtuelles chargées en mémoire physique Mémoire virtuelle : Pagination Exemple – mémoire virtuelle : 4Go (adresses de 32 bits) – mémoire physique : 32Ko (adresses de 15 bits) – taille de page : 4Ko (12 bits d’adresses) – donc : – 8 pages de mémoire physique disponibles – 220 pages de mémoire virtuelle – nombres d’entrées table de pages : 220 12 Page Virtual addresses 15 61440 – 65535 14 57344 – 61439 13 53248 – 57343 12 49152 – 53247 11 45056 – 49151 10 40960 – 45055 9 36864 – 40959 Bottom 32K of main memory 8 32768 – 36863 Page frame 7 28672 – 32767 7 28672 – 32767 6 24576 – 28671 6 24576 – 28671 5 20480 – 24575 5 20480 – 24575 4 16384 – 20479 4 16384 – 20479 3 12288 – 16383 3 12288 – 16383 2 8192 – 12287 2 8192 – 12287 1 4096 – 8191 1 4096 – 8191 0 0 – 4095 0 0 – 4095 (a) Physical addresses (b) Mémoire virtuelle : Pagination Exemple (suite) – MMU : translation d’adresses virtuelles de 32 bits vers 15 bits – 12 bits pour l’offset dans la page de 4Ko – Table des pages : – l’adresse virtuelle demandée correspond à la 3ème page virtuelle – d’après la table, elle est déjà en mémoire (flag=1) et sotckée dans la 6ème /8 page physique 15-bit Memory address 1 1 0 0 0 0 0 0 0 0 1 0 1 1 0 Output register 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 1 0 Input register Virtual page Page table Present/absent bit 15 14 13 12 11 10 9 8 7 6 5 4 3 1 110 2 1 0 20-bit virtual page 12-bit offset 32-bit virtual address Mémoire virtuelle : Pagination Exemple (fin) – illustration : utilisation optimale de la mémoire physique – toutes les pages de RAM occupées par divers programmes 13 Unité de Gestion de la mémoire (MMU) – – – – circuit imprimé distinct ou inclus dans le processeur circuit dédié accélérant fortement les translations et tests sur les adresses une logique importante (jusqu’à 30% de la surface du processeur) au niveau matériel, elle contient : – mémoire dédiée pour les tables de pages et registres (base, limite) – logique de conversion des adresses virtuelles en adresses physiques – logique de calcul des adresses de type base + offset – logique de test de dépassement de limite d’un segment Gestion de la mémoire : Conclusion Pagination et Segmentation – 2 méthodes pour optimiser et automatiser la gestion de la mémoire (protection, occupation mémoire) – segmentation et pagination utilisées simultanément sous linux (un segment de programme = plusieurs pages en mémoire virtuelle) – segmentation et pagination sont temporellement non-déterministes : – défauts de pages : il faut charger la page à partir du disque (périph. lent) – (solution : appel système bloquant une page critique en RAM) – retassement : liberation d’un bloc contiguë de mémoire (process lent.) Mémoire linéaire (flat memory) – système sans MMU : accès direct à la mémoire physique linéaire – avantage : déterminisme temporelle (programme toujours en mémoire à une adresse immuable) – inconvénient : développement difficile pour un système multi-tâche (pas de protection mémoire, relocation) 4 Les entrées-sorties (I/0) : adressage Entrées-sorties 14 – – – – – interaction fondamentale entre CPU et périphériques un échange entre registres du contrôleur d’un periph. et le CPU matériel impliqué : bus, chipset, contrôleur de périphériques instructions nécessaires : adressage, lecture et écriture. 2 stratégies d’adressage différentes : port dédié ou mappage en mémoire Espace memoire et E/S separees E/S mappees en memoire Espace d’adressage hybride 0xFFFF 0xFFFF 0xFFFF memoire memoire ports d’ E/S ports d’ E/S 0xFF O 4.1 O O I/O par port I/O par port – la sortie I/O du CPU indique que l’adresse sur le bus correspond à un port de périph. et non pas à une adresse mémoire – instructions CPU dédiées : IN, OUT (asm) ou inb,outb (langage C) – Northbridge déroute la requête vers le Southbridge si la sortie I/O du CPU est active (sinon vers la mémoire) – adresses de ports définies par la carte mère (Super I/O contrôleur) CPU Address Bus 0x3F8 NorthBridge IO/M Memory I/O S I/O controller Serial Port 4.2 I/O mappées en mémoire I/O mapping – une partie des adresses mémoires (virtuelles) est réservée pour les entrées-sorties vers les périphériques – toutes les lectures/écritures sur cette plage d’adresses sont redirigées vers le southbridge (périph.) – sur chipset Intel : adresses entre TOLUD et 4Go (chipset spec.) 15 TOLUD<0xFF4A<0xFFFF Address Bus CPU 0xFFFF 0xFF4A NorthBridge Memory Data Bus 0x0000 PCI device controller South bridge I/O par ports et mappées en mémoire Comparatif I/O port – +adressage séparé : toute la plage d’adressage peut être utilisée pour la mémoire – +instruction spécifique : lisibilité code – -nécessite du hardware supplémentaire et une broche sur le CPU – intéressant sur architecture à petit bus d’adressage I/O mappée en mémmoire – +CPU ne requiert pas de logique pour les ports (prix,simplicité) – +instruction identique à un accès mémoire (RISC) – - occupe des adresses mémoires (si virtuelles, MMU nécessaire) – sur archi 32 bits, peux de problèmes d’adressage limité Sous Linux/ix86 : cohabitation des 2 modes d’adressage (pci) Note : Les canaux DMA DMA : Direct memory Access – les canaux DMA peuvent être considérés comme des périphériques – chacun de ces périphériques permet de réaliser des opérations d’entrées-sorties et de délester ainsi le CPU de ce travail – le CPU initialise alors les paramètres du transfert (source, destination, nombre d’octets) – le DMA lui signale la fin du transfert par interruption Terminal 1.initilisation DMA Address CPU DMA Count … … Device Memory 100 32 4 1 Direction Bus 16 100 RS232C Controller