Architecture et Syst `eme
Stefan Schwoon
Cours L3, 2020/2021, ENS Cachan
Vue abstraite d’un ordinateur
mémoire processeur
registres
adresse données instructions
assembleur
Ceci est la machine abstraite propos ´ee au programmeur.
Jusqu’aux ann ´ees 70/80 : r ´ealisation plus au moins directe de cette architecture.
Depuis : gestion de plus en plus complexe derri `ere les sc `enes (micro-architecture)
Gestion m ´emoire/processeur avanc ´ee
Besoins d’un syst `eme d’exploitation :
partage du processeur entre diff ´erents processus/utilisateurs protection et partage m ´emoire
gestion de privil `eges (mode noyau/mode utilisateur) Optimisations :
parall ´elisation (pour acc ´el ´erer le calcul) m ´emoire rapide (cache)
r ´eordonnancement d’instructions / prediction de branches r ´eduction la consommation ´energ ´etique
Remarques :
Les d ´etails techniques varient pas mal entre les diff ´erents ordinateurs/syst `emes.
Quelques d ´etails de l’exposition suivante sont valables pour un processeur Intel i7 et les versions courantes de Linux, mais les principes sont applicables
`a tous les syst `emes courants.
M ´emoire virtuelle
mémoire réelle instructions
assembleur
adresse virtuelle
adresse réelle
données
traduction
processeur registres
Les adresses fournies par les instructions assembleur sont des adresses virtuelles.
Une unit ´e d ´edi ´ee (Memory management unit, MMU) les traduit vers des adresses physiques.
La traduction est telle qu’un processus n’a acc `es qu’ `a la m ´emoire qui lui est propre (au moins, en th ´eorie. . . ).
Traduction m ´emoire virtuelle ↔ r ´eelle
Exemple : traduction sur un processeur Intel 64-bit Espace virtuel :
adressage avec 48 bits (donc th ´eroriquement 256 Tera) d ´ecoup ´e en pages (bloc de m ´emoire contigu ¨e)
taille d’une page : 1 GB, 2 MB, 4KB, selon le cas une adresse se d ´ecoupe donc en:
– num ´ero de page (les bits les plus significatifs) – ´ecart/offset (les bits les moins significatifs)
Visualisation
Une m ´emoire virtuelle traduit donc le num ´ero d’une page virtuelle vers une page r ´eelle, en gardant l’ ´ecart: X
X X 7 X 5 X X X 3 4 X 6 1 2
page virtuelle
MEMOIRE
VIRTUELLE MEMOIRE
VIVE
cadre de page
0k-4k 4k-8k 8k-16k 16k-20k 20k-24k 24k-28k 28k-32k 32k-36k 36k-40k 40k-44k 44k-48k 48k-52k 52k-56k 56k-60k 60k-64k
0k-4k 4k-8k 8k-16k 16k-20k 20k-24k 24k-28k 32k-36k
Propri ´et ´es de la traduction:
partielle, injective
r ´ealis ´ee `a l’aide d’un tableau de pages propre `a chaque processus, cr ´e ´e et maintenu par le noyau
Un registre d ´edi ´e (CR3) contient le pointer vers le tableau du processus actuel.
Lorsque le syst `eme bascule entre deux processus, c’est ce registre qui change de valeur.
Remarques
Lors de l’ex ´ecution du processus, les acc `es m ´emoire se font ind ´ependamment du noyau, le mat ´eriel s’en occupe.
Certains appel syst `eme (p.ex. malloc, brk) modifient le tableau de traduction.
Traitement d’un acc `es m ´emoire ill ´egal :
le processeur d ´eclenche une interruption ;
le syst `eme rattrape cette exception et envoye un signal (SIGSEV) au processus ;
le signal termine le processus (sauf s’il le rattrape).
D ´etails de la pagination
Traduction r ´ealis ´ee `a l’aide d’un trie (tableau `a plusieurs niveaux).
Une partie des pages r ´eelles (de taille 4 KB) est utilis ´ee pour stocker les tableaux.
4 KB contiennent 512 = 29 adresses `a 64 bits.
Dans le tableau de premier niveau on utilise les 9 bits les plus significatifs pour obtenir l’adresse d’un bloc de niveau 2.
Apr `es 4 niveaux (4 × 9 = 36) on obtient l’adresse d’un bloc de 4 KB (4096 = 212).
Les 16 bits non-utilis ´es stockent des informations sur les privil ´eges:
acc `es en ´ecriture, page ex ´ecutable, acc `es privil ´egi ´e (en mode noyau seulement), . . .
Organisation de la m ´emoire virtuelle
Sous Linux, un processus vit dans la moiti ´e basse de la m ´emoire virtuelle (bit 47 = 0).
La partie haute est reserv ´e au noyau.
Organisation en code, tas et pile:
CODE TAS PILE
cache 0..FF
PARTITION SWAP CODE
TAS PILE
RAM 0..777
777...FFF FFF7...FFFF
Gestion du tas
Une grande partie de l’espace virtuelle ne correspond `a aucune page r ´eelle (et les acc `es `a ces adresses d ´eclenchent une violation de segment).
Un processus peut ´elargir la taille de son tas avec brk.
malloc / free : Fonctions en mode utilisateur qui organisent le tas (font appel `a brk si n ´ecessaire).
Ces fonctions utilisent un partie du tas pour organiser les allocations.
Les bogues (d ´ebordement de m ´emoire) peuvent corrompre cette information, m ´enant `a des effets secondaires non pr ´evisibles.
Translation lookaside buffer (TLB)
Avec le principe ´evoqu ´e pr ´ec ´edemment, chaque acc `es m ´emoire virtuel se traduit en cinq acc `es r ´eels → inefficace
Du coup, on m ´emorise les pages utilis ´ees le plus souvent dans le TLB (m ´emoire associative mais limit ´ee).
Attention, une m ˆeme adresse virtuelle correspond `a plusieurs adresses r ´eelles, en fonction du processus:
Certains processeurs r ´ecents offrent un r ´egistre stockant l’identifiant du processus actuel, pris en compte par le TLB.
Dans d’autres processuers, le TLB doit ˆetre invalid ´e quand on bascule vers un autre processus.
Les caches
registers
CPU L1
cache main IC
cacheL2 main
memory secondarymemory
Id ´ee: garder les donn ´ees utilis ´ees souvents dans une m ´emoire sp ´eciale rapide, mais de taille limit ´ee
Facteurs limitants : co ˆut, espace physique limit ´e
Cache `a plusieurs niveaux, les cache distants sont plus lents mais aussi plus grands
Transparent : Le programmeur acc `ede `a une adresse virtuelle, le contenu se trouve dans la m ´emoire principale ou dans l’un des caches.
DRAM vs SRAM
DRAM (dynamic random-access memory)
T C access
data
r ´ealisation compacte (p.ex. un seul transistor + capaciteur) interpr ´etation: capaciteur charg ´e = “1”
lecture d ´estructive, fuite dans les capaciteurs → r ´echarge p ´eriodique compact mais lent, typiquement utilis ´e pour m ´emoire principale
DRAM vs SRAM
SRAM (static random-access memory)
p.ex. r ´ealisation par une bascule D
moins compact mais plus rapide, utilis ´e pour les caches p.ex. L1 = int ´egr ´e dans le CPU, L2 = dans un autre chip
Une adresse dans le cache L1 est fournie tr ´es rapidement (∼ 4 cycles).
Pour r ´ecup ´erer une adresse dans la m ´emoire principale, il faut une centaine de cycles !
M ´emoire secondaire
(aussi appell ´ee va-et-vient, swap space)
zones de m ´emoire virtuelles stock ´ees (temporairement) sur disque dur m ´ecanisme sp ´ecial de pagination:
une page virtuelle peut ˆetre marqu ´ee comme “residant en m ´emoire virtuelle”
lors d’un acc `es `a une telle page, le processeur d ´eclenche une interruption l’interruption est capt ´ee par le noyau qui lib `ere une page m ´emoire r ´eelle pour y stocker la page virtuelle, puis change la table de pagination
le processeur r ´esume son travail et d ´elivre le r ´esultat transparent pour le processus, mais tr `es lent
R ´ealisation d’un cache
Grosso modo, le cache fonctionne comme une petite m ´emoire virtuelle : on d ´ecoupe la m ´emoire en petites pages (appell ´ees cache line),
p.ex. 64 octets pour le L1 au i7
le cache stocke un nombre limit ´e de lignes
lors d’un acc `es m ´emoire, on teste si la ligne de cache est stock ´e au cache (*) si oui, on utilise le cache
sinon, on r ´ecup `ere la ligne depuis la m ´emoire principale et on vire une autre ligne du cache.
(*) test par m ´emoire associatif, similaire au TLB
R ´eordonnancement d’instructions
Un processeur se trouvent face `a des instructions de dur ´ee variable : raisons inh ´erentes (instructions complexes vs simples)
d ´elais dus aux acc `es m ´emoire (et p ´eriph ´erique)
Pour acc ´el ´erer le calcul et mieux utiliser les r ´esources, les processeurs font de nombreuses optimisations derri `ere les sc `enes :
(d ´ecoupage d’instructions d’assembleur en micro-instructions)
r ´eordonnancement d’instructions consid ´er ´ees comme ind ´ependantes (read before write dans l’Intel, voir l’Algorithme de Peterson)
repartition entre plusieurs unit ´es d’ex ´ecution en parall `ele
Ex ´ecution sp ´eculative
Supposons que le processeur doit ex ´ecuter un branchement conditionnel, alors que le r ´esultat de la condition n’est pas encore connue (p.ex. en raison des
acc `es m ´emoire),
Il peut donc commencer `a ex ´ecuter une branche (ou les deux) en attendant l’ ´evaluation de la condition. Le r ´esultat de la mauvaise branche sera alors invalid ´ee.
Pour savoir quelle branche devrait ˆetre ex ´ecut ´ee, le processeur poss `ede une unit ´e pour la pr ´ediction des branches.
Failles Spectre et Meltdown
Failles d ´ecouvertes en 2017 / 2018 Principe de Spectre:
Un attaquant fournit un param `etre hors limite `a une fonction victime.
La fonction victime teste si le param `etre est bon et le rej `ete sinon.
Pourtant, la pr ´ediction de branche fait une ex ´ecution sp ´eculative avec le mauvais param `etre.
Le mauvais param `etre fait acc `eder la fonction `a une valeur s ´ecr `ete.
En fonction de la valeur s ´ecr `ete la performance du cache sera diff ´erente.
→ la valeur s ´ecr `ete peut ˆetre d ´ecouverte
Failles Spectre et Meltdown
Failles d ´ecouvertes en 2017 / 2018 Principe de Meltdown:
Le noyau garde toute la m ´emoire physique dans une partie de la m ´emoire virtuelle. Le descripteur de ces pages ne permet que des acc `es par le noyau.
Un attaquant y acc `ede quand m ˆeme.
Cette acc `es correspond `a plusieurs micro-instructions:
r ´ecup ´erer le descripteur de pages, tester le r ´esultat, obtenir la case m ´emoire ou rejeter l’acc `es, . . .
Effet de cache et d’ex ´ecution sp ´eculative: on r ´ecup `ere la case m ´emoire sp ´eculativement.
L’effet dans le cache peut ˆetre m ´esur ´e comme dans Spectre.
→ l’attaquant d ´ejoue la protection m ´emoire