polycopié

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