Cours de structure des Ordinateurs Université Protestante de Lubumbashi Cours d’Architecture Des Ordinateurs - 2é BAC Informatique de Gestion 2019-2020 De nos jours l'informatique est devenue une compétition commerciale et technologique dans laquelle l’évolution des composants et des systèmes est quotidienne. Ce cours sera donc mis à jour en temps réel en fonction de l'évolution des produits. 1. Présentation Du Cours Ce cours expose les principes de fonctionnement des ordinateurs. Il s’agit ici de comprendre, à bas niveau, l’organisation de ces machines. De la couche la plus basse (langage machine) jusqu’à celle haute (langage proche du langage humain), en passant par l’étude du codage de l’information, de circuits logiques etc. Nous nous appuierons sur l’étude détaillée de l’architecture PC de John Van Neumann, dont nous étudierons ses principaux éléments matériels et logiciels, les fonctions de base de son système d’exploitation, et ses mécanismes de communication avec l’extérieur (entrées/sorties). Puis nous conclurons ce cours par une mise au point du langage assembleur et un panorama des différentes architectures actuelles (processeurs CISC « Complex Instruction Set Computer ou Ordinateur a jeu d’instruction Complexe » et RISC « Reduced Instruction Set Computer ou Ordinateur a jeu d’instruction Réduit », etc.). 2. Plan du Cours 0. Introduction 0.1. 0.2. Principes De Fonctionnement D’un Ordinateur Architecture de base d’un ordinateur Chapitre I : CODAGE DE L’INFORMATION Chapitre II : ALGEBRE DE BOOLE Chapitre III : CIRCUITS COMBINATOIRES Cours de structure des Ordinateurs Chapitre IV : LE SYSTEME D’EXPLOITATION Chapitre V : STRUCTURE DES COMPOSANTS HARDWARE Chapitre VI : LES MEMOIRES Chapitre VII : ASSEMBLEUR Annexe : Exercices 1. Références Bibliographiques a. Namur Cours de Hardware - en informatique 2015 – 2016 b. T.Dumartin Architecture des ordinateurs Note de cours 2013 c. Architecture des Ordinateurs Nicolas Delestre, Michel Mainguenaud 2004 d. Emmanuel Viennet Architecture des ordinateurs 2015 e. Tisserant S, Architecture et Technologie des Ordinateurs, Louis Pasteur, 2010 f. Martin B., Codage, cryptologie et applications, Presses Polytechniques et Universitaires Romandes (PPUR), 2004 g. Comment ça marche, « Représentation des nombres entiers et réels », <http://www.commentcamarche.net/contents/base/representation .php3> Cours de structure des Ordinateurs 0. Introduction 0.1. Principes De Fonctionnement D’un Ordinateur Le fonctionnement d’un ordinateur repose sur le respect des principes architecturaux (structure de la matière, la logique,…) issus de la physique appliquée et de l’électricité exploitant les phénomènes de conduction des électrons. Cours de structure des Ordinateurs 0.2. Architecture de base d’un ordinateur Dans cette partie, nous décrivons rapidement l’architecture de base d’un ordinateur et les principes de son fonctionnement. Un ordinateur est une machine de traitement de l’information. Il est capable d’acquérir de l’information, de la stocker, de la transformer en effectuant des traitements quelconques, puis de la restituer sous une autre forme. Le mot informatique vient de la contraction des mots information et automatique. Nous appelons information tout ensemble de données. On distingue généralement différents types d’informations : textes, nombres, sons, images, etc., mais aussi les instructions composant un programme. Cependant toute information est manipulée sous forme binaire (ou numérique) par l’ordinateur. 0.2.1. Principes de fonctionnement Les deux principaux constituants d’un ordinateur sont la mémoire principale et le processeur. La mémoire principale (MP en abrégé) permet de stocker de l’information (programmes et données), tandis que le processeur exécute pas à pas les instructions composant les programmes. 0.2.2. Notion de programme Un programme est une suite d’instructions élémentaires, qui vont être exécutées dans l’ordre par le processeur. Ces instructions correspondent à des actions très simples, comme additionner deux nombres, lire ou écrire une case mémoire, etc. Chaque instruction est codifiée en mémoire sur quelques octets. Le processeur est capable d’exécuter des programmes en langage machine, c’est à dire composés d’instructions très élémentaires suivant un codage précis. Chaque type de processeur est capable d’exécuter un certain ensemble d’instructions, son jeu d’instructions. Pour écrire un programme en langage machine, il faut donc connaître les détails du fonctionnement du processeur qui va être utilisé. 0.2.3. Le processeur Le processeur est un circuit électronique complexe qui exécute chaque instruction très rapidement, en quelques cycles d’horloges. Toute l’activité de l’ordinateur est Cours de structure des Ordinateurs cadencée par une horloge unique, de façon à ce que tous les circuits électroniques travaillent ensembles. La fréquence de cette horloge s’exprime en MHz (millions de battements par seconde). Par exemple, un ordinateur “PC Pentium 133” possède un processeur de type Pentium et une horloge à 133 MHz. Pour chaque instruction, le processeur effectue schématiquement les opérations suivantes : Cours de structure des Ordinateurs 1. lire en mémoire (MP) l’instruction à exécuter; 2. effectuer le traitement correspondant; 3. passer à l’instruction suivante. Le processeur est divisé en deux parties (voir figure 0.2.1), l’unité de commande et l’unité de traitement : – – l’unité de commande est responsable de la lecture en mémoire et du décodage des instructions; l’unité de traitement, aussi appelée Unité Arithmétique et Logique (U.A.L.), exécute les instructions qui manipulent les données. Processeur Mémoire Principale (M.P.) codes instructions Unité de commande Programm e Unité de traitement (U.A.L. ) donné binaire es s Donnée s informations codées en binaire Unité d’entrées/sorties CLAVIER ECRAN FIG. 0.2.1 – Architecture schématique d’un ordinateur Cours de structure des Ordinateurs 0.2.4. La mémoire principale (MP) 0.2.4.1. Structure de la MP La mémoire est divisée en emplacements de taille fixe (par exemple 8 bits) utilisés pour stocker instructions et données. En principe, la taille d’un emplacement mémoire pourrait être quelconque; en fait, la plupart des ordinateurs en service aujourd’hui utilisent des emplacements mémoire d’un octet (byte en anglais, soit 8 bits, unité pratique pour coder un caractère par exemple). FIG. 0.2.2 – Structure de la mémoire principale. Dans une mémoire de taille N, on a N emplacements mémoires, numérotés de 0 à N −1. Chaque emplacement est repéré par son numéro, appelé adresse. L’adresse est le plus souvent écrite en hexadécimal. La capacité (taille) de la mémoire est le nombre d’emplacements, exprimé en général en kilo-octets ou en méga-octets, voire davantage. Rappelons que le kilo informatique vaut 1024 et non 1000 (210 =1024≈1000). Voici les multiples les plus utilisés : 1K (Kilo) 210 = 1024 1 M (Méga) 220 = 1048 576 1 G (Giga) 1 T (Téra) 230 = 1 073 741 824 240 = 1 099 511 627 776 1 Sur certains ordinateurs, les controleurs d’entrées/sorties peuvent accéder directement à la mémoire (accès DMA), mais cela ne change pas le principe de fonctionnement. Cours de structure des Ordinateurs 0.2.4.2. Opérations sur la mémoire Seul le processeur peut modifier l’état de la mémoire1. Chaque emplacement mémoire conserve les informations que le processeur y écrit jusqu’à coupure de l’alimentation électrique, où tout le contenu est perdu (contrairement au contenu des mémoires externes comme les disquettes et disques durs). Les seules opérations possibles sur la mémoire sont : écriture d’un emplacement : le processeur donne une valeur et une adresse, et la mémoire range la valeur à l’emplacement indiqué par l’adresse; – lecture d’un emplacement : le processeur demande à la mémoire la valeur contenue à l’emplacement dont il indique l’adresse. Le contenu de l’emplacement lu reste inchangé. 0.2.4.2.1. Unité de transfert – Notons que les opérations de lecture et d’écriture portent en général sur plusieurs octets contigüs en mémoire : un mot mémoire. La taille d’un mot mémoire dépend du type de processeur; elle est de – – – 1 octet (8 bits) dans les processeurs 8 bits (par exemple Motorola 6502); 2 octets dans les processeurs 16 bits (par exemple Intel 8086); 4 octets dans les processeurs 32 bits (par ex. Intel 80486 ou Motorola 68030). 0.2.5. Le processeur central Le processeur est parfois appelé CPU (de l’anglais Central Processing Unit) ou encore MPU (Micro-Processing Unit) pour les microprocesseurs. Un microprocesseur n’est rien d’autre qu’un processeur dont tous les constituants sont réunis sur la même puce électronique (pastille de silicium), afin de réduire les coûts de fabrication et d’augmenter la vitesse de traitement. Les microordinateurs sont tous équipés de microprocesseurs. L’architecture de base des processeurs équipant les gros ordinateurs est la même que celle des microprocesseurs. Cours de structure des Ordinateurs 0.2.5.1. Les registres et l’accumulateur Le processeur utilise toujours des registres, qui sont des petites mémoires internes très rapides d’accès utilisées pour stocker temporairement une donnée, une instruction ou une adresse. Chaque registre stocke 8, 16 ou 32 bits. Le nombre exact de registres dépend du type de processeur et varie typiquement entre une dizaine et une centaine. Parmi les registres, le plus important est le registre accumulateur, qui est utilisé pour stocker les résultats des opérations arithmétiques et logiques. L’accumulateur intervient dans une proportion importante des instructions. Par exemple, examinons ce qu’il se passe lorsque le processeur exécute une instruction comme “Ajouter 5 au contenu de la case memoire d’adresse 180” : 1. Le processeur lit et décode l’instruction; 2. le processeur demande à la mémoire la contenu de l’emplacement 180; 3. la valeur lue est rangée dans l’accumulateur; 4. l’unité de traitement (UAL) ajoute 5 au contenu de l’accumulateur; 5. le contenu de l’accumulateur est écris en mémoire à l’adresse 180. C’est l’unité de commande qui déclenche chacune de ces actions dans l’ordre. L’addition proprement dite est effectuée par l’UAL. 0.2.5.2. Architecture d’un processeur à accumulateur La figure 0.2.3 représente l’architecture interne simplifiée d’un MPU à accumulateur. On y distingue l’unité de commande, l’UAL, et le décodeur d’instructions, qui, à partir du code de l’instruction lu en mémoire actionne la partie de l’unité de commande nécessaire. Cours de structure des Ordinateurs BUS DE DONNEES Reg. mot Bus de données interne RTUAL AC C R I UAL RTA Reg. d’état Décodeu r Unité de Commande I P Horloge Bus d’adresses interne Reg. Adr Quart z COMMANDES BUS D’ADRESSES FIG. 0.2.5.3 – Schéma simplifié d’un processeur. Cours de structure des Ordinateurs Le processeur est relié à l’extérieur par les bus de données et d’adresses, le signal d’horloge et les signaux de commandes. Les informations circulent à l’intérieur du processeur sur deux bus internes, l’un pour les données, l’autre pour les instructions. On distingue les registres suivants : ACC : Accumulateur; RTUAL : Registre Tampon de l’UAL, stocke temporairement l’un des deux opérandes d’une instructions arithmétiques (la valeur 5 dans l’exemple donné plus haut); Reg. d’état: stocke les indicateurs, que nous étudierons plus tard; RI : Registre Instruction, contient le code de l’instruction en cours d’exécution (lu en mémoire via le bus de données); IP : Instruction Pointer ou Compteur de Programme, contient l’adresse de l’emplacement mémoire où se situe la prochaine instruction à exécuter; RTA : Registre Tampon d’Adresse, utilisé pour accéder à une donnée en mémoire. Les signaux de commandes permettent au processeur de communiquer avec les autres circuits de l’ordinateur. On trouve en particulier le signal R/W (Read/Write), qui est utilisé pour indiquer à la mémoire principale si l’on effectue un accès en lecture ou en écriture. 0.2.5.3. Liaisons Processeur-Mémoire : les bus BUS D’ADRESSES Processeur R/W Signal Lecture/Ecriture BUS DE DONNEES Mémoire Principale Cours de structure des Ordinateurs FIG. 0.2.5.4 – Connexions Processeur-Mémoire : bus de données, bus d’adresse et signal lecture/écriture. Les informations échangées entre la mémoire et le processeur circulent sur des bus. Un bus est simplement un ensemble de n fils conducteurs, utilisés pour transporter n signaux binaires. Le bus d’adresse est un bus unidirectionnel : seul le processeur envoie des adresses. Il est composé de a fils; on utilise donc des adresses de a bits. La mémoire peut posséder au maximum 2a emplacements (adresses 0 à 2a −1). Le bus de données est un bus bidirectionnel. Lors d’une lecture, c’est la mémoire qui envoie un mot sur le bus (le contenu de l’emplacement demandé); lors d’une écriture, c’est le processeur qui envoie la donnée. Cours de structure des Ordinateurs CHAPITRE 1 : CODAGE DE L’INFORMATION L’information est le support formel d’un élément de connaissance humaine susceptible d’être représentée à l’aide de conventions (codages) afin d’être conservée, traitée ou communiquée. Une donnée est la représentation d’une information sous une forme conventionnelle (codée) destinée à faciliter son traitement. Les informations traitées par un ordinateur peuvent être des différents types (texte, image, nombres, etc.) mais elles sont toujours représentées et manipulées par l'ordinateur sous forme binaire. L'unité d'information est le chiffre binaire (0 ou 1), que l'on appelle bit (pour binary digit, chiffre binaire). Enfin, les opérations arithmétiques de base (addition, multiplication etc.) sont faciles à exprimer en base 2. 1.1. Définition: Le codage d’information permet d’établir une correspondance qui permet sans ambiguïté de passer d’une représentation (dite externe) d’une information à une autre représentation (dite interne : sous forme binaire) de la même information, suivant un ensemble de règle précise. - Exemple : Le nombre 50 : 50 est la représentation externe du nombre cinquante La représentation interne de 50 sera une suite de 0 et 1 (110010). En informatique, Le codage de l’information s’effectue principalement en trois étapes: Premièrement l’information sera exprimée par une suite de nombres (Numérisation) deuxièmement chaque nombre est codé sous forme binaire (suite de 0 et 1) et troisièmement chaque élément binaire est représenté par un état physique. 1.2. Elément binaire et son équivalent en Etat physique Codage de l’élément binaire par un état physique Charge électrique (RAM : Condensateur-transistor) : Chargé (bit 1) ou non chargé (bit 0) Magnétisation (Disque dur, disquette) : polarisation Nord (bit 1) ou Sud (bit 0) Cours de structure des Ordinateurs Alvéoles (CDROM): réflexion (bit 1) ou pas de réflexion (bit 0) 1.3. Systèmes de numération Les nombres sont usuellement représentes en base 10. Chaque chiffre apparaissant dans un nombre est le coefficient d’une puissance de 10. Par exemple, le nombre 145 correspond au nombre obtenu par l’opération suivante : 1 × 102 + 4 × 101 + 5 × 100. Ce type de numération peut être appliqué à n’importe quelle autre base. 1.3.1. Numération en base b Etant donnés un entier positif´ b, chaque nombre entier x peut-être représenté de manière unique par un nombre anan−1 ···a0, tel que an 6= 0 et pour tout i ∈ [0,n], ai ∈ [0,b − 1] et x = an × bn + ···a0 × b0. Toutefois, pour les bases supérieures ou égales à 11, les symboles (ou chiffres) usuels (0, 1 ,..., 9) ne permettent pas une écriture non ambigüe. Par exemple, en base 11, on ne sait pas si le nombre 10 désigne 10×110 ou 1×111+0×110. Pour ces bases, il faut donc enrichir l’ensemble des symboles (ou chiffres) utilisés pour le codage. Par exemple, en base 16, très utilisée en informatique, les chiffres sont 0,1,..., 9, a, b, c, d, e, f ou a = 10, b = 11, c = 12, d = 13, e = 14 et f = 15. Dans toute la suite, afin d’éviter toute confusion, nous utiliserons la notation xb pour indiquer que le nombre x est représenté en base b. 1.3.2. Taille des codages En informatique, les nombres ne peuvent pas avoir une taille arbitrairement grande. Ils ont donc toujours une taille fixée. Déterminons la plage de nombres que l’on peut écrire en base b avec des nombres de taille n : il y a n places possibles pouvant contenir chacune un chiffre entre 0 et b − 1, soit bn nombres différents. Sur n chiffres, on écrit donc les nombres compris entre 0 et bn − 1. Cours de structure des Ordinateurs 1.3.3. Comment obtenir une écriture en base b 1.3.3.1. A partir d’un nombre en base 10` Voyons par exemple comment écrire le nombre 145 en base 8. On remarque facilement la suite d’égalités suivante : 145 = = 1 + 8 × 18 1 + 8 × (2 + 8 × 2) = 1 + 8 × (2 + 8 × (2 + 8 × 0)) = 1+2×8+2×8×8 = 1 × 80 + 2 × 81 + 2 × 82 On obtient donc 14510 = 2218. On en déduit facilement un algorithme général utilisant les opérations suivantes : la division entière : div, le modulo : mod. Data: une base b, un entier x à écrire en base b Résultat : un nombre an−1 ···a0 avec x ∈ [bn−1,bn − 1] et chaque ai ∈ [0,b − 1]. i = 0; while x≠0 do ai = x mod b; x = x div b; i = i +1; end Algorithme 1: Ecriture en base b 1.3.3.3. A partir d’un nombre en base c Dans le cas général, si on dispose de l’écriture d’un nombre en base c, le plus simple pour obtenir l’écriture en base b est de calculer la valeur du nombre puis d’appliquer l’algorithme d’écrit précédemment. Il existe cependant des cas ou` la transformation est plus simple. Imaginons que b est une puissance de c, i.e., b = ck (par exemple c = 2 et b = 16 = 24), alors on obtient l´écriture en base b à partir de l’écriture en base c en groupant les chiffres par k éléments à partir du chiffre de poids faible (i.e., le chiffre le plus à droite). Chaque groupe représente alors en base c un nombre entre 0 et b − 1. Cours de structure des Ordinateurs Par exemple si on veut passer de la base 2 à la base 16 : (101110000011)2 = ((1011) (1000) (0011))2 = (b83)16 Puisque (1011)2 = 1110 = b16, 10002 = 810 = 816, 00112 = 310 = 316. 1.4. Codage de l’information Dans un ordinateur, l’information est codé en “binaire”, i.e., en base 2. Les chiffres binaires sont appelés des bits. Un bit est donc soit un 0, soit un 1, et une information est représentée par une s´séquence de bits. Une s´séquence de 8 bits est appelée un “octet”. 1.4.1. L’arithmétique binaire L’arithmétique binaire ressemble à l’arithmétique décimale. Voici la table d’addition des nombres binaires : 0 0 1 1 + 0 — 1 — 0 — 1 — Somme Retenue 0 0 1 0 1 0 0 1 Voici un exemple d’addition et un exemple de soustraction : 1 0 1 1 0 1 1 0 1 0 Les multiplications et divisions se font sur le même mode, en adaptant les règles de l’arithmétique décimale. 1.4.2. Représentation des nombres entiers en binaires Dans les ordinateurs, tous les nombres sont représentés par des nombres binaires d’une taille fixée. Les entiers positifs sont représentés par le codage “binaire pur non-signé” découlant directement de la numération en binaire vue précédemment. 1.4.2.1. Représentation avec un bit de signe Une idée simple pour représenter les entiers positifs et négatifs est de réserver un bit (par exemple celui de gauche) pour coder le signe. Supposons qu’on code sur 8 bits, 3 sera codé 00000011 et -3 sera codé 10000011. Ce codage n’est en fait pas utilise car il comporte de nombreux inconvénients. Cours de structure des Ordinateurs D’abord, la présence de deux valeurs pour 0 (00000000) et -0 (10000000), ensuite, l’addition est compliquée : il faut examiner les signes, et faire une addition ou une soustraction selon les cas. 1.4.2.2. Représentation complément à un On note (x)1cn la représentation en complément à un sur n bits de l’entier x : si x est un nombre positif, alors on donne sa représentation binaire avec la restriction que le bit le plus à gauche doit valoir 0. On ne peut donc coder sur n bits que les entiers positifs de 0 à 2n−1 −1. Pour un nombre négatif x = −y, on inverse tous les bits de (y)1cn (on remplace les 1 par des 0 et les 0 par des 1). Le bit le plus à gauche est donc 1. L’addition est simple à réaliser : on ajoute les deux nombres puis on ajoute la retenue éventuelle. Voici par exemple les additions 6 + (−4) = 2 et −5 + 3 = −2 : L’inconvénient de ce codage est qu’il y a deux représentations de 0 : par exemple sur 4 bits, 0000 et 1111. 1.4.2.3. Représentation complément `a deux La méthode réellement utilisée est la représentation par “complément à deux”. On note (x)2cn la représentation en complément à deux sur n bits de l’entier x : Si (x)2cn = xn−1 ···x0 alors Les nombres positifs sont donc représentés en binaire classique mais sont seulement cotables les entiers allant de 0 à 2n−1 −1. Etant donné un entier positif x, on obtient −x de la façon suivante : On remplace les 1 par des 0 et les 0 par des 1, puis on ajoute 1 au résultat. Si une retenue est crée sur le dernier bit, elle est effacée. On passe de la même façon d’un nombre négatif à positif : on inverse tous les bits et on ajoute 1 au résultat. Sur 8 bits, on peut coder tous les nombres de 127 à - 128 : 127=01111111 et 128=10000000. Cours de structure des Ordinateurs Tous les nombres positifs ou nuls ont leur bit le plus à gauche à 0, et tous les nombres négatifs ont leur bit le plus à gauche `a 1. Sur n bits, on peut coder tous les nombres de 2n−1 − 1 à −2n−1. Si a2cn est la représentation d’un nombre positif, alors −a2cn correspond à l’écriture binaire classique de 28 − a Comme pour le complément à 1, l’addition et la soustraction se font sans se préoccuper des signes : les circuits de calcul en sont grandement simplifies. De plus, il n’y a qu’une seule représentation de 0. Pour l’addition, on additionne les deux nombres et on omet l’éventuelle retenue. Voici par exemple les additions 6 − 5 = 1 et −6 + 3 = −3 : Pour faire une soustraction, on utilise l’identité (a − b)2cn = a + (−b)2cn Par exemple, pour n = 8, supposons qu’on veuille faire l’opération (01010110 − 00110111)2c8, on effectue l’opération 01010110 + 11001001 = 100011111, le nombre obtenu dépasse les 8 bits, on supprime le bit de gauche supplémentaire. Finalement (01010110 − 00110111)2c8 = (00011111)2c8. 1.4.2.3.1. Débordement de capacité Le problème de coder sur un nombre fixé de bits est que l’on peut déborder lors de calculs. Par exemple, si on effectue l’opération (01000000+01000000)2c8 on obtient (10000000)2c8 c’est à dire un nombre négatif alors qu’on a additionne deux nombres positifs! Le résultat est donc faux, on dit qu’il y a débordement (overflow). Pour le codage en complément à deux, on peut facilement détecter un débordement : Il engendre forcément une erreur de signe. Il suffit donc d’observer les règles suivantes : si on additionne deux nombres de signes contraires, il ne peut pas y avoir de débordement. si on additionne deux nombres positifs, il y a débordement si et seulement si le résultat est négatif, i.e., si le bit de gauche est à 1. si on additionne deux nombres négatifs, il y a débordement si et seulement si le résultat est positif, i.e., si le bit de gauche est à 0. Cours de structure des Ordinateurs 1.4.3. Représentation des nombres à virgule 1.4.3.1. Représentation en virgule fixe Reprenons l’exemple de la base 10, et considérons le nombre 0,135. Cette écriture désigne le nombre obtenu par le calcul suivant : 1 × 10−1 + 3 × 10−2 + 5 × 10−3 De la même façon, on peut représenter des nombres à virgule en binaire. Par exemple, le nombre (1,11)2 désigne le nombre 20 + 2−1 + 2−2 = 1 + 0,5 + 0,25 = 1,75. Voici un algorithme permettant d’obtenir le codage d’un nombre 0 < x ≤ 1 : Data: une base b, un réel x dans [0,1[à écrire en base b, une précision n ≥ 1 Résultat: un nombre 0, a1 ···an ou` chaque ai ∈ [0, b−1] Variables : y réel; i = 0; y = x; while i < n do y = y × b; ai = partie entière(y); y = y − ai; i = i + 1; end Algorithm 2: Codage en base b d’un nombre réel avec précision n Lorsqu’on veut coder des nombres très grands, ou très petits, le codage binaire classique n’est plus utilisable puisqu’il faut n bits pour coder 2n nombres. 1.4.3.2. Représentation en virgule flottante Elle correspond en fait à la notation dite “scientifique” des grands nombres comme 3×1027 ou encore 8 × 10−18. Pour des raisons évidentes d’espace mémoire, il n’est possible de représenter qu’un nombre borné de réels, on parle alors plutôt de flottants Depuis les années 70, il existe un standard pour la représentation des flottants. Aujourd’hui la plupart des ordinateurs utilisent ce standard. C’est la représentation IEEE 754. Un nombre flottant est codé par 3 nombres représentés de la façon suivante : Cours de structure des Ordinateurs Signe s Le coefficient f est appelé la mantise, e est appelé l’exposant et s représente le signe : positif si s = 0 et négatif si s = 1. Le standard inclus deux représentations : simple précision et double précision. Ou Emin et Emax représentent respectivement le plus petit et le plus grand exposant cotable dans la représentation. 1.4.3.3. Codage Considérons le codage sur 32 bits. On commence par écrire la valeur absolue du réel r à coder en binaire à virgule fixe. On décale ensuite la virgule en multipliant par des puissances de 2, jusqu’à avoir un et un seul chiffre avant la virgule. Prenons par exemple r = −123,5. On le code par −1111011,1 puis on décale la virgule et on obtient −(1,1110111) × 26. On en déduit — le bit de signe s = 1 — la mantisse M = 1110111 qu’on complète pour obtenir un mot f sur 23 bits : f = 111 0111 0000 0000 0000 0000 — l’exposant E = 6 que l’on code en excès à 127 : le nombre e codé sur 8 bits est donc e = E + 127 = 133 = (1000 0101)2 Le codage de r est donc 1 1000 0101 111 0111 0000 0000 0000 0000 1.4.3.4. Décodage La valeur d’un nombre est donnée par : Cours de structure des Ordinateurs Par exemple en simple précision, considérons la représentation 1 1000 0010 001 1000 0000 0000 0000 0000 On a s = 1, e = 130 − 127 = 3 et f = 2−3 + 2−4 = 0,125 + 0,0625 = 0,1875. Le nombre codé est donc −1,1875 × 23 = −9,5. 1.4.3.5 Cas particuliers Afin de traiter certains cas spéciaux, la norme prévoit un schéma de codage comme suit (pour le codage sur 32 bits) : Lorsqu’on travaille sur de très petits nombres (exposant minimum), on n’effectue pas la normalisation (le chiffre avant la virgule est alors 0). Le nombre est alors qualifie de démoralisé. NaN (Not a Number) est une valeur spéciale destinée `à coder le résultat d’opérations incorrectes (comme la division par zéro). 1.4.4 Codage des caractères Différents standards ont étés définis pour le codage des caractères. Le code ASCII (American Standard Code for Information Interchange) crée en 1961 associe un nombre à un caractère. Chaque caractère est codé sur 7 bits. Il ne contient donc que 128 caractères différents (de 00 `à 7F en hexadécimal). Cours de structure des Ordinateurs Bien qu’étendu par la suite à un code sur 8 bits, beaucoup de caractères utilisés dans certaines langues ne sont pas représentés. L’organisme de normalisation OSI a donc défini différents standards plus adaptés aux besoins des différentes langues occidentales. Le français utilise le plus souvent ISO 8859-1, aussi nommé latin1, ou ISO 8859-15 (latin9). Enfin, Unicode créé en 1991 a pour vocation de rassembler tous ces codes afin d’avoir un code commun pour toutes les langues. Il contient plus d’un million de caractères Cours de structure des Ordinateurs CHAPITRE 2 : ALGEBRE DE BOOLE Le fonctionnement des circuits est d’écrit en utilisant l’algèbre binaire (algèbre de Boole à deux valeurs). Nous en donnons les bases dans cette section. L’algèbre de Boole est une structure algébrique : donnée par un ensemble contenant au moins deux valeurs {0,1}, et les trois opérations suivantes la conjonction (ou produit) : opération binaire qui peut être notée “.”, “et” ou bien “and”. la disjonction (ou somme) : opération binaire qui peut être notée “+”, “ou” ou bien “or”. la négation (ou complément) : opération unaire qui peut être notée “non” ou “not” ou bien par une barre sur l’opérande. et satisfaisant les axiomes suivants (par convention, la conjonction est prioritaire sur la disjonction) commutativité : pour tous a,b ∈ {0,1}, a·b=b·a associativité : pour tous a,b,c ∈ {0,1}, a · (b · c) = (a · b) · c distributivité : pour tous a,b,c ∈ {0,1}, a · (b + c) = a · b + a · c ´éléments neutres : pour tout a ∈ {0,1}, 1·a=a·1=a complément : pour tout a ∈ {0,1}, a· a =a ·a=0 0.3. a+b=b+a a + (b + c) = (a + b) + c a + (b · c) = (a + b) · (a + c) 0+a=a+0=a a+a=a+a=1 Algèbre binaire Nous allons nous intéresser à l’algèbre de Boole binaire, c’est à dire que l’ensemble des éléments de l’algèbre est {0,1} (ou bien {Vrai, Faux}). La définition suivante des opérateurs satisfait l’ensemble des axiomes. C’est celle que nous utiliserons. Cours de structure des Ordinateurs le complément a a¯ 0 1 1 0 la conjonction a 0 b 0 a.b 0 0 1 1 0 0 0 1 1 1 la disjonction a b a+b 0 0 0 0 1 1 1 0 1 1 1 1 On dit que les opérateurs ainsi définis sont un modèle des axiomes car ils vérifient chacun des axiomes. Par exemple pour 1.a = a, on a effectivement 1.1 = 1 et 1.0 = 0. 2.1.1 Propriétés Les propriétés suivantes peuvent ˆêtre déduites des axiomes Elément absorbant : a.0 = 0.a = 0 a+1=1+a=1 Absorption a.(a + b) = a a + (a.b) = a Idempotence a.a = a a+a=a Involution a=a Lois de De Morgan Ces propriétés sont déduites directement des axiomes (sans utiliser le modèle particulier. 2.2 Fonction Booléennes Une fonction booléenne d’arité n est une fonction qui prend en arguments n booléens et qui retourne un booléen. Une fonction booléenne (d’arité n) f : {0,1} n → {0,1} peut être donnée de manière extensionnelle par sa table de vérité x y z m = f(x,y,z) 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1 1 1 0 0 0 1 0 1 1 1 1 0 1 1 1 1 1 par une expression booléenne, qui est une expression définie avec les constantes et les opérateurs de l’algèbre de Boole et un certain nombre de variables x1,...,xn. Par exemple : xyz + xyz + xyz + xyz 2.2.1 Forme normale disjonctive Une expression booléenne est en forme normale disjonctive si elle est ´écrit comme — une disjonction de monômes — chaque monôme ´étant une conjonction de littéraux — un littéral ´étant soit les constantes 0,1, soit une variable x, soit le complément de x, x. Exemple : (x.y.z) + (x.z) + y Théorème 2.1 Toute expression booléenne est équivalente à une expression en forme normale disjonctive. Preuve. On suppose les variables comme étant x1,...,xn, 1. On considère la table de vérité associe à l’expression et appelons f la fonction booléenne ainsi représentée 2. supposons que f vaille 1 pour k entrées dans cette table (et donc 0 pour les 2n − k autres entrées). Comme 0+1 = 1 on peut écrire f comme f1 +...+fx ou` fi : {0,1} n → {0,1} n’est `à 1 que pour une seule entrée. 3. Maintenant pour chaque fi, il est simple de voir que le monôme y1.....yn défini par yj = xj si la ieme valeur de l’entrée est 1 et yj = xj représente précisément la fonction fi. Par exemple, une fonction booléenne f a trois paramètres x, y, z : Corollaire 2.2 Toute fonction booléenne peut ˆêtre représentée comme une expression booléenne. Preuve. Il suffit d’extraire l’expression en forme normale disjonctive de la table de vérité de la fonction booléenne. 2.2.2 Forme normale conjonctive Une expression booléenne est en forme normale conjonctive si elle ´écrit comme — une conjonction de sommes — chaque somme ´étant une disjonction de littéraux — un littéral ´étant soit les constantes 0,1, soit une variable x, soit le complément de x, x. Exemple : Théorème 2.3 Toute expression booléenne est ´équivalente `à une expression en forme normale conjonctive. Pour obtenir la forme normale conjonctive d’une expression booléenne `a n variables x1,...,xn, on construit sa table de vérité, et on ´écrit l’expression composée de la conjonction des sommes sj pour chaque ligne j valant 0. La somme sj est obtenue de la façon suivante : sj = y1 +...+yn ou : yi = xj si la ieme valeur de l’entrée vaut 0 yj = xj sinon. Pour l’exemple précédent, la forme normale conjonctive est donc (x + y + z) · (x + y + z) · ( x + y + z) · (x + y + z) 2.2.3 Simplifications de fonctions booléennes : tables de Karnaugh Nous allons voir que les fonctions booléennes sont en fait implantées `à l’aide de portes logiques constituées de transistors. Afin d’´économiser de l’espace, de l’´énergie et de l’argent, on souhaite utiliser le moins de transistors possibles. On va donc essayer de trouver pour les fonctions booléennes une représentation la plus petite possible (en termes d’expression). Pour simplifier l’expression d’une fonction booléenne, on peut tout simplement utiliser les axiomes et les propriétés de l’algèbre de Boole, afin de passer d’une expression `à une autre plus simple. Une méthode tres efficace est l’utilisation des tableaux de Karnaugh, qui permet une simplification visuelle. Cette méthode de simplification se base sur la propriété suivante : (a.b) + (a.b) = a.(b +b) = a Stipulant que si une disjonction contient deux conjonctions qui ne varient que sur une variable, positive (sans symbole non devant, b) dans l’une et n´négative (avec un symbole non devant, ¯b) dans l’autre alors on peut ´éliminer ces deux conjonctions et la remplacer par une conjonction identique mais ne contenant plus b. La première ´étape de la m´méthode consiste `à transformer la table de vérité de la fonction à simplifier en un tableau bi-dimensionnel (séparation en deux parties de l’ensemble des variables (une pour les lignes, une pour les colonnes)). Lignes et colonnes sont indexées par toutes les valuations des variables correspondantes tel que entre deux lignes (resp. colonnes) une seule valeur booléenne change. Par exemple, pour une fonction de trois variables x,y,z, la table a l’allure suivante : x y z 0 0 0 1 1 1 1 0 0 1 La première ligne (respectivement colonne), est indexée par une valuations booléenne possibles des variables choisies pour les lignes (resp. des colonnes). Dans notre exemple pour les colonnes (ie les variables xy), il y a 4 valuations possibles 00, 01, 10, 11. Les dispositions des valuations ne doivent pas ˆêtre quelconques : il faut en passant de l’une `a sa suivante, qu’un seul bit change de valeur (ainsi, on a cote-à-côte le monomes avec x et celui avec x). Il convient de noter que pour passer de la dernière à la première colonne (resp. ligne) un seul bit change dans la valuation : le tableau sera considéré de manière sphérique. Les tables de Karnaugh sont souvent présentées sous la forme ´équivalente suivante : x y z C’est celle-ci que nous allons utiliser par la suite. Une fois le tableau construit, on le remplit avec les valeurs de la fonction booléenne. Voici le tableau rempli de la fonction g dont la forme normale disjonctive est x.y.z + x.y.z + x.y.z + x.y.z Ensuite, on cherche à recouvrir tous les 1 du tableau en formant des regroupements. Chaque regroupement : ne contient que des 1 adjacents, doit former un rectangle et le nombre d’´éléments d’un regroupement doit ˆêtre une puissance de deux. On choisit toujours les plus grands regroupements possibles, et le plus petit nombre possible de regroupements recouvrant les 1 du tableau. Dans notre exemple on peut faire trois regroupements de deux éléments, et ils sont tous nécessaires au recouvrement. Chaque regroupement correspond à un monôme obtenu en utilisant la simplification 2.1 x y z xyz + xyz = xy 0 0 1 0 0 1 1 1 xyz + xyz = xz Finalement, on obtient l’expression simplifiée suivante : x.y + x.z + y.z Les règles suivantes doivent toujours être respectées xyz + xyz = yz — Tous les 1 de la table de vérité doivent ˆêtre considérés : un 1 peut ˆêtre utilisé dans plusieurs regroupement; au pire un 1 isolé est un regroupement de taille un. — Le tableau doit ˆêtre considéré de façon circulaire (on peut replier le tableau comme une sphère). — Les regroupements peuvent ´également ˆêtre de taille 4,8, ... (toutes puissances de 2) Voici un dernier exemple dans lequel on fait un regroupement de taille 1 et un regroupement de taille 4, en utilisant la propriété de circularité du tableau. CHAPITRE 3 : CIRCUITS COMBINATOIRES Un circuit combinatoire est un circuit physique élaboré à partir de composants électroniques. Il comporte des entrées et des sorties. Les entrées et sorties sont des valeurs booléennes et chaque sortie est valeur d’une fonction booléenne fonction des entrées. Les circuits combinatoires sont construits à partir de “portes logiques” 3.1 Portes logiques Les portes logiques sont des fonctions booléennes ´élémentaires; elles disposent d’entrées (`à gauche sur les dessins) et d’une sortie (`à droite). Des signaux arrivent sur les entrées (0 ou 1) et un signal est produit sur la sortie. Les tables de vérité donnent la valeur de la sortie pour chacune des portes en fonction de la valeur des entrées. Porte Symbole Table de signification vérité OUI La sortie reproduit le niveau d'entrée NON La sortie reproduit le niveau inverse d'entrée ET (AND) La sortie est au niveau 1 si toutes les entrées sont également au niveau 1. Une seule entrée au niveau 0 suffit pour que la sortie soit à 0 ET NON La sortie est (NAND) au niveau 0 si toutes les entrées sont au niveau 1. Une seule entrée au niveau 0 suffit pour que la sortie soit à 1 OU (OR) La sortie est au niveau 1 si une des entrées est au niveau 1. Une seule entrée au niveau 1 suffit pour que la sortie soit à 1 OU La sortie est NON au niveau 1 si (NOR) aucune entrée est au niveau 0. Une seule entrée au niveau 1 suffit pour que la sortie soit à 0 EXOR La sortie est au niveau 1 si une des entrées est au niveau 1 et pas les deux. S = (E1 ou E2) et pas (E1 et E2). La sortie est au niveau 1 quand les deux entrées sont contraires. EXNOR si l’une des entrées est 1 et pas les deux. S = (E1 ou E2) et pas (E1 et E2). La sortie est au niveau 0 quand les deux entrées sont contraires. IMP Il suffirait d’avoir un seul 1 parmi les deux entrées pour que S donne 1 INH Les deux entrées doivent être égales à 1 pour que la sortie donne 1 car 0 est absorbant par la multiplication De façon purement physique, les deux états logiques 0 et 1 sont représentés par un Signal électrique : typiquement, un signal compris entre 0 et 1 volt correspond au 0 et un signal entre 2 et 5 volts correspond à l´état binaire 1. Une porte logique est composée de transistors. Un transistor est un composant électronique se comportant comme un interrupteur tres rapide. Un transistor correspond en fait à un inverseur, en montant deux transistors en série (ou cascade), on obtient une porte NON-ET, et en montant deux transistors en parallèle, on construit une porte NON-OU. Toutes les autres portes peuvent ensuite être construites en utilisant ces trois portes. 21 36 3.2 Circuits combinatoire Un circuit combinatoire : est défini par un ensemble de portes reliées les unes aux autres. les sorties des portes sont reliées aux entrées d’autres portes (définissant une orientation des connexions) en suivant l’orientation des connections, il est impossible que partant de la sortie d’une porte, on revienne à l’une des ses entrées (graphe acyclique) Un circuit combinatoire peut être vu comme une porte logique (à plusieurs sorties). De l’idéal à la réalité...Les circuits combinatoires sont une idéalisation dans lesquels — le temps de propagation n’est pas pris en compte — la sortie est disponible d`es que les entrées sont pressentes En réalité le temps de passage de 0 à 1 n’est pas — immédiat (temps de parcours du courant électrique) — instantané (temps de réponse d’une porte) 3.2.1 Le circuit “Majorité” Le circuit “majorité” comporte 3 entrées A, B, C et une sortie M. La sortie M vaut 1 si une majorité des entrées valent 1. Voici la table de vérité de la fonction majorité et le circuit correspondant A B C M A B C M 0 0 0 0 0 1 0 0 0 1 0 0 0 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 1 1 1 37 La forme normale disjonctive de cette fonction est : A.B.C + A.B.C + A.B.C + A.B.C Les sorties des portes sont connectées aux entrées d’autres portes par des fils. Les fils se croisent sans contact sauf s’ils sont explicitement connectés par un •. Ce circuit implémente précisément la fonction booléenne donnée au-dessous. On note cependant qu’on utilise des portes OU et ET `a plus de deux entrées. Cela est possible car ces opérations ET et OU sont associatives. En utilisant un tableau de Karnaugh, on obtient la forme simplifiée suivante : A·B+B·C+C·A Le circuit correspondant est le suivant : A B C M Chronogramme du circuit “Majorité” : Un chronogramme est une représentation visuelle des valeurs des entrées et sorties au cours du temps. On modifie les entrées, ce qui modifie ´également les sorties. On a le plus `à gauche, les valeurs des entrées `a t = 0 et les t croissent le long de l’axe des abscisses. Une valeur haute sur l’axe des ordonnées correspond `à un signal `a 1, et une valeur base correspond `à un signal `a 0. On remarque que les entrées ne d´dépendent que des sorties : pour deux valeurs identiques des entrées (`a des endroits différents du chronogramme), les valeurs de sortie sont identiques. C’est une propriété des circuits combinatoires. Le chronogramme représenté ici est une version ”idéalisée” du chronogramme réel du circuit car on a supposé que le franchissement des portes ´était instantané. 38 entreeA entreeB entreeC sortieM 3.2.2 Les additionneurs 3.2.2.1 Le demi-additionneur Un demi-additionneur est un circuit qui prend en entrée deux bits (a et b) et qui produit la somme (addition) de ces deux nombres s et la retenue ´éventuelle r. — entrées : a et b — sorties : s la somme et r la retenue a s b r a 0 b 0 s 0 r 0 0 1 1 0 1 1 0 1 1 0 0 1 s=a⊕b r = a.b ⊕ est l’opérateur de ou-exclusif (XOR) On parle de demi-additionneur (additionneur 1 bit) : ce circuit ne peut pas être ´étendu en un additionneur n bits. Voici le circuit correspondant au demiadditionneur : a b s r 39 Il est réalisé avec une porte XOR. Vous pouvez, comme exercice, essayer de réaliser un circuit pour le demi-additionneur en n’utilisant que des portes OU et ET. 3.2.2.2 L’additionneur Un additionneur est un circuit qui prend en entrée trois bits a, b (les chiffres `à additionner) et rin une retenue d’entrée (qui peut provenir par exemple de l’addition d’autres chiffres) et qui produit la somme (addition) de ces trois nombres s et la retenue ´éventuelle rout. — entrées : a, b et rin la retenue d’entrée — sorties : s la somme et rout la retenue de sortie rin a s b rout s = a ⊕ b ⊕ rin rout = majorité (a, b, rin) Voici un circuit de l’additionneur : on utilise une porte XOR pour calculer la somme de a et b dont le résultat est sommé avec rin toujours grâce `à une porte XOR produisant la sortie s. La sortie rout est produite comme la “majorité” des entrées : en effet des que au moins deux entrées valent 1, alors une retenue doit ˆêtre produite. 40 rin a b s rout 3.2.3 Le décodeur Nous allons maintenant voir quelques circuits combinatoires qui peuvent servir de briques pour construire des circuits plus complexes. Un décodeur décode un nombre code en binaire en activant la ligne correspondant à ce nombre. Il comprend n entrées et 2n sorties. La ième sortie de décodeur vaut 1 si les n entrées forment l’entier i, ie (enen−1 ...e1e0)2 = (i)10. Un décodeur 2 vers 4 : Voici un décodeur 2 vers 4 (2 entrées - 4 sorties) représenté par sa Table de vérité (`à gauche) et les expressions booléennes de chacune des sorties (`à droite). 41 Utilisation du décodeur — Dans une UAL : supposons que nous ayons une puce capable de quatre opérations élémentaires (appelons-les, pour faire simple, opérations A, B, C et D). En attribuant un ”code opérationnel” binaire `à chacune de ces opérations, comme ceci : — code de l’opération A : 00 — code de l’opération B : 01 — code de l’opération C : 10 — code de l’opération D : 11 Un décodeur judicieusement placé peut servir à activer le circuit correspondant `à l’opération demandée. Des lors, ces deux lignes d’entrée agissent comme des ”lignes de commande” et le décodeur m´mérite vraiment son nom puisqu’il se comporte ici comme un véritable décodeur d’instruction. — Gestion de la mémoire : la mémoire composée de circuits électroniques, est organisée comme une gigantesque matrice de petites cases numérotées, chaque case ´étant capable d’abriter un nombre binaire de taille fixe. Un décodeur permet d’accéder à cette mémoire puisque il suffira de transmettre l’adresse de la case mémoire réclamée aux lignes d’entrée du décodeur pour que celui-ci active la cellule mémoire correspondante. 3.2.4 Le multiplexeur Un multiplexeur comporte 2n entrées, 1 sortie et n lignes de sélection (entrées). Il recopie sur sa sortie la valeur de la ligne d’entrée dont le numéro est codé en binaire sur les lignes d’entrées. La sortie du multiplexeur vaut la valeur de la ième entrée si l’entier i est codé sur les lignes de sélection, ie (lnln−1 ...l1l0)2 = (i)10. 42 3.3 Unité arithmétique et logique L’unité arithmétique est logique (UAL ou ALU) est le composant d’un ordinateur chargé d’effectuer les calculs. Les ALU les plus simples travaillent sur des nombres entiers, et peuvent effectuer les opérations communes : — Les opérations arithmétiques : addition, soustraction, changement de signe etc., — les opérations logiques : compléments `a un, `à deux, ET, OU, OU-exclusif, NON, NON-ET etc., — les comparaisons : test d’égalité, supérieur, inferieur, et leur ´équivalents ou ´égal, — éventuellement des décalages et rotations (mais parfois ces opérations sont externalisées). Certaines UAL sont spécialisées dans la manipulation des nombres à virgule flottante, en simple ou double précision (on parle d’unité de calcul en virgule flottante ou floating point unit (FPU)) ou dans les calculs vectoriels. Typiquement, ces unités savent accomplir les opérations suivantes : — additions, soustractions, changement de signe, — multiplications, divisions, — comparaisons, — modulos Certaines UAL, le plus souvent de la classe des FPUs, notamment celles des superordinateurs, sont susceptibles d’offrir des fonctions avancées : inverse (1/x), racine carrée, logarithmes, fonctions transcendantales (sin x, cos x, etc.), opération vectorielle (produit scalaire, vectoriel, etc.), etc. Un processeur fait appel à plusieurs UAL. D´détaillons une UAL 1 bit (les calculs sont fait sur des mots de 1 bit) : elle est capable de réaliser 4 opérations pour ses entrées A et B, à savoir, B, A et B, A ou B et (A + B) + Rin; Le résultat est alors présent sur la sortie et lorsqu’il s’agit d’une addition, la retenue de sortie est sur Rout (qui vaut 0 pour les autres opérations). Le décodeur est utilisé pour sélectionner l’opération à réaliser : on remarque que les sorties du décodeur vont activées ou désactivées au travers de portes ET (lignes de validation) les résultats des différentes opérations, ne laissant passer que l’un d’entre eux. On remarque que pour les entrées 00 du décodeur, c’est A et B qui est calculé et pour 11, (A + B) + Rin. ALU 1 bit (et, ou, non, addition) 43 CHAPITRE 4 : Le système d’exploitation 4.1. Notions générales Le système d’exploitation d’un ordinateur est le programme qui permet d’accéder aux ressources matérielles de cet ordinateur. Ces ressources matérielles sont essentiellement les organes d’entrées/sorties : clavier, écran, liaisons réseau, imprimante, disque dur, etc. Les périphériques d’entrées/sorties varient d’un modèle d’ordinateur à l’autre. Même au sein de la famille des “compatibles PC”, on trouve difficilement deux modèles dotés d’exactement les mêmes périphériques (cartes d’extension par exemple). De ce fait, les instructions à exécuter pour piloter tel périphérique (par exemple pour afficher un rectangle rouge à l’écran) diffèrent d’un ordinateur à l’autre. Le rôle principal du système d’exploitation est d’isoler les programmes des détails du matériel. Un programme désirant afficher un rectangle ne va pas envoyer des instructions à la carte graphique de l’ordinateur, mais plutôt demander au système d’exploitation de le faire. C’est le système d’exploitation qui doit connaitre les détails du matériel (dans ce cas le type de carte graphique et les instructions qu’elle comprend). Cette répartition des rôles simplifie grandement l’écriture des programmes d’application2 Le système d’exploitation est donc un programme complexe, lié à la configuration matérielle de la machine. Nous étudierons en deuxième année les principes de fonctionnement des systèmes d’exploitation. Notons simplement que tout système d’exploitation est divisé en plusieurs couches. La couche basse est responsable de la gestion du matériel, et change par exemple suivant le type de périphérique installé. Les couches plus hautes sont chargées de fonctions plus évoluées (gestion des fichiers sur disque par exemple), plus ou moins indépendantes du matériel. 2 On appelle programme d’application, ou simplement application, un programme qui effectue des traitements directement utile pour l’utilisateur de l’ordinateur (traitement de texte, base de données, etc.), par opposition aux programmes qui ne sont pas directement visibles par l’utilisateur (comme le système d’exploitation ou les divers utilitaires gérant l’ordinateur). Les systèmes d’exploitation les plus répandus sont les suivants : Système DOS Windows Type de machine Caractéristiques PC simple, répandu, peu puissant. interface graphique, très répandu, peu PC fiable. Window NT PC, stations multi-tâche. VMS Vax multi-tâche, fiable, ancien. UNIX Tous multi-tâche, fiable, flexible . 4.2. Présentation du BIOS Le BIOS (Basic Input Output System, système d’entrées/sorties de base) constitue la couche basse de tous les systèmes d’exploitation sur PC. Il est donc responsable de la gestion du matériel : clavier, écran, disques durs, liaisons séries et parallèles. Le programme du BIOS se trouve en mémoire morte (ROM), c’est à dire dans une mémoire gardant son contenu lorsque l’on interrompt son alimentation électrique 3. Chaque modèle de PC est vendu avec une version du BIOS adapté à sa configuration matérielle. 4.2.1. Les fonctions du BIOS Du point de vue de l’utilisation, on peut considérer le BIOS comme une librairie de fonctions. Chaque fonction effectue une tâche bien précise, comme par exemple afficher un caractère donné sur l’écran. L’appel de l’une de ces fonctions constitue un appel système. On pourrait envisager que les fonctions du BIOS soient simplement des procédures, que l’on appellerait avec l’instruction CALL en passant les paramètres nécessaires. Ce n’est pas le cas, le mécanisme d’appel est différent. 3 En fait, le BIOS est souvent en mémoire EEPROM ou FLASH, afin de pouvoir le remplacer plus facilement. En effet, il a été prévu de pouvoir modifier le comportement du BIOS en cours d’utilisation, par exemple pour gérer un nouveau périphérique ou pour modifier la gestion d’un périphérique existant. Le code du BIOS étant en mémoire morte, il n’est pas modifiable. De plus, le BIOS étant différent d’un ordinateur à l’autre, les adresses des fonctions changent... Prenons un exemple : soit la “fonction” du BIOS affichant un caractère (donné par son code ASCII) sur l’écran. Supposons que sur notre PC, la première instruction de cette “fonction” soit à l’adresse F1234560H. Sur le modèle d’une autre marque de notre voisin, cette même fonction pourrait être implantée à l’adresse F1234550H. 4.2.2. Vecteurs d’interruptions Le problème est résolu par l’utilisation d’une table d’indirection, la table des vecteurs d’interruptions4. Cette table est placée en mémoire principale (RAM), et contient les adresses (en ROM ou en RAM) des fonctions du BIOS. Elle est implantée à partie de l’adresse 00000000H (première case mémoire) et est initialisé par le BIOS lui même au moment du démarrage du PC (boot). Adresse contenu 0000 adresse de la première fonction du BIOS 0004 adresse de la deuxième fonction du BIOS ... ... Chaque élément de la table occupe 4 octets (adresse 32 bits). La table a 256 éléments (et occupe donc 1Ko). Dans l’exemple évoqué plus haut, si l’on sait que la fonction du BIOS qui affiche un caractère est la 33ième, on va l’appeler en lisant la 33ième ligne de la table, puis en allant exécuter les instructions à l’adresse trouvée. Sur notre PC, la table contiendrait : Adresse contenu 4 On emploie abusivement le terme d’interruption car le même mécanisme est utilisé pour les interruptions matérielles que nous étudierons plus loin. ... ... 0084H F1234560H (car 4x33 = 84H). ... ... La table des vecteurs d’interruptions contient des valeurs différentes pour chaque version de BIOS, et peut être modifiée pour pointer sur du code en mémoire principale, modifiant alors le BIOS existant. 4.2.3. Appel système : instruction INT n L’instruction INT n permet d’appeler la n-ième fonction de la table des vecteurs d’interruptions. n est un entier compris entre 0 et 255 (1 octet), car il y a 256 vecteurs d’interruptions dans la table. L’instruction INT n est semblable à l’instruction CALL, sauf que l’adresse de destination est donnée par la table des vecteurs d’interruptions, et que les indicateurs sont automatiquement sauvegardés sur la pile. De plus, l’adresse de retour complète (32 bits) est empilée, car le traitant d’interruption n’est pas nécessairement dans le même segment de code que le programme appelant. Le déroulement de INT n se passe comme suit : 1. sauvegarde les indicateurs du registre d’état sur la pile (les indicateurs sont regroupés dans un mot de 16 bits); 2. sauvegarde CS et IP sur la pile; 3. CS et IP sont chargés avec la valeur lue à l’adresse 4n, n étant le paramètre de INT. L’exécution continue donc au début du traitant d’interruption. 4.2.4. Traitants d’interruptions Un traitant d’interruption est une routine 5 appelée via la table des vecteurs d’interruption par l’instruction INT n. Les traitants d’interruptions sont très similaires à des procédures ordinaires, sauf qu’ils doivent se terminer par l’instruction IRET au lieu de RET. 5 les mots “routines”, “fonctions” et “procédures” sont synonymes dans ce cours. l’instruction IRET est très similaire à RET, sauf que CS et IP sont dépilés, et que tous les indicateurs sont restaurés à leur anciennes valeurs, sauvegardées sur la pile par INT n. Notons que les éventuels paramètres du traitant d’interruption sont toujours passés par registre. 4.2.5. Quelques fonctions du BIOS INT Fonction 0 5 Division par 0 Copie d’écran 10H Ecran 12H Taille mémoire appelé automatiquement lors de div. par 0 gestion des modes vidéo 13H Gestion disque dur (initialiser, lire/écrire secteurs) 14H Interface série 16H Clavier 4.3. (lire caractère, état du clavier) Présentation du DOS Le système DOS (Disk Operating System, système d’exploitation de disque) repose sur le BIOS, dont il appelle les fonctions pour interagir avec le matériel. Les fonctions du DOS s’utilisent comme celles du BIOS, via des vecteurs d’interruptions. Elles offrent des fonctionnalités de plus haut niveau que le BIOS (entrées/sorties, ouverture de fichiers sur disque, etc.). Les fonctions du DOS s’appellent toutes à l’aide du vecteur 21H. La valeur du registre AH permet d’indiquer quelle est la fonction que l’on appelle : MOV AH, numero_fonction INT 21H Nous avons déja mentionné la fonction 4CH du DOS, qui permet de terminer un programme et de revenir à l’interpréteur de commandes DOS : MOV AH, 4CH INT 21H 4.3.1. Description de quelques fonctions du DOS Voici à titre d’exemple quelques fonctions du DOS : Numéro Fonction 01H Lecture caractère met le code ascii lu dans AL 02H Affiche caractère code ascii dans registre DL 09H Affiche chaîne de caractèresDX=adresse début chaîne, terminée par ’$’ 0BH Lit état clavier met AL=1 si caractère, 0 sinon. Ce programme lit un caractère au clavier et l’affiche en majuscule : MOV AH, 01H ; code fonction DOS INT 21H ; attente et lecture d’un caract\‘ere AND AL, 11011111b ; passe en majuscule MOV DL, AL ; MOV AH, 02H ; code fonction affichage INT 21H ; affiche le caractere Dans la suite du cours, nous aurons l’occasion de décrire d’autres fonctions du BIOS et du DOS. 4.4. Modification d’un vecteur d’interruption en langage C Nous allons maintenant voir comment l’on peut modifier la table des vecteurs d’interruptions. On modifie un vecteur d’interruption pour installer un traitant d’interruption, “fonction” appelée par l’instruction INT n. L’installation de traitants permet de modifier le comportement du système d’exploitation, ou de communiquer avec des périphériques d’entrées sorties, comme nous l’étudierons dans le chapitre suivant. En général, le système a installé un traitant pour chaque vecteur d’interruption. L’installation d’un nouveau traitant doit donc se faire avec précautions : on va sauvegarder l’ancienne adresse, de façon à pouvoir remettre le vecteur dans son état initial à la fin de notre programme. Les vecteurs d’interruptions peuvent être modifiés en assembleur ou en langage C. Nous travaillerons ici en langage C : le principe est le même qu’en assembleur, mais les programmes sont plus intelligibles. 4.4.1. Ecriture d’un traitant d’interruption en C Nous avons vu que le compilateur générait pour chaque fonction C un prócédure en assembleur, terminée par l’instruction RET. Un traitant d’interruption est similaire à une procédure, mais terminée par IRET. En Turbo C sur PC, on peut signaler au compilateur qu’une fonction est un traitant d’interruption grâce au mot clé interrupt. La déclaration void interrupt un_traitant(); indique que la fonction nommée “un_traitant” est un traitant d’interruption. Les traitants ne retournent pas de valeur et ne prennent pas d’arguments. 4.4.2. Installation d’un traitant En Turbo C, on dispose de deux fonctions qui permettent de manipuler facilement la table des vecteurs d’interruption : setvect() et getvect()6. setvect() modifie un vecteur, et getvect() lis la valeur d’un vecteur. La valeur d’un vecteur d’interruption est l’adresse de la fonction traitante. Une variable TRAITANT de ce type se déclare comme suit : void interrupt (*TRAITANT) (); (littéralement : “old_handler est un pointeur sur une fonction de type traitant d’interruption”). 6 Ces fonctions sont déclarées dans DOS.H. CHAPITRE 5 : STRUCTURE DES COMPOSANTS HARDWARE 5.1. Les interruptions Nous étudions dans cette partie les interruptions matérielles (ou externes), c’est à dire déclenchées par le matériel (hardware) extérieur àu processeur. Nous nous appuyons ici aussi sur l’exemple du PC. 5.1.1. Présentation Les interruptions permettent au matériel de communiquer avec le processeur. Les échanges entre le processeur et l’extérieur que nous avons étudiés jusqu’ici se faisait toujours à l’initiative du processeur : par exemple, le processeur demande à lire ou à écrire une case mémoire. Dans certains cas, on désire que le processeur réagisse rapidement à un évènement extérieur : arrivé d’un paquet de données sur une connexion réseau, frappe d’un caractère au clavier, modification de l’heure 7. Les interruptions sont surtout utilisées pour la gestion des périphériques de l’ordinateurs. Une interruption est signalée au processeur par un signal éléctrique sur une borne spéciale. Lors de la réception de ce signal, le processeur “traite” l’interruption dès la fin de l’instruction qu’il était en train d’exécuter 8. Le traitement de l’interruption consiste soit : – à l’ignorer et passer normalement à l’instruction suivante : c’est possible uniquement pour certaines interruptions, nommées interruptions masquables. Il est en effet parfois nécessaire de pouvoir ignorer les interruptions pendant un certain temps, pour effectuer des traitements très urgents par exemple. Lorsque L’heure change en permanence... nous verrons que le circuit d’horloge, extérieur au processeur, envoie un signal d’interruption à intervalles réguliers (quelques ms). 8 Le processeur ne peut pas réagir plus vite; imaginez les conséquences d’une instruction abandonnée à la moitié de son exécution... 7 le traitement est terminé, le processeur démasque les interruptions et les prend alors en compte. – à exécuter un traitant d’interruption (interrupt handler). Un traitant d’interruption est un programme qui est appelé automatiquement lorsqu’une interruption survient. L’adresse de début du traitant est donnée par la table des vecteurs d’interruptions, que nous avons déja rencontré dans le chapitre précédent. Lorsque le traitant à effectuer son travail, il exécute l’instruction spéciale IRET qui permet de reprendre l’exécution à l’endroit où elle avait été interrompue. 5.2. Interruption matérielle sur PC 5.2.1. Signaux d’interruption Les processeurs de la famille 80x86 possèdent trois bornes pour gérer les interruptions : NMI, INTR, et INTA (voir figure 5.1). MPU INTA INTR N MI FIG. 5.1 – Bornes d’interruptions. NMI est utilisée pour envoyer au processeur une interruption non masquable (NMI, Non Maskable Interrupt). Le processeur ne peut pas ignorer ce signal, et va exécuter le traitant donné par le vecteur 02H. Ce signal est normalement utilisé pour détecter des erreurs matérielles (mémoire principale défaillante par exemple). INTR (Interrupt Request), demande d’interruption masquable. Utilisée pour indiquer au MPU l’arrivée d’une interruption. INTA (Interrupt Acknowledge) Cette borne est mise à 0 lorsque le processeur traite effectivement l’interruption signalée par INTR (c’est à dire qu’elle n’est plus masquée)9. 5.2.2. Indicateur IF A un instant donné, les interruptions sont soit masquées soit autorisées, suivant l’état d’un indicateur spécial du registre d’état, IF (Interrupt Flag). – 9 si IF = 1, le processeur accepte les demandes d’interruptions masquables, c’est à dire qu’il les traite immédiatement; On note INTA, pour indiquer que l’état normal de cette borne est 1 et non 0 (inversé). – si IF = 0, le processeur ignore ces interruptions. L’état de l’indicateur IF peut être modifié à l’aide de deux instructions, CLI (CLear IF, mettre IF à 0), et STI (SeT IF, mettre IF à 1). 5.2.3. Contrôleur d’interruptions L’ordinateur est relié a plusieurs périphériques, mais nous venons de voir qu’il n’y avait qu’un seul signal de demande d’interruption, INTR. Le contrôleur d’interruptions est un circuit spécial, extérieur au processeur, dont le rôle est de distribuer et de mettre en attente les demandes d’interruptions provenant des différents périphériques. MPU NM I BUS DE DONNEES INTA INTA INTR IN T PI C IR 0 Q IR Q IR 7 Q Périphérique s FIG. 5.2 – Le contrôleur d’interruptions (PIC, pour Programmable Interruption Controler). La figure 5.2 indique les connexions entre le MPU et le contrôleur d’interruptions. Le contrôleur est rélié aux interfaces gérant les périphériques par les bornes IRQ (InteRrupt reQuest). Il gère les demandes d’interruption envoyées par les périphériques, de façon à les envoyer une par une au processeur (via INTR). Il est possible de programmer le contrôleur pour affecter des priorités différentes à chaque périphérique, mais nous n’aborderons pas ce point dans ce cours. Avant d’envoyer l’interruption suivante, le contrôleur attend d’avoir reçu le signal INTA, indiquant que le processeur a bien traité l’interruption en cours. 5.2.4. Déroulement d’une interruption externe masquable Reprenons les différents évènements liés à la réception d’une interruption masquable : 1. Un signal INT est émis par un périphérique (ou plutôt par l’interface gérant celuici). 2. Le contrôleur d’interruptions reçoit ce signal sur une de ses bornes IRQ i. Dès que cela est possible (suivant les autres interruptions en attente de traitement), le contrôleur envoie un signal sur sa borne INT. 3. Le MPU prend en compte le signal sur sa borne INTR après avoir achevé l’exécution de l’instruction en cours (ce qui peut prendre quelques cycles d’horloge). Si l’indicateur IF=0, le signal est ignoré, sinon, la demande d’interruption est acceptée. 4. Si la demande est acceptée, le MPU met sa sortie INTA au niveau 0 pendant 2 cycles d’horloge, pour indiquer au contrôleur qu’il prend en compte sa demande. 5. En réponse, le contrôleur d’interruption place le numéro de l’interruption associé à la borne IRQi sur le bus de données. 6. Le processeur lit le numéro de l’interruption sur le bus de données et l’utilise pour trouver le vecteur d’interruption. Ensuite, tout se passe comme pour un appel système (interruption logicielle, voir page 65), c’est à dire que le processeur : (a) sauvegarde les indicateurs du registre d’état sur la pile; (b) met l’indicateur IF à 0 (masque les interruptions suivantes); (c) sauvegarde CS et IP sur la pile; (d) cherche dans la table des vecteurs d’interruptions l’adresse du traitant d’interruption, qu’il charge dans CS:IP. 7. La procédure traitant l’interruption se déroule. Pendant ce temps, les interruptions sont masquées (IF=0). Si le traitement est long, on peut dans certains cas ré-autoriser les interruptions avec l’instruction STI. 8. La procédure se termine par l’instruction IRET, qui restaure CS, IP et les indicateurs à partir de la pile, ce qui permet de reprendre le programme qui avait été interrompu. 5.3. Exemple : gestion de l’heure sur PC L’horloge d’un PC peut être considéré comme un “périphérique” d’un type particulier. Il s’agit d’un circuit électronique cadencé par un oscillateur à quartz (comme une montre ordinaire), qui est utilisé entre autre pour gérer l’heure et la date, que de nombreux programmes utilisent. L’horloge envoie une interruption matérielle au processeur toutes 0,055 secondes (soit 18,2 fois par secondes). Le vecteur correspondant est le numero 08H. Pour gérer l’heure, le BIOS installe un traitant pour l’interruption 08H. Ce traitant incrémente simplement un compteur, nombre entier codé sur 32 bits et toujours rangé à l’adresse 0040:006C en mémoire principale. Ainsi, si un programme désire connaitre l’heure, il lui suffit de lire cet emplacement mémoire, qui change “automatiquement” 18,2 fois par secondes. Une simple division permet alors de convertir ce nombre en heures et minutes. Remarque : 1. Les programmes usuels utilisent des appels systèmes du DOS plus pratiques, qui se basent sur la valeur de la mémoire 0040:006C et effectuent les conversions nécessaires. En langage C, on pourra utiliser la fonction time() qui appelle elle même le DOS. 2. En modifiant le vecteur d’interruption 08H, on peut faire en sorte que le PC exécute n’importe quelle tâche de façon régulière. En pratique, il est déconseillé de modifier directement le vecteur 08H. Le traitant d’horloge standard du système BIOS appelle une autre interruption (logicielle), qui est prévue pour être déroutée par les utilisateurs. 5.4. Entrées/Sorties par interruption En général, les périphériques qui recoivent des données de l’extérieur mettent en œuvre un mécanisme d’interruption : clavier, liaisons séries (modem, souris...) et parallèles (imprimantes), interfaces réseau, contrôleurs de disques durs et CD-ROMS, etc. Nous étudierons dans le chapitre suivant le cas de la liaison série. 5.4.1. Un exemple Etudions ici très schématiquement le cas d’une lecture sur disque dur, afin de comprendre comment l’utilisation d’une interruption permet de construire un système d’exploitation plus efficace. Soit un programme lisant des données sur un disque dur, les traitant et les affichant sur l’écran. Voici l’algorithme général sans utiliser d’interruption : – Répéter : 1. envoyer au contrôleur de disque une demande de lecture d’un bloc de données. 2. attendre tant que le disque ne répond pas (scrutation); 3. traiter les données; 4. afficher les résultats. Cette méthode simple est appelée entrée/sortie par scrutation. L’étape 2 est une boucle de scrutation, de la forme : – – Répéter : regarder si le transfert du disque est terminé; – Tant qu’il n’est pas terminé. La scrutation est simple mais inefficace : l’ordinateur passe la majorité de son temps à attendre que les données soit transférées depuis le disque dur. Pendant ce temps, il répète la boucle de scrutation. Ce temps pourrait être mis à profit pour réaliser une autre tâche. Très grossièrement, les entrées/sorties par interruption fonctionnent sur le modèle suivant : 1. Installer un traitant d’interruption disque qui traite les données reçues et les affiche; 2. envoyer au contrôleur de disque une demande de lecture des données; 3. faire autre chose (un autre calcul ou affichage par exemple). Dans ce cas, dès que des données arrivent, le contrôleur de disque envoie une interruption (via le contrôleur d’interrruptions) au processeur, qui arrète temporairement le traitement 3 pour s’occuper des données qui arrivent. Lorsque les données sont traitées, le traitement 3 reprend (IRET). Pendant l’opération (lente) de lecture du disque dur, le processeur peut faire autre chose (par exemple jouer aux échecs!). Dans la pratique, les choses sont un peu plus compliquées : il faut avoir plusieurs tâches à faire en même temps pour que l’utilisation des interruptions permettent un gain intéressant. Ce principe est surtout mis à profit dans les systèmes multi-tâches comme UNIX ou Windows NT, que nous étudierons en deuxième année. 6. Les entrées/sorties Les ordinateurs sont utilisés pour traiter et stocker des informations. Nous avons jusqu’ici décrit le fonctionnement du processeur et la mémoire principale. Nous allons maintenant étudier comment un ordinateur peut échanger de l’information avec son environnement; ces échanges d’informations sont nommés entrées/sorties (ou IO, Input/Output en anglais). Il peut s’agir d’un flux d’informations de l’extérieur vers l’ordinateur (acquisition via le clavier, une connexion réseau, un disque dur, etc.), ou d’un flux de l’ordinateur vers l’extérieur (écran, réseau, disque, etc.). Les techniques d’entrées/sorties sont très importantes pour les performances de l’ordinateur. Rien ne sert d’avoir un un processeur calculant très rapidement s’il doit souvent perdre son temps pour lire des données ou écrire ses résultats. Durant une opération d’entrée/sortie, de l’information est échangée entre la mémoire principale et un périphérique relié à l’ordinateur. Nous étudierons plus loin dans ce cours le fonctionnement de certains périphériques (disques durs, clavier, écran). Cet échange nécessite une interface ou contrôleur, circuit électronique gérant la connexion. L’interface réalise des fonctions plus ou moins complexes suivant le type de périphérique. Son but est surtout de décharger le processeur pour améliorer les performances du système. A la fin de cette partie, nous décrivons pour illustrer les concepts présentés le circuit d’interface série asynchrone 8250, qui équipe tous les PC. 6.1. Les bus du PC Nous avons dans les chapitres précédents décrit de façon simplifiée les bus reliant le processeur à la mémoire principale. Nous avons distingué le bus d’adresse, le bus de données et le bus de commandes (signaux de commandes type R/W). En fait, la plupart des échanges d’informations dans l’ordinateur se font sur des bus : connexions processeur/mémoire, mais aussi connexions entre le processeur et les interfaces d’entrées sorties. Il existe une grande variété de bus; chacun est caractérisé par sa largeur (nombre de bits) et sa fréquence (nombre de cycles par secondes, en Méga-Hertz). 6.1.1. Bus local Le bus local est le bus le plus rapide, sur lequel sont directement connectés le processeur et la mémoire principale. Il regroupe un bus de données un bus d’adresse et de signaux de commandes (voir le chapitre 1). Le bus local est aussi relié aux contrôleurs des bus d’extensions, et parfois à des contrôleurs de mémoire cache (voir le chapitre 9). 6.1.2. Bus d’extension du PC Les bus d’extensions (ou bus d’entrés/sorties) permettent de connecter au PC des contrôleurs d’extensions (cartes) grâce à des connecteurs spéciaux (slots sur la carte mère). Les contrôleurs d’extensions sont utilisés pour relier le PC aux périphériques d’entrées/sorties. Depuis l’apparition du PC au début des annés 80, plusieurs standards de bus d’extension ont étés proposés : ISA, MCA, EISA... MPU M P BUS LOCAL Controleur bus d’extension (ISA) CARTE GRAPHIQUE CARTE SO N FIG. 6.1 – Bus local et bus d’extension type ISA. Le bus ISA Le bus d’extension ISA (Industry Standard Architecture) est le plus répandu sur PC. De fréquence relativement basse et de caractéristiques peu puissantes, il est utilisé pour connecter des cartes relativement lentes (modems, cartes sons, ...). Les principales caractéristiques du bus ISA (PC-AT) sont : 16 bits de données, 24 bits d’adresse, 16 lignes d’interruption, fréquence 8 MHz. 6.1.3. Bus local PCI Les périphériques d’entrées/sorties “modernes” demandent des transferts d’information très importants entre la mémoire principale (MP) et le contrôleur. Par exemple, une carte graphique SVGA récente possède une mémoire vidéo de 1 à 8 Mo, et met en œuvre des transferts entre cette mémoire et la MP à 60 Mo/s. Pour permettre de tels débits, il est nécessaire de connecter le contrôleur de périphérique directement sur le bus local. Le contrôleur bénéficie ainsi du haut débit de ce bus; de plus, il peut en prendre le contrôle pour effectuer des transferts directement avec la MP sans passer par le processeur. Le premier bus PC basé sur ces principes a été le bus VLB (VESA Local Bus), qui est actuellement remplacé par le bus PCI (Peripheral Component Interface). Le bus PCI équipe la grande majorité des PC récents. Notons qu’il n’est pas réservé au processeurs INTEL, puisqu’il est aussi utilisé sur les Macintosh à base de processeurs PowerPC. Le principe du bus PCI est justement de dissocier le processeur et les bus. Cette séparation permet d’utiliser une fréquence de bus différente de celle du processeur et facilite l’évolution des machines. Les caractéristiques du bus PCI sont : 32 ou 64 bits de données, 32 bits d’adresse, fréquence de 33 MHz. Il permet de débits de 132 Mo/s en 32 bits, ou 264 Mo/s en 64 bits. MPU M P BUS LOCAL BUS LOCAL PCI CONTROLEUR BUS PCI PONT PCI/ISA CARTE MODEM CARTE VIDE O CARTE SC SI CARTE SO N F I .6.2 –PCavecbusPCI. G La figure 6.2 représente l’architecture d’un PC avec bus PCI. Le contrôleur PCI est la plupart du temps intégré sur la carte mère (il s’agit d’un circuit intégré complexe dont les performances sont cruciales pour celles du PC). Les connecteurs (slot) PCI sont réservés aux périphériques demandants de hauts débits : cartes vidéo, contrôleurs SCSI, cartes réseaux haut débit. 6.2. Bus de périphériques Ces bus permettent de relier une interface (contrôleur) de l’ordinateur à un ou plusieurs périphériques (généralement à l’extérieur de l’ordinateur). 6.2.1. Bus SCSI Le bus SCSI (Small Computer System Interface) est un bus d’entrées/sorties parallèles qui n’est pas limité aux ordinateurs PC, ni même aux micro-ordinateurs. Il permet de connecter de 1 à 7 périphériques de toutes natures (Disques durs, lecteurs CD/ROM, digitaliseurs (scanners), lecteurs de bandes (streamers), ... ). La version SCSI 1 permet un taux de transfert de 4 Mo/s (largeur 8 bits). La version SCSI 2 permet d’obtenir jusqu’a 40 Mo/s en 32 bits. Le bus SCSI équipe en standard tous les ordinateurs Apple Macintosh, et la grande majorité des stations de travail. Sur PC, il faut installer une carte d’interface, connectée soit au bus ISA soit au bus PCI suivant les performances désirées. 6.2.2. Bus PCMCIA Le bus PCMCIA (Personal Computer Memory Card International Association) est un bus d’extension utilisé sur les ordinateurs portables. Il permet la connexion de périphériques de taille très réduite (format carte bancaire, 3 à 10 mm d’épaisseur, connecteur 68 broches). 6.3. Les entrées/sorties sur PC 6.3.1. Généralités Les données échangées entre un périphérique et le processeur transitent par l’interface (ou contrôleur) associé à ce périphérique. L’interface possède de la mémoire tampon pour stocker les données échangées (suivant le type d’interface, cette mémoire tampon fait de 1 seul octet à quelques méga-octets). L’interface stocke aussi des informations pour gérer la communication avec le périphérique : – des informations de commande, pour définir le mode de fonctionnement de l’interface : sens de transfert (entrée ou sortie), mode de transfert des données (par scrutation ou interruption), etc. Ces informations de commandes sont communiquées à l’interface lors de la phase d’initialisation de celle-ci, avant le début du transfert. – des informations d’état, qui mémorisent la manière dont le transfert s’est effectué (erreur de transmission, réception d’informations, etc). Ces informations sont destinées au processeur. On accède aux données de chaque interface par le bias d’un espace d’adresses d’entrées/sorties, auquel on accède par les instructions IN et OUT du 80x86. IN AL, adresse E/S lit l’octet d’adresse spécifiée dans l’espace d’entrées/sorties et le transfère dans le registre AL. OUT adresse E/S, AL écrit le contenu de AL à l’adresse spécifiée de l’espace d’entrées/sorties. Lors de l’exécution des instructions IN et OUT, le processeur met à 1 sa borne IO/M et présente l’adresse E/S sur le bus d’adresse. Le signal IO/M indique aux circuits de décodage d’adresses qu’il ne s’agit pas d’une adresse en mémoire principale, mais de l’adresse d’une interface d’entrées/sorties. 6.3.2. Modes de transfert Le transfert des données entre le processeur et l’interface peut s’effectuer de différentes manières. On distingue les transferts sans condition et les transferts avec condition au périphérique. Les transferts sans condition sont les plus simples; ils concernent les périphériques très simples (interrupteurs, voyants lumineux, ...) qui n’ont pas de registre d’état et sont toujours prêts. Les transferts avec condition sont plus complexes : avant d’envoyer ou de recevoir des informations, le processeur doit connaitre l’état du périphérique (par exemple, en réception sur une liaison réseau, on doit savoir si un octet est arrivé avant de demander la lecture de cet octet). On distingue ici deux méthodes, les transferts par scrutation et les transferts par interruption,. 6.4. L’interface d’entrées/sorties séries asynchrones L’interface entrées/sorties séries équippe tous les PC et permet l’échange d’informations à faible débit avec un périphérique comme un modem, ou avec un autre PC, sur des distances inférieures à quelques dizaines de mètres. 6.4.1. Pourquoi une transmission série? Sur des distances supérieures à quelques mètres, il est difficile de mettre en œuvre une transmission en parallèle : coût du cablage, mais surtout interférences électromagnétiques entre les fils provoquant des erreurs importantes. On utilise alors une liaison série, avec un seul fil portant l’information dans chaque sens. Sur des distance supérieures à quelques dizaines de mètres, on utilisera des modems aux extrémités de la liaison et on passera par un support de transmission public (réseau téléphonique ou lignes spécialisées) (voir figure 6.3). FIG. 6.3 – Différents types de transmissions pour relier simplement deux PC. 6.4.2. Principe de la transmission série asynchrone En l’abscence de transmission, le niveau de la liaison est 1 (niveau de repos). Les bits sont transmis les un après les autres, en commençant par le bit de poids faible b0. Le premier bit est précédé d’un bit start (niveau 0). Après le dernier bit, on peut transmetre un bit de parité (voir cours de réseaux), puis un ou deux bits stop (niveau 1). Chaque bit a une durée de ∆, qui fixe le débit transmission. Le nombre de changements de niveaux par seconde est appelé rapidité de modulation (RM), et s’exprime en Bauds (du nom de Baudot, l’inventeur du code TELEX). On a et aussi débit binaire = bits/s Le récepteur détecte l’arrivée d’un octet par le changement de niveau correspondant au bit start. Il échantillonne ensuite chaque intervalle de temps ∆ au rythme de son horloge. Comme les débits binaires de transmission série de ce type sont faibles (< 19600 bits/s) et que les horloges de l’émetteur et du récepteurs sont suffisament stables (horloges à quartz), il n’est pas nécessaire de les synchroniser. C’est la raison pour laquelle ce type de transmission série est qualifié d’asynchrone. Lorsque les débits sont plus importants, la dérive des horloges entrainerait des erreurs, et on doit mettre en œuvre une transmission synchrone (voir cours de réseaux). Niveau logique de la liaison S T A R T 1 0 b 0 b 1 b 2 b 3 ∆ Déb ut transmission b 4 b 5 b 6 b 7 8 ∆ P A R I T E S T O P ∆ ∆ tem ps Fi n transmission durée de transmission de l’octet FIG. 6.4.1 – Transmission d’un octet b7b6b5b4b3b2b1b0 en série. 6.4.3. L’interface d’E/S séries 8250 Le composant électronique chargé de la gestion des transmissions séries asynchrones dans les PC est appelé UART (Universal Asynchronous Receiver Transmitter). Nous décrivons dans ce cours le circuit Intel 8250. Bornes de l’interface HORLOGE BUS DE DONNEES BU SD’ADRESSES Controleur d’interruptions D 0. UART D. 7 825 A 0 0 A 1 A 2 C S INTRPT SOU TSI N DS R DT R RT SCT SC D R I EMISSION (Serial OUTput) RECEPTION (Serial INput) Data Set Ready (Modem pret a communiquer) Data Terminal Ready (MPU pret a communiquer) Request To Send (Demande d’emission) Clear To Send (Modem pret a emettre) Carrier Detected (le modem recoit) Ring Indicator (appel détecté) FIG. 6.4.3 – Bornes du circuit UART 8250. Les bornes de l’interface UART 8250 sont présentées sur la figure 6.4.3. Seules les bornes essentielles à la compréhension du fonctionnement de l’interface sont représentées. 7. Les périphériques Nous étudions dans cette partie les périphériques d’entrées/sorties les plus couramment utilisés : clavier, écran et gestion des modes graphiques, disques durs et autres mémoires secondaires. Pour chaque type de périphérique, nous décrivons le principe de fonctionnement et mentionnons les performances des modèles actuellement en vente. Si les principes fondamentaux de fonctionnement restent les mêmes, il faut noter que les performances (vitesse, capacité) de la plupart des périphériques informatiques évoluent très rapidement; les chiffres donnés ici sont donc à prendre comme des ordres de grandeur typiques du matériel utilisé à la fin des années 90. 7.1. Terminaux interactifs Les micro-ordinateurs possèdent tous, sauf exception, un clavier et un écran uniques. Ce n’est pas le cas des ordinateurs plus gros, qui sont habituellement reliés à plusieurs terminaux (quelques dizaines ou centaines). Un terminal interactif est un périphérique permettant à un usager (humain) de communiquer avec un ordinateur. La communication se fait par l’intermédiaire d’un écran (ou moniteur), d’un clavier et éventuellement d’une souris. Le terme “interactif” indique que l’échange utilisateur/ordinateur à lieu en temps réel, de façon interactive (l’ordinateur répond immédiatement aux commandes de l’utilisateur). Dans le passé, on utilisait aussi des terminaux non interactif, par exemple à base de cartes perforées, et l’on devait attendre plusieurs minutes (ou heures) avant de prendre connaissance des résultats d’une commande par le bias d’une imprimante. 7.1.1. Claviers Le clavier est le périphérique le plus commode pour saisir du texte. La figure 7.1 représente le principe de fonctionnement d’un clavier. Chaque touche est un interrupteur, normalement en position ouverte. Lorsque qu’une touche est appuyée, un signal électrique est envoyée vers le codeur, circuit électronique très simple qui associe à chaque signal un code (par exemple le code ASCII de la touche). Le code est associé à chaque touche par le bias de connexions ouvertes ou fermées dans la matrice du codeur. 0 CODEUR 0 0 1 CLAVIER Niveau 1 0 1 0 0 1 1 KeyDown FIG. 7.1 – Principe de fonctionnement d’un clavier. La pression d’une touche fait passer à 1 le signal KeyDown, et le code ASCII correspondant est présentée sur le bus de sortie du codeur. Seules trois touches sont représentées. Le codeur est relié à un bus d’entrées/sorties. Il génère aussi un signal KeyDown pour indiquer qu’une touche est appuyée. Ce signal peut être utilisé pour envoyer une interruption au processeur afin qu’il traite l’information. Les codeurs réellement utilisés assurent des fonctionS supplémentaires, comme la répétition automatique des touches appuyées longtemps, la gestion d’une mémoire tampon de quelques dizaines de caractères, l’allumage de voyants, le verrouillage des majuscules, etc. 7.1.2. Ecrans et affichage L’écran de l’ordinateur, aussi appelé moniteur, est le périphérique de sortie le plus répandu. Suivant les cas, il est utilisé pour afficher du texte ou des graphiques. Un écran est constitué d’un tube cathodique 10, dont le principe est le même que celui d’un tube d’oscilloscope (voir figure 8.2). Le faisceau d’électron agit comme un pinceau, controlé par le signal vidéo émis par le contrôleur d’affichage de l’ordinateur. Chaque point de l’écran ne reste allumé qu’un Pixel allumé canon à électro ns Déflexio n vertical e Déflexio n Horizontal e ECRAN TUBE FIG. 7.2 – Tube cathodique : un faisceau d’électrons accélérés est défléchi verticalement puis horizontalement par des champs électriques; l’impact de ces électrons sur l’écran, constitué d’une fine couche de phosphore sur du verre, allume un petit point. court instant; le pinceau doit donc “repeindre” en permanence l’écran, environ 50 fois par seconde. Ce processus, appelé balayage, démarre du coin en haut à gauche de l’écran, et descend ligne par ligne jusqu’à arriver en bas à droite. C’est le contrôleur d’affichage (“carte graphique”) de l’ordinateur qui génère le signal de balayage11. Le signal vidéo est donc défini par deux fréquences importantes : la fréquence de balayage horizontal, qui mesure combien de fois par seconde le faisceau revient en début de ligne, et la c’est pourquoi les écrans sont parfois nommés CRT, pour Cathodic Ray Tube, tube cathodique. Remarque : il existe deux modes de balayage, dits entrelacé et non-entrelacé; nous ne décrivons que le mode nonentrelacé. 10 11 fréquence de balayage vertical, qui indique combien de fois par seconde le faisceau revient en haut à gauche de l’écran. Les écrans ont des caractéristiques variables : – taille : comme pour les télévisions, on mesure la diagonale de l’écran, dont la longueur est exprimée en pouces 12. Les écrans d’entrée de gamme mesurent 14 pouces; les ordinateurs dits “multimédia” et les stations de travail utilisent des écran 17”, et les graphistes des écrans 21”. – finesse (ou pitch) : indique le nombre de points par unité de longueur de l’écran, qui est donné par la finesse de la grille et la précision des faisceaux d’électrons. Plus la finesse est grande, plus l’image est précise, et plus on pourra afficher de pixels. – fréquence maximale de balayage : plus l’écran est rafraichi fréquemment, plus 1ere ligne FIG. 7.3 – Balayage des points de l’écran. l’image va apparaitre stable. Une fréquence de rafraichissement de 50 Hz, utilisé sur les écrans bas de gamme, donne une image avec des “battements” presque imperceptibles, mais qui fatiguent les yeux de l’utilisateur et sont très gênant si l’on visualise des images animées. Bien entendu, augmenter cette fréquence suppose d’utiliser une électronique plus couteuse; les écrans haut de gamme arrivent à une fréquence de balayage verticale de 120 Hz. 7.1.3. Mode alphanumérique et mode graphique L’affichage sur écran peut s’effectuer en mode texte (alphanumérique), ou bien en mode graphique. 12 un pouce (”, inch) mesure 2,54 centimètres. Affichage en mode texte Le mode texte est le plus simple, tant d’un point vue programmation que d’un point de vue implémentation. Par contre, il donne des résultats très pauvres. Ce mode d’affichage était le seul en usage jusqu’à une époque récente. En mode texte, on affiche 24 lignes de 80 caractères. Chaque caractère est codé sur 8 bits, ce qui permet d’afficher les caractères ASCII (7 bits), plus un certain nombre de caractères spéciaux dont les codes ne sont pas normalisés (donc l’effet va varier d’un type d’ordinateur à l’autre). Ces caractères spéciaux permettent d’afficher des pseudographiques (barres horizontales, obliques, symboles divers). 1 0 FIG. 7.4 – Affichage des caractères en mode texte. Le contrôleur graphique doit maintenir une mémoire de 24x80 octets, qui permet de générer le signal vidéo. Chaque caractère est affiché sur un nombre fixe de lignes (une dizaine), comme indiqué sur la figure 8.4. La mémoire vidéo est lue en séquence par le contrôleur pour générer le signal de chaque ligne. La gestion d’attribus comme la couleur, l’inversion vidéo, le clignotement peut se faire en ajoutant des bits supplémentaires au codage des caractères en mémoire vidéo. Affichage en mode graphique L’affichage en mode graphique en apparu durant les années 70 sur certaines stations de travail haut de gamme, mais ne s’est généralisé qu’avec l’apparition des ordinateurs Apple Macintosh en 1983, puis du système Windows sur PC au début des années 90. Le PC garde la trace de cette évolution, puisque le DOS fonctionne en mode texte, ainsi que de nombreuses applications encore en usage en 1997 (par exemple Turbo C version 3). Dans ce mode, les logiciels d’affichage ne manipulent plus des caractères mais des pixels. Chaque pixel correspondant à un point sur l’écran, et est caractérisé par sa couleur. L’affichage est défini par le nombre de lignes, le nombre de colonnes, et le nombre de couleurs différentes. Le nombre de lignes et colonnes varie de 640x480 (mode VGA sur PC) à 1600x1200, voire d’avantage. Le nombre de couleurs est lié au nombre de bits par pixels. En noir et blanc (2 couleurs), 1 bit par pixel suffit. Pour afficher simultanément 65536 couleur, il faut 16 bits par pixel. Les modes les plus sophistiqués utilisent 32 bits par pixel, l’intensité trois couleurs fondamentales (Rouge, Vert, Bleu) étant codée chacune sur 8 bits, les 8 bits restant pouvant coder la transparence de la couleur. Le passage du codage d’un pixel sur n bits au signal de couleur vidéo peut être effectué de différentes manières. En 24 ou 32 bits/pixel, on travaille en “couleur directe” : chaque valeur code une couleur unique (spécifiée par les composantes RVB). Par contre, en 8 ou 16 bits, on utilise une table associant à chaque valeur (entre 0 et 2n) une couleur RVB. Cette table (nommée Look Up Table (LUT) ou palette) peut être changée en cours d’utilisation; à chaque instant, on peut afficher 2n couleurs parmi 224. Mémoire vidéo La taille de la mémoire vidéo est ici beaucoup plus importante qu’en mode texte : le mode 1600x1200 en 256 couleurs demande environ 1.8 Mo, contre moins de 2 Ko pour un affichage texte. De ce fait, le volume d’information échangé entre la mémoire principale et le contrôleur graphique est très important, et l’on doit utiliser des bus d’entrées/sortie très performants pour atteindre une vitesse d’affichage satisfaisante. 7.2. Mémoires secondaires Les mémoires secondaires (ou auciliaires) sont des périphériques permettant de stocker et de retrouver de l’information de manière durable : l’information est conservée même en l’absence d’alimentation électrique, contrairement à ce qui se passe pour la mémoire principale (RAM). Les mémoires secondaires ont généralement une capacité stockage plus importante que les mémoires principales. Parmi les mémoires secondaires les plus courantes, citons les disquettes et les disques durs, basés sur un enregistrement magnétique, les CD-ROM, utilisant une lecture optique, et divers types de bandes magnétiques. 7.2.1. L’enregistrement magnétique Le principe de l’enregistrement magnétique est utilisé pour les cassettes audio et vidéo, ainsi pour les disquettes et disques durs informatiques. Il consiste à polariser un milieu magnétique (couche d’oxyde de fer déposée sur la bande ou le disque) à l’aide d’un champ électromagnétique créé par une bobine. FIG. 7.5 – Chaque cellule magnétique se comporte comme un aimant, et peut coder un bit. Un matériau magnétique (comme un aimant) possède la propriété intéressante de conserver durablement sa polarisation (orientation des particules magnétiques). La polarisation ne peut prendre que deux directions; chaque aimant peut donc être utilisé pour stocker 1 bit d’information. L’enregistrement consiste à exploiter l’information rémanente (durable) créée par une tête de lecture/écriture. Cette tête comporte une bobine qui crée un champ magnétique dont l’orientation dépend du sens de circulation du courant électrique qui la parcourt. La surface du support (bande ou disque) est divisée en petits emplacements qui vont se comporter individuellement comme des aimants (figure 8.5`). Chaque emplacement code un bit. Pour lire l’information, on fait défiler le support sous la tête de lecture, qui mesure l’orientation du champ magnétique (qui crée un courant induit dans une bobine), de laquelle on déduit l’information stockée sur chaque emplacement. Densité d’enregistrement magnétique Le volume d’information (nb de bits) que l’on peut stocker sur une longueur donnée de surface magnétique dépend de la densité longitudinale d’enregistrement, que l’on mesure en BPI (bits per inchs, bits par pouces). Cette densité est limitée par le nombre maximum de renversements d’orientation de la polarisation par unité de longueur, qui dépend du type de couche magnétique, et par la taille de la tête de lecture. Les densités typiques sont de l’ordre de 10 000 BPI. la distance entre la tête de lecture/écriture et le support est alors de l’ordre de 0,2 µm, ce qui impose une très grande propreté de la surface (voir figure 8.6). Les disques durs, qui utilisent une densité d’enregistrement très élevée, sont scellés afin éviter toute entrée de poussière. CHEVEU Tete de lecture Fumé e Empreint digital e e Couche magnétique Poussièr e SUPPORT FIG. 7.6 – Les diverses particules de poussières sont très gènantes pour l’utilisation d’un support magnétique : sont ici représentés à la même échelle la tête de lecture, une particule de fumée, une trace d’empreinte digitale, une poussière et un cheveu. 7.2.2. Les disques durs Les premiers disques durs ont été développés par IBM en 1957 et ont connu un grand succès jusqu’à maintenant. Ils permettent en effet de stocker de grands volumes d’information tout en conservant un temps d’accès assez faible, et un rapport prix/capacité avantageux. Les micro-ordinateurs sont tous équipés de disques durs depuis la fin des années 80. La capacité d’un disque dur typique de coût 4000 francs est passé de de 20 Mo en 1988 à 3 Go en 1996, soit une multiplication par 150 en dix ans! Principe d’un disque dur Une unité de disque dur est en fait constituée de plusieurs disques, ou plateaux, empilés et en rotation rapide autour du même axe (figure 8.7). Chaque face d’un plateau est lue ou écrite par une tête de lecture. Afin de simplifier le mécanisme, toutes les têtes se déplacent en même temps, radialement (seule la distance tête-axe de rotation varie). Les disques sont structurés en pistes et en secteurs, comme indiqué sur la figure 8.8. Le nombre de pistes est fixé par la densité transversale (nombre de pistes par unité de longueur radiale). Cette densité dépend essentiellement de la précision du positionnement de la tête sur le disque. Chaque piste ou secteur contient le même nombre d’octets (en fait, toutes les pistes n’ont pas la même longueur, mais la densité est plus grande sur les pistes du centre, de façon à obtenir le même volume d’information sur chaque piste). L’unité de lecture ou d’écriture sur le disque est le secteur. Le système complet est constitué d’une ensemble de disques empilés, comme représenté sur la figure 8.7. Le contrôleur du disque doit être capable d’écrire ou de lire FIG. 7.7 – Les plateaux d’un disque dur et les têtes de lectures (à droite), qui se déplacent toutes en même temps. 1 secteu Le disque dur est divisé en pistes (ici 7 pistes) Chaque piste est divisée en secteurs (ici 8 secteurs par piste) FIG. 7.8 – Division d’un plateau de disque dur en pistes et en secteurs. n’importe quel secteur. Pour repérer un secteur, il faut connaitre son plateau, le numéro de sa piste, et le numéro du secteur dans la piste. La plupart des systèmes introduisent la notion de cylindre : un cylindre est formé par l’ensemble des pistes de même position sur tous les plateaux. Un secteur est alors repéré par (figure 7.9) : – numéro de cylindre (donnant la distance tête-axe de rotation); – numéro de piste (en fait le numéro de tête de lecture à utiliser); – numéro du secteur (lié à l’angle). Temps d’accès Le temps d’accès pour lire ou écrire un secteur du disque dur dépend de la vitesse de rotation du disque, de la vitesse de déplacement des têtes et de la dimension du disque. Chaque transfert (lecture ou écriture d’un secteur) demande les opérations suivantes : 1. si les têtes ne sont pas déjà sur le bon cylindre, déplacement des têtes. On définit le temps de positionnement minimum (passage d’un cylindre au cylindre voisin), et le 5 4 5 6 3 0 1 2 3 45 4 6 tete de lecture 3 tete de lecture tete de lecture 2 1 2 7 1 0 tete de lecture 0 Numéro de piste Numeros de secteur tete de lecture rotation déplacement des tetes VUE DE DESSUS VUE DE PROFIL FIG. 7.9 – Repérage d’un secteur du disque dur. temps de positionnement moyen (passage à un cylindre quelconque, donc parcours en moyenne de la moitié du rayon). 2. attendre que le début du secteur visé arrive sous la tête de lecture : en moyenne, il faut que le disque tourne d’un demi-tour. Ce temps est appelé demi délai rotationnel. 3. transfert des données, qui dure le temps nécessaire pour faire défiler le secteur entier sous la tête de lecture. Le débit d’information maximal est déterminé par la vitesse de rotation du disque, la densité d’enregistrement longitudinale, et parfois limitée par le débit du bus d’entrées/sorties reliant le disque à l’ordinateur. Les fabriquants de disques durs indiquent en général le temps d’accès moyen et le taux de transfert maximum (débit). Cas des disquettes Les lecteurs de disquettes fonctionnent sur les mêmes principes que les disques durs, mais il n’y a que deux faces, la vitesse de rotation est beaucoup plus faible et la densité d’écriture moindre. Les disquettes actuelles ont une capacité de 1,4 Mo; il est probable qu’elles soient remplacées dans les années à venir par des disques durs extractibles miniaturisés, pouvant stocker plusieurs centaines de Mo. 7.2.3. Lecteurs de CD-ROM Les CD-ROM (Compact Disc Read Only Memory), se sont imposés ces dernières années comme des mémoires secondaires en lecture seule. Leur capacité est de 650 Mo (soit l’équivalent de 450 disquettes). Le format de stockage est identique à celui utilisé pour les disques audio. Leur (relativement) grande capacité en fait le support idéal pour livrer les logiciels de grande taille, mais aussi pour stocker des bases de données et programmes de toute nature (édition électronique,...). La spécificité du CD-ROM est que l’on ne peut pas y modifier les informations, inscrites en usine. Un disque CD-ROM est constitué d’une piste en spirale qui est lue par un faisceau laser de faible puissance. La piste est recouverte d’une fine couche de métal réfléchissant, sur laquelle sont percés des trous. La lecture s’effectue en mesurant le reflet du faisceau laser sur la piste, ce qui permet la détection des trous, donc la reconnaissance des bits 0 ou 1. Le temps d’accès et le débit des lecteurs de CD-ROM sont essentiellement déterminés par la vitesse de rotation du disque, qui est elle même limitée par la difficulté à guider le laser sur la piste. ces informations sont souvent exprimées relativement à un lecteur de première génération; on parle ainsi de lecteur “double-vitesse”, “quadruple-vitesse”, voire “x12” ou “x24”. 7.2.4. Autres supports optiques : WORM, magnéto-optiques Outre le CD-ROM, il existe plusieurs autres types de support optiques. Les disques WORM (Write Once, Read Many, écrire une fois, lire plusieurs) utilisent un second laser plus puissant qui permet de former des “trous” sur la surface réfléchissante; on peut ainsi écrire de l’information une seule fois. Les disques WORM sont vendus vierges, sous l’appellation CD-R (CD enregistrable). Les disques magnéto-optiques sont basés sur une technologie différente. Les trous sont remplacés par des différences de magnétisation d’un milieu spécial, ayant la propriété de modifier la polarité de la lumière suivant le sens de magnétisation. On associe donc un champ magnétique et un faisceau laser. Ces disques sont ré-inscriptibles à volonté; ils ont été présentés à la fin des années 80 comme les successeurs des disques durs, mais leur faible vitesse d’accès en limite actuellement l’usage aux applications d’archivage ou de sauvegarde. 7.2.5. Bandes magnétiques Les bandes magnétiques peuvent aussi être utilisées comme mémoire secondaires. La principale différence avec les disques est que l’accès à une bande est nécessairement séquentiel : si un fichier est enregistré à la fin d’une bande, il faut la rembobiner entièrement avant de d’y accéder. De ce fait, le temps d’accès moyen à un disque dur est de l’ordre de 10 ms, tandis que le temps d’accès sur une bande est de quelques secondes (100 à 1000 fois plus lent). Les bandes sont cependant très utilisées car elle permettent un stockage à très faible coût de très grandes quantité d’information (exemple : une cassette de 8mm contient 7 Go et vaut environ 100 F). Il existe un très grand nombre de standards différents pour les lecteurs de bandes, de cartouches ou de cassettes. La capacité d’une bande est déterminée par sa longueur, son nombre de pistes, et la densité d’écriture Notons enfin que certains lecteurs de bandes effectue une compression automatique des données avant écriture, ce qui permet de gagner un facteur 2 environ sur des données non préalablement compressées. 7.3. LE PROCESSEUR Le processeur est un composant électronique que nous considérons comme le cerveau ou cœur pensant de l’ordinateur car c’est lui qui exécute toutes les tâches (instructions) demandées à la machine (ordinateur). Il a pour rôle d’exécuter les programmes stockés en mémoire centrale en chargeant les instructions, en les décodant et en les exécutants l’une après l’autre. 1. unités fonctionnelles Le processeur est constitué d’un ensemble d’unités fonctionnelles reliées entre elles. Unité d’instruction ou unité de commande qui lit les données arrivant, les décode puis les envoie à l’unité d’exécution. Cette unité est constituée des éléments suivants : - Un Séquenceur (ou bloc logique de commande) chargé de synchroniser l’exécution des commandes au rythme d’une horloge. Il est ainsi chargé de l’envoi des signaux de commandes - Un Compteur ordinal contenant l’adresse de la prochaine instruction. C’est un registre contenant l’adresse de l’instruction à rechercher et pointe sur la prochaine à exécuter - Un Registre d’instruction contenant l’instruction à exécuter et contient celle en cours d’exécution - Un décodeur qui détermine l’opération à effectuer parmi toutes celles disponibles - Une horloge synchronise toutes les actions du processeur Unité d’exécution ou unité de traitement qui accomplit les tâches que lui a données l’unité d’instruction. Cette unité est composée de : - L’unité arithmétique et logique qui assure les fonctions de calcul arithmétique et des opérations logiques - L’unité de virgule flottante qui accomplit les calculs complexes non entiers que ne peut réaliser l’unité arithmétique et logique - Le registre d’état (PSW : Processor Status Word) qui stocke des indicateurs sur l’état du système Le registre accumulateur qui stocke les résultats des opérations arithmétiques et logiques Unité de gestion des bus ou unité d’entrée-sortie gère les flux d’informations. - - Chargement de la prochaine instruction à exécuter depuis la mémoire jusque dans le registre d’instruction. - Modification du compteur ordinal pour qu'il pointe sur l'instruction suivante. - Décodage de l'instruction que l'on vient de charger. - Localisation dans la mémoire des éventuelles données utilisées par l'instruction. - Chargement des données dans les registres internes de l'unité centrale. - Exécution de l'instruction. - Stockage des résultats à leurs destinations respectives. 7.3.1. Paramétrage du processeur Vérifiez si aucune patte n'est pliée, sinon, redressez là avec une petite pince avant. Insertion du processeur dans le socket en respectant les détrompeurs. Appuyez à fond sur le processeur En gardant le doigt sur le processeur, abaissez le levier de blocage du processeur. Utilisez la pâte thermique directement collée sur le ventilateur ou grattez cette pâte sur le ventilateur (avec un tournevis plat, il ne doit plus en rester) et posez de la pâte thermique sur le processeur. Positionnez le ventilateur sur le processeur. Insérez le connecteur d'alimentation du ventilateur dans le socket. 7.3.2. Caractéristiques du microprocesseur Le microprocesseur des PC est composé de plusieurs unités qui travaillent en parallèle. On appel pipeline la possibilité des unités indépendantes de travailler sur plusieurs instructions en même temps. Dans un premier temps la première unité traite la première instruction. Dans un deuxième temps la première unité traite la deuxième instruction et la deuxième unité traite la première instruction. Dans un troisième temps, la première unité traite la troisième instruction, la deuxième unité traite la deuxième instruction et la troisième unité traite la première instruction... Toutes ces unités ne sont pas présentes sur tous les processeurs. Nous verrons quelles unités sont présentes sur chacun des processeurs les plus courants. L’unité d’anticipation L’unité d’anticipation s’occupe d’aller chercher dans la mémoire les instructions à exécuter. Ces instructions sont d’abord recherchées dans la mémoire cache interne du processeur. Si elle ne s’y trouve pas, l’unité d’anticipation s’adresse à l’unité d’interface de bus afin qu’elles soient lues dans la mémoire centrale. Lors de cette opération, le contenu des adresses suivantes de la mémoire est lu également et placé dans la mémoire cache du processeur. De cette façon, les prochaines instructions recherchées seront disponibles plus rapidement. L’unité d’anticipation place l’instruction dans une queue et s’occupe d’aller chercher la suivante. Grâce à ce dispositif, l’unité d’exécution n’a pratiquement jamais besoin d’attendre que les instructions à exécuter lui soient amenées. L’unité de décodage L’unité de décodage traduit les instructions se trouvant dans la queue en une forme compréhensible par l’unité d’exécution. L’unité de contrôle et de test de protection L’unité de contrôle et de test de protection supervise l’exécution des instructions. Elle vérifie en particulier que les accès en mémoire sont valides et ne risque pas de provoquer des conflits. L’unité de virgule flottante L’unité de virgule flottante exécute les calculs qui relèvent de sa spécialité. S’il est absent, les calculs en virgule flottante sont exécutés sous forme de sous programmes, ce qui peut prendre cent fois plus de temps. L’unité arithmétique et logique L’unité arithmétique et logique exécute les instructions, à l'exception de celles prisent en charge par l’unité de calcul en virgule flottante. Registres Les registres sont des espaces de travail directement accessible par l’unité arithmétique et logique, ils constituent la mémoire la plus rapide de l’ordinateur. Il y a deux sortes de registre ceux qui sont accessibles par un programmeur en assembleur et les registres internes qui ne sont pas accessibles. Les unités de pagination et de segmentation Les unités de pagination et de segmentation traduisent les adresses logiques (lettes qu’elles sont manipulées par les programmes) en adresses physiques (correspondant aux positions réelles en mémoire). Mémoire cache La mémoire cache retient deux types d’éléments : les données et les programmes. Certains processeurs ont des caches internes indépendants pour les données et les programmes. Le contrôleur de mémoire cache doit prédire à l’aide d’algorithmes sophistiqués les données et les instructions qui seront nécessaires afin qu’elles soient placées dans la mémoire cache pour être plus rapidement accessibles. Mémoire cache ou antémémoire La mémoire Cache conçue sous la technologie RAM n’est qu’une catégorie technique car elle ne sert que de tampon entre la mémoire centrale et le microprocesseur ou mieux entre le processeur et sa périphérie. - cache primaire (L1) ou cache de niveau 1 : Interne au processeur, il est le plus rapide. C’est une mémoire intégrée directement dans le processeur et stocke séparément les programmes des données utilisées. - Cache secondaire (L2) ou cache de niveau 2 : interne ou externe au processeur dépendant du type du processeur et de la carte en présence. cette mémoire sert d’intermédiaire entre la mémoire cache de niveau 1 et la RAM. - Cache tertiaire (L3) ou cache de niveau 3 : externe au processeur et atteint déjà 2 Mo à 8 Mo de capacité avec pentium IV. Elle est constituée de la SRAM implantée directement sur la carte mère. Multiplicateur de fréquence Le multiplicateur de fréquence permet à certains processeurs de fonctionner à une fréquence interne différente de la fréquence externe. L’unité d’interface de bus L’unité d’interface de bus gère tous les échanges entre le microprocesseur et les autres composants, reliés par l’intermédiaire du bus. L’unité de prédiction de branchement L’unité de prédiction de branchement permet de traiter une instruction conditionnelle, c’est-à-dire le choix d’une d’instructions en fonction d’un test logique, il mémorise le choix effectué. S’il doit repasser par ce test ultérieurement, il emprunte le même chemin, quitte à revenir sur ses pas (en abandonnant le travail effectuer entre temps) si le résultat n’est pas celui qu’il supposait. Ainsi, les unités, servants à la préparation des instructions avant l’exécution ne se vident pas en attendant le résultat du test (résultat qui est souvent identique entre deux passages successifs, par exemple lors de l’exécution d’une boucle). Temps d’accès Le temps d’accès est le temps qui s’écoule entre la demande d’information et le début de la réception de celle-ci. Un petit temps d’accès améliore la performance d’une mémoire. Les unités utilisées pour le temps d’accès sont le milli-seconde (ms), le micro seconde (ms) et le nano-seconde (ns). 1 ms = 10-3 s = 0,001 s = 10-6 s = 0,000001 s 1 ns = 10-3 ms = 10-6 ms = 10-9 s = 0,00000001 s Vitesse de transfère La vitesse de transfert est la quantité d’information qui peut être transféré par la mémoire dans une seconde. Elle s’exprime généralement en Kilo-octets par seconde (KB/s), Megaoctets par secondes (MB/s), kilobits par secondes (Kb/s) et mégabits par secondes (Mb/s). Remarquez que le symbole pour octets est ‘B’ et que le symbole pour bit est ‘b’. On distingue généralement deux types de mémoire : la mémoire centrale (mémoire principale ou mémoire réelle) et la mémoire secondaire (mémoire auxiliaire, mémoire de masse). Calcul du temps d’accès effectif d’une mémoire avec cache. Ae = T * Ac + (1 - T) * Am - Ae : Temps d’accès efficace de la mémoire avec cache - T : Probabilité de trouver l’information dans la mémoire cache - Ac : Temps d’accès de la mémoire cache - Am : Temps d’accès de la mémoire centrale Exercice : Quel va être le temps d’accès efficace d’une mémoire avec cache si le temps d’accès à la mémoire cache est de 15 ns et le temps d’accès à la mémoire centrale est de 60 ns et la probabilité de trouver l’information dans la mémoire cache est de 95%. Ac = 15 ns Am = 60 ns T = 95% Ae = 0,95 * 15 ns + 0,05 * 60 ns Ae = 14,25 ns + 3 ns Ae = 17,25 ns Pour aller plus loin : Calcul de la probabilité de trouver l’information dans la mémoire cache. T: Probabilité de trouver l’information dans la mémoire cache Mm: Nombre de bits effectifs du bus d’adresse de la mémoire principale Mc : Nombre de bits effectifs du bus d’adresse de la mémoire cache. Exercice : Quelle est la probabilité de trouver l’information dans la mémoire cache si celle-ci a 256 KB et que la mémoire centrale est de 32 MB ? Fréquence La fréquence d’horloge appelée également cycle correspond au nombre d’impulsions par seconde. Un ordinateur à 1 Ghz possède une horloge envoyant 1000000000 de battements par seconde. Cycle de base = 1 / Fréquence interne Si nous avons un processeur de 50 MHz son cycle de base est de 20 ns. Cycle de base = 1 / (50 * 106 ) s Cycle de base = (1/5) * 10-7 s Cycle de base = 20 * 10-9 s = 20 ns Voici quelques fréquences des microprocesseurs : A chaque impulsion (top), le processeur exécute une action sous une puissance caractérisant le nombre d’instructions traitées par seconde et s’exprime en MIPS (Millions d’Instructions Par Seconde) correspondant à la fréquence du microprocesseur que divise le CPI. L’indicateur CPI (Cycle Par Seconde) permet de représenter le nombre moyen de cycles d’horloge nécessaire à l’exécution d’une instruction sur le microprocesseur. V.E= Fréquence / CPI en MIPS 8. Architecture de microprocesseur La plupart des processeurs utilisent l’une de deux architectures ci-dessous ou les deux par émulation. Ces architectures sont actuellement améliorées par les différentes technologies. CISC (Complex Instruction Set Computer ou ordinateur à jeu d’instruction complexe) consiste à câbler dans le processeur des instructions complexes, difficiles à créer à partir des instructions de base. Cette architecture est utilisée par les processeurs de type 80X86 (80286, 80386, 80486). Ce type d’architecture possède un coût élevé dû aux fonctions évoluées imprimées sur le silicium. RISC (Reduced Instruction Set Computer ou Ordinateur à jeu d’instructions réduit) n’a pas de fonctions évoluées câblées. Les programmes doivent être traduites en instructions simples, ce qui entraîne un développement plus difficile et /ou un compilateur plus puissant. Une telle architecture possède un coût de fabrication réduit par rapport aux processeurs CISC. De plus, les instructions sont exécutées en un seul cycle d’horloge ce qui rend l’exécution des programmes plus rapide CHAPITRE 6 : LES MEMOIRES 6.1 Généralités Une mémoire est un dispositif permettant d’enregistrer, de conserver et de restituer de l’information. Voici les unités utilisées pour designer des quantités de mémoire. On parle en fait de quantité adressable dans le sens ou` généralement on ne peut accéder `à l’information bit par bit : on lit ou on ´écrit en mémoire un groupe de bits. Historiquement, ce groupe est de taille 8 et on parle d’un octet. Maintenant, on parle de mot mémoire et ces mots sont de taille 16, 32 ou 64 bits. La taille de ces mots est `à distinguer de celle des mots traites par le processeur (16 bits, 32 bits, 64 bits). La taille de ces deux types de mots n´étant pas nécessairement (ou théoriquement) liée. unité de base : 1 bit (0 ou 1) octet (byte) = groupe de 8 bits mot = regroupement d’octets (8 bits, 16 bits, 32 bits, ...) ⇒ unité d’information adressable en mémoire. un Kilooctet = 210 octets = 1024 octets = 1 Ko un Megaoctet = 210 Ko = 1 Mo un GigaOctet = 210 Mo = 1 Go un TeraOctet = 210 Go = 1 To La notion de mémoire pour un ordinateur regroupe différents matériels et ne correspond pas qu’`a un seul dispositif permettant de stocker de l’information. Ces dispositifs peuvent être de différentes natures, de différentes technologies, ceci leur donnant des caractéristiques différentes. — différentes technologies : Electronique Magnétique Optique — différentes caractéristiques : 6.1.1 capacité temps d’accès débit volatilité Performances d’une mémoire Voici quelques-unes des grandeurs caractérisant les mémoires. Le temps d’accès est ce qui mesure la latence entre l’ordre donne à la mémoire (écriture/lecture) et l’exécution effective de cette ordre. temps d’accès : temps qui sépare une demande de lecture/´écriture et sa réalisation ta temps de cycle : temps minimum entre deux accès à la mémoire tc On a ta < tc (stabilisation des signaux, synchronisation, ...) débit (ou bande passante) : nombre de bits maximum transmis par seconde En cas d’accès en temps uniforme aux données n est le nombre de bits transférés par cycle Le temps de cycle est le temps minimum séparant la réalisation de deux opérations successives. 6.1.2 Types de mémoires Pour des raisons technologiques (l’augmentation de la taille d’une mémoire s’accompagne toujours de l’augmentation du temps d’accès) et des raisons ´économiques (plus vite = plus cher), on utilise différents types de mémoires. La vitesse d’une mémoire (temps d’accès et débit) est inversement proportionnelle à sa taille “usuelle”. On a le schéma suivant : vitesse − + Registres Cache Mémoire centrale Disques durs − Bandes-Disques optiques + Capacité registres vitesse (temps d’accès) < 1 ns cache 2 - 5 ns mémoire centrale disque dur 6.1.3 vitesse (débit) capacité > 50 Go/s 5 - 20 Go/s < 100 octets 100 Ko - 1 Mo 20 ns 1 Go/s 1-10 ms 300 Mo/s 256 Mo - 4 Go 50 Go 500 Go Localisations Voici la disposition des différentes mémoires dans un ordinateur. Les registres, qui constituent la “mémoire de travail” du processeur, se trouvent en son sein. La mémoire cache (copie rapide de la m´mémoire centrale) est souvent décomposée en plusieurs parties, l’une collée sur le processeur et l’autre toute proche mais sur la carte mère. Toujours sur la carte mère, la mémoire centrale (appelée mémoire vive ou RAM) qui stocke données et programmes. Finalement, hors de la carte mère, la mémoire de masse (appelée mémoire morte ou ROM) stockant les informations, généralement sous forme de fichiers. mém oire de mass e Processeur cac he Carte mère 92 6.1.4 Méthodes d’accès La méthode d’accès décrit comment accéder à une information en connaissant sa position. L’accès direct est similaire à l’accès à une case d’un tableau, on accède directement à n’importe quelle case directement par son indice. L’accès séquentiel est similaire à l’accès d’une information dans une liste chainée, il faut parcourir toutes les cellules précédant l’information d’intérêt. — Accès séquentiel pour accéder à une information, il faut parcourir toutes les informations qui la précède exemple : bandes magnétiques — Accès direct chaque information possède une adresse propre, à laquelle on peut accéder directement exemple : mémoire centrale de l’ordinateur — Accès semi-séquentiel intermédiaire entre séquentiel et direct exemple : disque dur accès direct au cylindre accès séquentiel au secteur sur un cylindre — Accès associatif une information est identifiée par sa clé on accède `à une information via sa clé exemple : mémoire cache 6.2 Types de mémoire Sur la carte mère cohabitent — Mémoires persistantes (mémoires mortes - ROM) leur contenu est fixé (ou presque) et conservé en permanence même hors alimentation électrique — Mémoires volatiles (mémoires vives - RAM) — leur contenu est modifiable 93 — et perdu hors alimentation électrique ROM = Read Only Memory 6.2.1 RAM = Random Access Memory Mémoires mortes (ROM) Les différents types de ROM ROM (Read Only Memory) : information stockée au moment de la conception du circuit. PROM (Programmable Read Only Memory) : mémoire programmable par un utilisateur final mais une seule fois EPROM (Erasable Programmable Read Only Memory) : mémoire (re)programmable et effaçable par ultraviolet. EEPROM (Electrically Erasable Programmable Read Only Memory) : mémoire (re)programmable et effaçable ´électriquement. — exemple : Bios (“flashable”) - lecteur MP3 6.2.2 Mémoires volatiles (RAM) On a deux grands types de RAM DRAM : Dynamic RAM Mémoire ´électronique `à réalisation très simple : 1 bit = 1 transistor + 1 condensateur, le condensateur stocke l’information. Le problème est que les condensateurs ont le d´défaut de se d´décharger (perdre lentement sa charge) et ils doivent ˆêtre rechargés fréquemment (rafraichissement). Durant ces temps de rechargement, la m´mémoire ne peut ˆêtre ni lue, ni ´écrite, ralentissant donc son fonctionnement (d’où` le terme de Dynamique). C’est une m´mémoire volatile car sans alimentation, les données sont perdues. Peu couteuse elle est principalement utilisée pour la m´mémoire centrale de l’ordinateur. SRAM : Static RAM Les SRAM n’ont pas besoin de rafraichissement car un bit est stocké par une bascule : 1 bit = 4 transistors = 2 portes NOR. Elle est donc ´également volatile. Elle est plus couteuse qu’une DRAM et est notamment utilisée pour les m´mémoires caches du processeur Ceci correspond `à la notion 94 de bascule utilisée pour stocker une information. — Statique : l’information n’a pas besoin d’être rafraichie — réalisation : — — Bascule RS (ou D) qui stocke l’information beaucoup plus rapide que la DRAM beaucoup plus cher que la DRAM 6.3 Registres Le processeur traite des informations; les registres sont utilisés pour stoker l’information qui va être traitées ou qui vient d’être traitées. Ils stockent les informations relatives `à une instruction : les opérandes n´nécessaires `à l’instruction, les résultats produits par l’instruction. Les registres sont au cœur du processeur, on peut donc en mettre peu (¡ 20). Ils doivent ˆêtre très rapide (cadencés `à la vitesse du processeur). Ce sont en fait les mémoires les plus rapides et les plus chères. Réalisation : — registre 1-bit = 1 bascule RS (ou D) — registre n-bits = n bascules RS (ou D) en parallèle 6.4 Bancs de registres 6.4.2Bancs de registres Un banc de registres de hauteur n et de largeur k est — un ensemble de n registres de k bits — une m´mémoire de n adresses Exemple : 95 Un banc de n registres de 3 bits avec — un port d’´écriture — deux ports de lecture (lors d’une lecture le contenu de deux registres est lu même temps.) Sur ce banc de registres, on note les 2 (bus de) sorties, qui vont permettre de lire en même temps deux contenus de registres qui vont ˆêtre stockés dans les deux registres A et B d’entrées de l’ALU. L’ALU réalise alors l’opération (ici une somme) et le résultat est place dans le registre de sortie de l’ALU. Finalement, le contenu de ce registre de sortie d’ALU est placé sur l’entrée du banc de registre pour ˆêtre lu par ce dernier. Ici, on voit que les entrées et les sorties sont représentées par des flèches ´épaisses : il s’agit de bus, plusieurs fils en parallèle regroupant plusieurs bits d’information traités en parallèle. CHAPITRE 7 : ASSEMBLEUR 7.1 Langage d’assemblage Un langage d’assemblage ou langage assembleur est un langage de bas niveau qui représente le langage machine sous une forme lisible par un humain. Les combinaisons de bits du langage machine sont représentées par des symboles dits ” mnémoniques ” , c’est-`a-dire faciles à retenir. Le programme assembleur convertit ces mnémoniques en langage machine en vue de créer par exemple un fichier exécutable. Le langage machine est le seul langage qu’un processeur puisse exécuter. Chaque famille de processeur utilise un jeu d’instructions différent. Ainsi le langage assembleur, représentation exacte du langage machine, est spécifique `à chaque architecture de processeur. Le langage machine est le langage directement interprétable par le processeur. Il est défini par un ensemble d’instructions que le processeur exécute directement. Chaque instruction correspond `à un nombre (codé selon le cas sur un octet, un mot de 16 bits,... : le format de l’instruction) et ce décompose en : une partie codant l’opération `a exécuter appelée opcode ou code opération une partie pour les opérandes Code op Opérandes Un programme en langage machine est une suite de mots codant opérations et opérandes Chaque processeur possède son propre langage machine. D’un point de vue de la programmation, le processeur offre : un certain jeu d’instructions qu’il sait exécuter. un certain nombre de registres : utilisables/modifiables directement par le programme : registres de travail - pointeur de segment Il s’agit de registres vus par le jeu d’instructions modifiables indirectement par le programme : compteur ordinal pointeur de pile registre d’instruction - registre d’´états ces registres sont manipulés implicitement par le jeu d’instructions un certain nombre de manière d’accéder `à la mémoire : modes d’adressage 7.1.1 Jeu d’instructions Le jeu d’instructions est l’ensemble des opérations ´élémentaires qu’un processeur peut accomplir. Le type de jeu d’instructions d’un processeur d´détermine son architecture. On distingue deux types d’architectures RISC (Reduced Instruction Set Computer) PowerPC, MIPS, Sparc CISC (Complex Instruction Set Computer) Pentium 87 Leurs caractéristiques sont les suivantes : RISC : jeu d’instructions de taille limitée instructions simples format des instructions petit et fixé modes d’adressage réduits CISC : jeu d’instructions de taille importante instructions pouvant ˆêtre complexes format d’instructions variables (de 1 `a 5 mots) — modes d’adressages complexes. Ces deux types ont leurs avantages et leurs inconvénients : 1. CISC Programmation de plus haut niveau Programmation plus compacte (´écriture plus rapide et plus ´élégante des applications) Moins d’occupation en mémoire et `à l’exécution complexifie le processeur taille des instructions ´élevée et variable : pas de structure fixe exécution des instructions : complexe et peu performante. 2. RISC Instructions de format standard Traitement plus efficace Possibilité de pipeline plus efficace programmes plus volumineux compilation plus compliquée Modes d’adressage 7.1.2 Les instructions du langage machine manipulent des données. Selon ou` ces données se trouvent, on parle de différents modes d’adressage. Code op Opérandes Comment interpréter Opérandes pour trouver les données de l’instruction Code op? adressage implicite : l’instruction opère sur une donnée qui se trouve `à un emplacement précis et d´exterminé du processeur (par exemple l’accumulateur). Dans ce cas, il n’est pas n´nécessaire de spécifier l’adresse du registre en question. adressage par registres : Opérandes contient le(s) numéro(s) du (des) registre(s) ou` se trouvent les données manipulées par l’instruction. adressage direct (ou direct restreint) : Opérandes est l’adresse (ou un fragment de l’adresse) ou` se trouve la donnée en m´mémoire. - adressage relatif : Opérandes contient un d´déplacement relatif par rapport `à une adresse qui se trouve dans un registre précis (par exemple, le compteur ordinal PC). adressage indirect : Opérandes contient le numéro d’un registre dont le contenu est l’adresse ou` se trouve la donnée en m´mémoire. adressage (indirect) indexé : Opérandes contient le numéro d’un registre contenant une adresse a. La donnée est en m´mémoire `à l’adresse a+i, ou` i est le contenu d’un autre registre dans Opérandes ou d’un registre spécifique, appelle registre d’index adressage immédiat : Opérandes est la valeur utilisée par l’instruction - 7.1.3 Cycle d’exécution d’une instruction Voici les différentes ´étapes de l’exécution d’une instruction. 1. Récupérer (en mémoire) l’instruction `à exécuter : RI ← Mémoire [PC] L’instruction à exécuter est présente en mémoire `à l’adresse contenue dans le compteur de programme PC et est placée dans le registre d’instruction RI. 99 2. Le compteur de programme est incrémenté : PC ← PC + 4 Par d´défaut, la prochaine instruction `à exécuter sera la suivante en m´mémoire (sauf si l’instruction est un saut). Pour cet exemple nous avons choisi PC + 4, on suppose donc que les instructions sont codées sur 4 octets. 3. L’instruction est décodée : On identifie les opérations qui vont devoir ˆêtre réalisées pour exécuter l’instruction 4. L’instruction est exécutée : elle peut modifier les registres (opérations arithmétiques lecture en m´mémoire), la m´mémoire (´écriture), le registre PC (instructions de saut) 7.2 Assembleur MIPS Nous allons travailler avec le langage assembleur MIPS, qui est l’assembleur du processeur MIPS R2000 (processeur de type RISC) Ces processeurs sont utilisés par exemple par NEC, SGI, Sony PSP, PS2. Le langage assembleur MIPS est proche des autres assembleurs RISC. 7.2.1 Processeur MIPS Processeur 32 bits constitué de 32 registres de 32 bits une mémoire vive adressable de 232 octets un compteur de programmes PC (Program Conter) sur 32 bits un registre d’instruction RI sur 32 bits Le programme est stocké en mémoire, l’adresse de l’instruction en cours d’exécution est stockée dans le registre PC et l’instruction en cours d’exécution est stockée dans le registre RI NB : une instruction est donc codée sur 32 bits. 7.2.2 Mémoire Mémoire de 232 octets = 230 mots de 32 bits. Les mots mémoires sont donc adresses par des adresses qui sont des multiples de 4. 100 bus d’adresses de 32 bits bus de données de 8 bits 7.2.3 Registres MIPS Le processeur MIPS contient 32 registres. Hormis le registre $0, appelé $zero, qui contient toujours la valeur 0, même après une ´écriture, les autres registres sont interchangeables, mais pour garantir l’interopérabilité entre pro- grammes assembleurs produits par des compilateurs différents, on a fixé des conventions d’usage qui sont d´détaillées comme suit. Les registres $a0...$a3 sont utilisés pour passer les premiers 4 paramètres d’une fonction lors d’un appel. Les registres $v0 et $v1 sont utilisés pour le renvoi de résultats. Lors de l’appel de programme, les registres $s0-$s7 sont considérés comme sauvegardes par le programme appelant et les registres $t0-$t9 comme non sauvegardés. Les pointeurs $sp, $fp contiennent les pointeurs vers la pile, et $gp des pointeurs vers les données. Les registres $k0-$k1 sont réservés par le noyau et $at par l’assembleur. Enfin, le registre $ra contient l’adresse de retour après l’appel `à une fonction. Voici le récapitulatif du nom des registres, de leur code et de leur description. 101 7.2.4 Instructions MIPS Nous donnons ici quelques exemples d’instructions. Vous pouvez vous référer `à la documentation MIPS pour avoir l’ensemble des instructions. 7.2.4.1Arithmétique Code C Assembleur A=B+C add $s0, $s1, $s2 Toutes les opérandes se trouvent dans des registres. Ici, A→$s0, B→$s1, C→$s2. Pour les instructions arithmétiques, le résultat est toujours placé dans la première opérande. Code C A=B+C+D E=F-A Assembleur add $t0, $s1, $s2 add $s0, $t0, $s3 sub $s4, $s5, $s0 Ici, A→$s0, B→$s1, C→$s2, D→$s3, E→$s4, F→$s5. Le jeu d’instruction MIPS contient toutes les opérations arithmétiques et booléennes de base. 7.2.5Pseudo-instruction move Comment traduire A=B? Sachant que A→$s0, B→$s1 et que le registre $0 vaut toujours 0 on peut ´écrire : add $s0, $0, $s1 Il vaut mieux utiliser l’instruction move : Code C Assembleur A=B move $s0, $s1 Move est une pseudo-instruction : sa traduction en langage machine est celle de add $s0, $0, $s1. 7.2.6Pseudo-instruction li li r, imm (load immediate) charge la valeur imm (sur 32 bits) dans le registre r. 102 7.2.7 Lecture-Ecriture dans la mémoire principale Les deux instructions lw (load word = lecture) et sw (store word = ´écriture) permettent les ´échanges entre la mémoire centrale et les registres. Syntaxe lw $2, 10($3) copie dans le registre $2 la valeur située dans la mémoire principale `à l’adresse m obtenue en ajoutant 10 au nombre stocké dans la registre $3. sw $2, 15($1) copie la valeur présente dans le registre $2 dans dans la mémoire principale à l’adresse m obtenue en ajoutant 15 au nombre stocké dans le registre $1. 7.2.8 Branchements conditionnels Syntaxe bne $t0, $t1, Label Si la valeur contenue dans le registre $t0 n’est pas ´égale `à celle stockée dans le registre $1 alors la prochaine instruction `à exécuter est celle placée après l’´étiquette Label beq $t0, $t1, Label Si la valeur contenue dans le registre $t0 est ´égale `à celle stockée dans le registre $1 alors la prochaine instruction `a exécuter est celle placée après l’´étiquette Label 103 Ici, i→$s0, j→$s1, h→$s2. 7.2.9 Branchements inconditionnels Syntaxe j Label La prochaine instruction à exécuter est celle placée après l’´étiquette Label : PC ← Label. jr registre La prochaine instruction `a exécuter est celle `à l’adresse se trouvant dans le registre registre : PC ← registre. jal Label La prochaine instruction `a exécuter est celle placée après l’´étiquette Label et l’adresse de l’instruction suivant l’instruction courante (adresse de retour est stockée dans $ra : $ra ← PC +4, PC ← Label. En utilisant ces instructions, on peut effectuer des branchements plus complexes que le if ...then. Voici par exemple comment programmer un if ... then ... else. 104 Ici, i→$s4, j7→$s5, h→$s6. On peut ´également programmer des boucles. Voici l’exemple d’une boucle while. li registre, valeur charge la valeur valeur dans le registre registre 7.2.10Appel de sous-programmes L’instruction jal SP permet d’exécuter le sous-programme de label SP, la sauvegarde de l’adresse de retour ´étant réalisée par cette instruction (dans le registre $31 ou $ra). 105 Cependant : - Le sous-programme peut affecter les valeurs contenues dans les registres au moment de l’appel : pas de notion de variables locales et de portée/masquage de variables. - La sauvegarde de l’adresse de retour dans un registre ne permet pas l’enchainement des appels `a des sous-programmes, encore moins des sous-programmes récursifs Solution : - Sauvegarder la valeur des registres (en m´mémoire) de l’appelant et restaurer ces valeurs `à l’issue de l’appel - Sauvegarder l’adresses de retour du programme appelant en mémoire On sauvegarde les (une partie des) registres en mémoire dans une pile. Les registres $a0-$a3 sont ceux qui ne sont pas sauvegardés car ils contiennent lors de l’appel la valeur des paramètres effectifs et au retour les valeurs retournés par le sous-programme. Appel de sous-programmes : pile Une pile est une ´mémoire qui se manipule via deux opérations : - push : empiler un ´élément (le contenu d’un registre) au sommet de la pile - pop : dépiler un ´élément (et le récupérer dans un registre) Ces deux instructions n’existent pas en assembleur MIPS, mais elles peuvent ˆêtre “simulées” - en utilisant les instructions sw et lw - en stockant l’adresse du sommet de pile dans le registre $sp (le pointeur de pile) Traditionnellement, la pile croît vers les adresses les moins ´élevées. 106 Appel de sous-programmes : politique de gestion de la pile Deux politiques de sauvegarde des registres : sauvegarde par l’appelant : le programme appelant sauvegarde tous les registres sur la pile (avant l’appel). - sauvegarde par l’appelé : le programme appelant suppose que tous les registres seront préservés par le sous-programme appelé. Quel que soit la politique utilisée, Un sous-programme doit rendre la pile intacte 7.2.11 Appel de sous-programmes : exemple On a deux sous-programmes B et C, le programme B appelle le programme C. Avant d’appeler C on souhaite sauvegarder les valeurs des registres $s0, $s1, et l’emplacement ou` se fera le retour de B dans le programme principal, stocké dans le registre $ra. Initialement, le sommet de la pile est pointe par $sp. On sauvegarde d’abord $s0 `a cet emplacement de la pile, puis $s1 `à l’emplacement suivant (donne par $sp-4) et enfin $ra est stocké en $sp-8. Avant d’appeler C, on place correctement le pointeur $sp pour qu’il puisse ˆêtre utilisé par C, on le place au prochain emplacement libre (soit $sp-12). On appelle ensuite le sous-programme C (instruction jal C). Après exécution de C, le pointeur $sp est identique `a avant l’appel (sinon le programme est incorrect). On restaure donc facilement les paramètres sauvegardés dans la pile en chargeant les valeurs contenues dans $sp+4 pour $ra, $sp+8 pour $s1, et $sp+12 pour $s0. Enfin, avant de terminer B, on remet le pointeur $sp `a sa position initiale $sp+12. Voici un fragment du sous-programme B : 107 Le schéma suivant représente la pile au début de B, puis au début de C et enfin à la fin de B. 7.3 De l’assembleur à l’exécution 7.3.1Format d’instructions MIPS Rappel : les instructions du langage machine MIPS sont codées sur 32 bits 6 bits Code op 6 2 = 64 operateurs possibles 26 bits Opérandes 108 Trois formats d’instructions : Instructions de type immédiat (Format I) utilisé pour les instructions spécifiant un opérande immédiat, les transferts m´mémoire, les branchements conditionnels Instructions de type saut (Format J) utilisé pour les sauts inconditionnels Instructions de type registre (Format R) utilisé pour coder les instructions `a trois registres (comme les opérations arithmétiques par exemple) Cours de structure des Ordinateurs Les 6 bits du Code op déterminent le format de l’instruction. 7.3.1.1 Format d’instructions I rs : registre source rt : registre cible / condition de branchement immédiat/adresse : opérande immédiate ou déplacement d’adresse lui r, imm (load upper immédiate) utilise les 16 bits de imm pour initialiser les 16 bits de poids fort du registre r, les 16 bits de poids faible ´étant mis `a 0. 7.3.1.2 Format d’instructions J Codage des adresses Les adresses dans les instructions ne sont pas sur 32 bits! - Pour les instructions de type I : 16 bits =⇒ Adresse = PC + signé (16 bits) * 4 adressage relatif - Pour les instructions de type J : 26 bits =⇒ On obtient l’adresse d’un mot m´mémoire (de 32 bits) en ajoutant devant les 26 bits les 4 bits de poids fort de PC (Il faut multiplier par 4 pour l’adresse d’un octet) 7.3.1.3 Format d’instructions R rs : registre source 1 rt : registre source 2 rd : registre destination Ass MUSENG Kayij Elie Ingénieur En Système D’information Cours de structure des Ordinateurs sa : nombre de décalage à effectuer (shift amount) fu : identificateur de la fonction sub $1,$2,$3 : soustrait $3 de $2 et place le résultat dans $1. slt $1,$2,$3 (set less than) : met $1 à 1 si $2 est inférieur à $3 et `a 0 sinon. 7.3.2 Exemple Avec i → $19, j→ $20, k→ $21 et $10 est initialise à 4. Programme chargé à l’adresse 80000 et Tstart vaut 1000 Car — — 20000 ∗ 4 = 80000 Ass MUSENG Kayij Elie Ingénieur En Système D’information Cours de structure des Ordinateurs EXERCICES Exercice 1 : 1) a. Déterminer l’équation du circuit de la figure suivante : b. Dresser la table de vérité de ce circuit c. Quelle est la fonction logique réalisée et quel est son symbole ? 2) Mêmes questions pour le circuit de la figure suivante : 3) Mêmes questions pour le circuit de la figure suivante : Exercice 2 : 1) Complétez la table de vérité correspondante au circuit logique suivant : Ass MUSENG Kayij Elie Ingénieur En Système D’information Cours de structure des Ordinateurs C B A 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 S 2) Extraire l’équation de S à partir de la table de vérité. 3) Complétez le chronogramme suivant : A B C Exercice 3 : Démontrer les relations suivantes l’aide des théorèmes de l’algèbre de Boole: Ass MUSENG Kayij Elie Ingénieur En Système D’information Cours de structure des Ordinateurs 3) Exercice 4 : Simplifier les équations logiques suivantes : Ass MUSENG Kayij Elie Ingénieur En Système D’information Cours de structure des Ordinateurs Exercice 5 : a) CONVERSION DANS D’AUTRES BASES 3. Écrire 101101102 en décimal. 4. Écrire 3456 en binaire, puis 5. Convertir 1011 1100 en hexadécimal. 0000 1000 1100 en décimal b) CODAGE EN COMPLEMENT A 2 Sur 8 bits, donner les codages en complément à 2, lorsque c’est possible, des nombres suivants c) ARITHMETIQUE BINAIRE Sur 8 bits, effectuer la somme en binaire : 101101012 + 110000112 et interpréter le résultat en écriture décimale, en arithmétique signée et non signée. Indiquer dans chaque cas s’il y a débordement. d) Complétez le tableau ci-dessous. L'indice indique la base dans laquelle le nombre est écrit e) Codez les entiers relatifs suivants sur 8 bits (16 si nécessaire) : 456, -1, -56, -5642 Ass MUSENG Kayij Elie Ingénieur En Système D’information