Architecture1 (partie1)

publicité
Systèmes temps réel et systèmes embarqués
Architecture des ordinateurs
Loı̈c Cuvillon
Ecole Nationale Supérieure de Physique de Strasbourg
28 septembre 2011
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
1 / 82
Sommaire
1
Processeur et jeu d’instructions
Architecture ARM : principes
Architecture Intel et Assembleur x86
Branchements et leur prédiction
La Pile d’exécution
2
Du source à l’exécutable
Le format ELF
Le code relogeable
L’exécutable et son chargement
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
2 / 82
Bibliographie
Bibliographie
Architecture :
Architecture de l’ordinateur, 5ème édition, Andrew Tanenbaum, Pearson
education, 2005. par le créateur de l’OS Minix
Documentation technique :
Intel Architecture Software Developer’s Manuel
ARM Architecture Reference Manual
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
3 / 82
Bibliographie
Notation
Norme SI, IEEE, . . .
1 octet = 8 bits (b :bits)
1 Ko = 1000 octets (1KB, B :Bytes)=8000 bits
1 Mo = 104 octets
1 Go = 106 octets
(convention pour les disques durs)
1 Kio = 1 KibiOctet =1024 octets= 210 octets
1 Mio = 220 octets
1 Gio = 230 octets
Convention du cours, des programmeurs et systèmes (OS) :
1Ko =1024 octets. . .
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
4 / 82
Bibliographie
Notation
Représentation de 177 dans une base
décimal : 177 (#177)
binaire : 10110001
hexadécimal : 0xB1 ou B1h (note : 1 chiffre en hexa= 4bits)
Représentations possibles d’un octet
00000000
00000001
00000010
01111010
11111110
11111111
Entier non signé
0
1
2
122
254
255
Loı̈c Cuvillon (ENSPS)
Entier signé (complt. à 2)
0
1
2
122
-2
-1
Systèmes temps réel et systèmes embarqués
ASCI
/NUL
/SOH
/STX
z
♭
ÿ
Année scolaire 2010-2011
5 / 82
Bibliographie
Notation
Nombre décimaux (simple précision IEEE 754) :
n = (signe : s) ∗ 1.m ∗ 2e−127
31
s
23
0
e
m: mantisse
exemple : 0x40200000 = 1.25 ∗ 21 = 2.5
31
23
0 10000000
positif
Loı̈c Cuvillon (ENSPS)
128
0
01000000000000000000000
2 −2=0.25
Systèmes temps rXKCD.com
éel et systèmes embarqués
Année scolaire 2010-2011
6 / 82
Bibliographie
Notation
Little/Big Endian
Petit/Gros boutiste (étymologie : voyage de Gulliver)
exemple : la valeur 433=01B1h nécessitant 2 octets en mémoire
Big endian : most significant bit (MSB : 01h) en premier
Little Endian : lest significant bit (LSB : B1h) en premier
Little-Endian (x86,arm)
adresse mémoire 00 01
B1 01
Big-Endian (powerpc,arm,mips)
adresse mémoire 00 01
01 B1
Protocole IP : big endian (pour tous, interopérabilité)
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
7 / 82
Processeur et jeu d’instructions
Plan
1
Processeur et jeu d’instructions
Architecture ARM : principes
Architecture Intel et Assembleur x86
Branchements et leur prédiction
La Pile d’exécution
2
Du source à l’exécutable
Le format ELF
Le code relogeable
L’exécutable et son chargement
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
8 / 82
Processeur et jeu d’instructions
Architecture ARM : principes
Architecture ARM (Advance RISC Machine)
processeur RISC 32 bit
Reduced Instruction Set Computer ; instr. de taille fixe (32bits)
architecture ”load and store”
(opération arithmétique réalisable uniquement entre registres)
chaque instruction fait peu de travail mais rapidement
avantages : architecture épurée et fréquence d’exécution rapide
inconvénient : programme plus long (2x) que le même en CISC
populaire dans l’embarqué : lego mindstorm, nintendo DS ; apple
ipod,iphone (consommation électrique)
la société ARM
ne fabrique pas de processeurs mais les dessine !
vend des licences et ses dessins à des fondeurs
perçoit des royalties sur les processeurs vendus
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
9 / 82
Processeur et jeu d’instructions
Architecture ARM : principes
L’architecture externe du ARM
bus d’adresses 32 bits :
4Go de RAM possible ;
bus de données
(+ instruction : Archi. Van
Neumann)
2 lignes d’interruptions ;
nReset : réinitialisation ;
nRW : sélection
écriture/lecture
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
10 / 82
Processeur et jeu d’instructions
Architecture ARM : principes
Fonction d’un processeur (Central Processing Unit)
Execution séquentielle d’instructions au travers d’un pipeline
Etapes du pipeline ARM7
Fetch Instruction
Decode
Execute
Loı̈c Cuvillon (ENSPS)
Fetch : Récupérer le code de
l’instruction à exécuter
Decode : Décode instruction et
registres à utiliser
(préparation des chemins de
données)
Execute : Exécution instruction
lecture registres ;
opération ;
écriture résultat registre ;
...
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
11 / 82
Processeur et jeu d’instructions
Architecture ARM : principes
Architecture Interne d’un processeur
Single Core CPU
Address bus
R1
R2
Data bus
Memory
R3
PC
Decode
IR
...
A
and Control Unit
Bus source
selection
B
ALU
ALU operation mode
C
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Registres : stockage de
mots (16, 32, 64 bits
suivant architecture)
ALU : Unité Arithmétique
et Logique ;
+,-,*,/,ET,OU,XOR,
décalage,. . .
Unité de décodage et
commande : génération
signaux de commande
(opération ALU, routage
des bus A,B et C).
Bus mémoire :
Année scolaire 2010-2011
12 / 82
Processeur et jeu d’instructions
Architecture ARM : principes
Architecture Interne d’un processeur
Registres
Single Core CPU
PC (R15) : Programme Counter
Address bus
R1
R2
Data bus
R3
Decode
IR
...
A
B
ALU
ALU operation mode
C
Loı̈c Cuvillon (ENSPS)
and Control Unit
Bus source
selection
PC
Memory
adresse de l’instruction en
cours ;
incrémenté par le CPU ;
(ou IP, instruction pointer)
IR : mot de l’instruction en cours
R1,R2,R3.. R14 : registres à
usages généraux
CPSR : current program status
register (flags sur résultat inst. :
Zero, Negatif)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
13 / 82
Processeur et jeu d’instructions
Architecture ARM : principes
ISA : Instruction Set Architecture
Jeu d’instructions d’un CPU
Langage machine
langage natif du processeur définit par les concepteurs
seul et unique pour un processeur
un code binaire
l’Assembleur (Assembly language) :
représentation symbolique du langage machine
usage de mnémoniques pour faciliter la vie du programmeur
→ non-portable (6= langage haut-niveau (C,java))
(Saut d’adresse : B(L) chez ARM et JMP chez INTEL )
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
14 / 82
Processeur et jeu d’instructions
Architecture ARM : principes
ISA : Instruction Set Architecture
Instruction d’addition sur processeur ARM
doc technique : ADD Rd Rn Rm
Rd=Rn+Rm (Rd : registre destination)
31
28 26 25
21 20
c o n d 0 00 0 1 0 0 0
16
Rn
12
Rd
3
shift
0
Rm
Assembleur : ADD R3 R2 R3 − > Langage machine :0xE0823003
31
28 26 25
21 20
16
12
0
1 11 0 0 00 0 1 0 0 0 0 0 1 0 0 0 1 1 0 00 0 0 00 0 0 0 1 1
(cond=1110 signifie ”toujours exécuter”)
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
15 / 82
Processeur et jeu d’instructions
Architecture ARM : principes
Illustration : Réalisation d’une addition
PC initialisé à 100
initialisation par un autre programme (ou reset du CPU)
Memory
Single Core CPU
R1
Address bus
R2
R3
PC
0x100 : LDR R2, 0x200
0x104 : LDR R3, #2
0x108 : ADD R3, R2, R3
0x10C : STR R3, 0x204
Data bus
0x100
Read/Write
IR
0x200 : 0x0005
0x204 : 0x????
...
ALU
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
16 / 82
Processeur et jeu d’instructions
Architecture ARM : principes
Illustration : Réalisation d’une addition
Fetch de l’instruction par l’IFU (Instruction Fetch Unit)
adresse de l’instruction donnée par le PC
Memory
Single Core CPU
0x100
R1
Address bus
R2
LDR R2, 0x200
R3
PC
0x100 : LDR R2, 0x200
0x104 : LDR R3, #2
0x108 : ADD R3, R2, R3
0x10C : STR R3, 0x204
Data bus
0x100
IR
LDR R2, 0x200
R
Read/Write
0x200 : 0x0005
0x204 : 0x????
...
ALU
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
17 / 82
Processeur et jeu d’instructions
Architecture ARM : principes
Illustration : Réalisation d’une addition
fin du Fetch : code de l’instruction à exécuter dans IR
Décodage et préparation du chemin de données
Memory
Single Core CPU
R1
Address bus
R2
R3
PC
0x100 : LDR R2, 0x200
0x104 : LDR R3, #2
0x108 : ADD R3, R2, R3
0x10C : STR R3, 0x204
Data bus
0x100
IR
LDR R2,0x200
Read/Write
0x200 : 0x0005
0x204 : 0x????
...
ALU
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
18 / 82
Processeur et jeu d’instructions
Architecture ARM : principes
Illustration : Réalisation d’une addition
Exécution de l’instruction LDR
LDR : load dans le registre Rx une donnée référencée ou une #constante
Single Core CPU
Memory
0x200
R1
R2
Address bus
0x0005
R3
PC
0x0005
0x100 : LDR R2, 0x200
0x104 : LDR R3, #2
0x108 : ADD R3, R2, R3
0x10C : STR R3, 0x204
Data bus
0x100
IR
LDR R2,0x200
R
Read/Write
0x200 : 0x0005
0x204 : 0x????
...
ALU
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
19 / 82
Processeur et jeu d’instructions
Architecture ARM : principes
Illustration : Réalisation d’une addition
fin de l’instruction
Incrémentation du PC de 0x004 : pointe sur instruction suivante
Memory
Single Core CPU
R1
R2
Address bus
0x0005
R3
PC
0x100 : LDR R2, 0x200
0x104 : LDR R3, #2
0x108 : ADD R3, R2, R3
0x10C : STR R3, 0x204
Data bus
0x104
IR
LDR
R2,0x200
Read/Write
0x200 : 0x0005
0x204 : 0x????
...
ALU
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
20 / 82
Processeur et jeu d’instructions
Architecture ARM : principes
Illustration : Réalisation d’une addition
Fetch de l’instruction suivante
écrase le contenu de l’IR
Memory
Single Core CPU
0x104
R1
R2
Address bus
0x0005
R3
PC
LDR R3, #2
0x100 : LDR R2, 0x200
0x104 : LDR R3, #2
0x108 : ADD R3, R2, R3
0x10C : STR R3, 0x204
Data bus
0x104
IR LDR R3, #2
R
Read/Write
0x200 : 0x0005
0x204 : 0x????
...
ALU
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
21 / 82
Processeur et jeu d’instructions
Architecture ARM : principes
Illustration : Réalisation d’une addition
Décode et Exécute l’instruction
LDR : load dans le registre Rx une donnée référencée ou une #constante
Memory
Single Core CPU
R1
Address bus
R2
0x0005
R3
0x0002
PC
0x104
IR LDR R3, #2
0x100 : LDR R2, 0x200
0x104 : LDR R3, #2
0x108 : ADD R3, R2, R3
0x10C : STR R3, 0x204
Data bus
Read/Write
0x200 : 0x0005
0x204 : 0x????
...
ALU
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
22 / 82
Processeur et jeu d’instructions
Architecture ARM : principes
Illustration : Réalisation d’une addition
fin de l’instruction : Incrémente de 0x004 le PC
Fetch de l’instruction suivante
Memory
Single Core CPU
0x108
R1
Address bus
R2
0x0005
R3
0x0002
PC
0x108
IR
ADD
R3,R2,R3
ADD R3, R2, R3
0x100 : LDR R2, 0x200
0x104 : LDR R3, #2
0x108 : ADD R3, R2, R3
0x10C : STR R3, 0x204
Data bus
R
Read/Write
0x200 : 0x0005
0x204 : 0x????
...
ALU
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
23 / 82
Processeur et jeu d’instructions
Architecture ARM : principes
Illustration : Réalisation d’une addition
exécution de l’instruction
ADD Rdest,Ra,Rb : addition Rdest<=Rb+Ra
Memory
Single Core CPU
R1
Address bus
R2
0x0005
R3
0x000 7
PC
0x108
0x100 : LDR R2, 0x200
0x104 : LDR R3, #2
0x108 : ADD R3, R2, R3
0x10C : STR R3, 0x204
Data bus
Read/Write
IR
ADD
R3,R2,R3
0x200 : 0x0005
0x204 : 0x????
...
0x05
0x02
ALU
Loı̈c Cuvillon (ENSPS)
+
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
24 / 82
Processeur et jeu d’instructions
Architecture ARM : principes
Illustration : Réalisation d’une addition
Fin instruction : incrémente le PC
Fetch instruction suivante
Memory
Single Core CPU
0x10C
R1
Address bus
R2
0x0005
R3
0x0007
PC
0x10C
IR R3,0x204
STR
STR R3,0x204
0x100 : LDR R2, 0x200
0x104 : LDR R3, #2
0x108 : ADD R3, R2, R3
0x10C : STR R3, 0x204
Data bus
Read/Write
0x200 : 0x0005
0x204 : 0x????
...
ALU
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
25 / 82
Processeur et jeu d’instructions
Architecture ARM : principes
Illustration : Réalisation d’une addition
Exécution de l’instruction
STR Rd Add : sauve contenu de Rd à l’adresse Add
Memory
Single Core CPU
0x204
R1
Address bus
R2
0x0005
R3
0x0007
PC
0x10C
IR R3,0x204
STR
0x0007
0x100 : LDR R2, 0x200
0x104 : LDR R3, #2
0x108 : ADD R3, R2, R3
0x10C : STR R3, 0x204
Data bus
W
Read/Write
0x200 : 0x0005
0x204 : 0x0007
...
ALU
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
26 / 82
Processeur et jeu d’instructions
Architecture ARM : principes
Le pipeline d’exécution
exécution en parallèle d’1 Fetch, 1 Décode et 1 Exécution
→ accélération du débit d’exécution : 1 exécution d’instruction/cycle
(alors que le traitement d’une instruction : 3 cycles)
Fetch de l’instruction pointée par PC+08 pendant exécution de PC
R1
Address bus
PC
R2
Data bus
R3
PC
Decode
...
A
B
R1
ALU
and Control Unit
(Inst.addr: PC−0x08)
IR
R3
LDR R2, #6
Bus source
selection
ADD R3, R3, R1
ADD R2, R2, R1
Fetch
Decode
Execute
Fetch
Decode
Execute
Fetch
Decode
LDR R2, #6
(Inst.addr: PC)
ALU operation mode
C
1 cycle
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Execute
temps
1 cycle
1 cycle
Année scolaire 2010-2011
27 / 82
Processeur et jeu d’instructions
Architecture Intel et Assembleur x86
Intel 8086
le 8086
processeur 16 bits, 8MHz, total de 16 registres
registres de 16 bits
= 64Ko de mémoire (216 adresses codées)
mais bus d’adresse de 220 bits = 1Mo (220
adresses)
accès complexe au 1Mo de mémoire :
8086 (1978 - 320$)
un registre segment de 16bits
offset : l’adresse mémoire sur 16bits
adresse finale= segment x16 + offset
son dérivé le 8088, coeur de l’IBM PC ! (1981)
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
28 / 82
Processeur et jeu d’instructions
Architecture Intel et Assembleur x86
Intel Pentium
ix86 : 386, 486, Pentium (586)
Démarrage en Mode réel :
Emulation du 8086 (compatibilité)
1 Mo uniquement accessible !
Mode protégé (activé par le bit Protection Enable dans le registre CR0) :
Mémoire virtuelle pagination, protection mémoire
Mécanisme pour le multitâche
Niveau de privilèges d’exécution (4)
Noyau (Toute Instruction permise)
User (Instruction I/O (entrées-sorties) indisponibles )
Loı̈c Cuvillon (ENSPS)
80286 (i286)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
29 / 82
Processeur et jeu d’instructions
Architecture Intel et Assembleur x86
Intel Pentium
Pentium P5 : Architecture interne
2 pipeline à 5 étages
prédiction de branchement dynamique
(avec historique)
mémoire cache séparée instructions données
(Harvard architecture)
cache TLB pour les tables de pages
(mémoire virtuelle)
processeur CISC
Complex Instruction Set Computer ;
Instructions de taille variable ! ;
Transformées à la volée en
micro-instruction (− > RISC)
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
pentium 4
(http ://www.cs.clemson.edu/m̃ark/330/p6.html)
Année scolaire 2010-2011
30 / 82
Processeur et jeu d’instructions
Architecture Intel et Assembleur x86
Intel Pentium
Registres du x86
EAX
General
registers
EBX
ECX
CS
Code Segment
DS
Data Segment
SS
Stack Segment
EDX
EIP
Instruction pointer
EBP
Stack Base pointer
ESP
Stack pointer
EFLAGS
CR3
EAX
Loı̈c Cuvillon (ENSPS)
Control 3
(page directory adress)
: memory management
AX
AH
Status
AL
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
31 / 82
Processeur et jeu d’instructions
Architecture Intel et Assembleur x86
Intel Pentium
Assembleur x86 : syntax AT&T
section données
initialisées
.data
# start of data segment
commentaire
x: .long 2
y: .long 47
section code
.text
# start of code segment
.globl _start
_start: point d’entrée
par défaut du prog.
_start:
ordre ops : source puis destination
(inverse en syntaxe intel et ARM)
movl y, %eax
movl $x, %ebx
%eax: mot dans le registre
cmpl (%ebx), %eax
(%ebx): mot a l’adresse
contenue dans %ebx
$ = constante
$x=cst=adresse du mot x
jne next
inc %eax
next: addl $1, (%ebx)
Loı̈c Cuvillon (ENSPS)
( ), operateur indirection :
la donnée de l’adresse contenue dans ebx
[ * en langage C ]
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
32 / 82
Processeur et jeu d’instructions
Architecture Intel et Assembleur x86
Intel Pentium
Assembleur x86 : syntaxe AT&T
.data
label: symbole pour l’adresse
d’une donnée ou instruction
# start of data segment
x: .long 2
y: .long 47
.text
# start of code segment
.globl _start
_start:
operation sur mots 32bits (l)
(w pour 16, b pour 8)
movl y, %eax
# mettre valeur y (47) dans eax
movl $x, %ebx
# mettre l’adresse de x dans ebx
cmpl (%ebx), %eax
# comparer la valeur de x et y
jne next
# jump if not equal
inc %eax
# incrementer eax
next: addl $1, (%ebx)
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
# x=x+1
Année scolaire 2010-2011
33 / 82
Processeur et jeu d’instructions
Architecture Intel et Assembleur x86
Intel Pentium
Opérandes
Registres : %eax, %ax, %ebx, ...
Valeurs immédiates = constantes : $2 , $label (l’adresse de la variable)
Mot, variable en mémoire : label et (%eax) (variable à l’adresse %eax)
Opérations de déplacement : movl
%eax,%ebx : copie entre registre
$0x??,%eax ou $n,%eax : copie d’une constante vers registre
(%eax),%ebx, ou n,%ebx, ou 0x??,%ebx : copie mémoire vers
registre
%eax,n ou %eax,(%ebx) ou %eax,0x?? : copie registre vers
mémoire
Mais opération entre 2 mots en mémoires impossible
Identique pour l’addition, la soustraction, ...
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
34 / 82
Processeur et jeu d’instructions
Branchements et leur prédiction
Limites du pipeline d’exécution : les branchements
Branchement : saut d’adresse
eflags ou cpsr : registre de
statut :
cmpl %edx, $0
if (i==0)
Z=1
movl $1, %eax
{a=1;
b=2;}
Z=0
...
movl $2; %ebx
jmp next
else
a=3;
jne else1
else1:
movl $3, %eax
next :
...
Loı̈c Cuvillon (ENSPS)
flag Z(ero) : 1 si résultat=0
flag S(igne) :1 si résultat<0
flag O(verflaw)
cmp op1,op2 : update statut
suivant résultat de (op1-op2)
jmp : saut inconditionnel
jz, je : si égalité (Z=1)
jnz, jne : si inégalité (Z=0)
jg, [jge] : si > 0 [≥]
flags (S xor O)=0
jl, [jle] : si < 0 [ou ≤]
flags (S xor O)=1
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
35 / 82
Processeur et jeu d’instructions
Branchements et leur prédiction
Limites du pipeline d’exécution : les branchements
Cas sans branchement
egalité : Z=1
0xF00(%EIP): jne else1
Fetch
Decode
Execute
Fetch
Decode
Execute
Fetch
Decode
Execute
Fetch
Decode
z=1
0xF04: movl $1, %eax
0xF08: movl $2, %ebx
0xF0C: jump next
Execute
t
Aucun problème dans le pipeline
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
36 / 82
Processeur et jeu d’instructions
Branchements et leur prédiction
Limites du pipeline d’exécution : les branchements
Cas avec branchement
inégalité : Z=0
0xF00(%EIP): jne else1
0xF04: movl $1, %eax
0xF08: movl $2, %ebx
Fetch
Decode
Execute
Fetch
Decode
Execute
Fetch
Decode
Execute
Fetch
Decode
z=0
next %EIP= else1
else1: movl $3, %eax
Execute
t
Pipeline à vider (aucune instruction exécutée pendant 2 cycles)
saut : 20% des instructions (+14 étapes pour pentium 4 pipeline)
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
37 / 82
Processeur et jeu d’instructions
Branchements et leur prédiction
Limites du pipeline d’exécution : les branchements
Solution : prédiction de branchement
statique (≤60%)
1. considérer que le branchement n’est pas pris !
dynamique (>90%)
Prédiction avec un historique des résultats de branchements (pris/pas pris)
Uilise une table (Branch Target Buffer) contenant
1
2
le branchement concerné (identifié par son adresse PC )
l’adresse prédite pour l’instruction suivante
Branch Target Buffer (BTB)
Loı̈c Cuvillon (ENSPS)
Branch PC
Predicted PC
0x034D
...
0x0F50
2 bits history
(taken/not taken)
Systèmes temps réel et systèmes embarqués
01
Année scolaire 2010-2011
38 / 82
Processeur et jeu d’instructions
Branchements et leur prédiction
Limites du pipeline d’exécution : les branchements
Fetch
Decode
Instruction
Current PC
Execute
Update BTB
history &
predicted PC
Non
is a branch ?
in BTB?
Oui
Non
Add current PC
to BTB
O/N
Branch
taken ?
O/N
Oui
BTB
Oui
Correct
Prediction?
Non
Predicted
PC
FLUSH
PIPELINE
Set New PC
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
39 / 82
Processeur et jeu d’instructions
Branchements et leur prédiction
Assembleur x86 : Exercice
# Sum of Array Elements
.data
x:
# data segment
.long 300
.long 4
.long 3
sum: .long 0
.text
.globl _start
_start: nop
movl $0, %eax
movl $x, %ebx
proces: addl
addl
addl
addl
addl
movl
exit:
(%ebx), %eax
$4, %ebx
(%ebx), %eax
$4, %ebx
(%ebx), %eax
%eax, sum
movl $1, %eax
int $0x80
Loı̈c Cuvillon (ENSPS)
# code segment
# no-operation (for debug purpose)
# EAX stores temporary result
# EBX
# store result in "sum"
# clean exit of the program (optional)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
40 / 82
Processeur et jeu d’instructions
Branchements et leur prédiction
Assembleur x86 : Exercice
assemblage + debug(-g) : as -g sum2.S -o sum2.o
création exécutable : ld sum2.o -o sum2
déboguer : ddd sum2
ddd, gui pour le gnu débogueur
1
2
3
4
5
6
Activer source, machine code, data windows et command tool dans View
Ajouter un breakpoint sur l’instruction movl $0,%eax (avec clic droit)
Visualiser l’état du mot sum (clic droit, ”display”)
Exécuter le programme avec Run dans la fenêtre ”command tool”
Il stoppe sur le breakpoint. Afficher les registres : Menu Status, Registers
Exécution instr. par instr. avec stepi dans la fenêtre ”command tool”
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
41 / 82
Processeur et jeu d’instructions
Branchements et leur prédiction
Assembleur x86 : Exercice 1
Questions :
1
2
3
Exécuter le programme à nouveau : Run et avancer de 2 instructions.
Que réalise l’opération movl $x, %ebx ? Vérifier votre réponse en
affichant le contenu de l’adresse indiquée dans %ebx (Data→Memory→
1 word from 0x..... et Display).
D’ailleurs, utiliser l’outil Data→Memory pour déterminer si la machine est
big ou little endian.
Que réalise l’opération addl %(ecx), %ebx ? Où est stocké le
résultat ?
4
Pourquoi l’instruction addl $4, %ecx permet-elle d’accéder à l’élément
suivant de x ?
5
La valeur de sum est elle celle attendue à la fin du programme ?
Comparer l’assembleur source et le code machine désassemblé.
6
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
42 / 82
Processeur et jeu d’instructions
Branchements et leur prédiction
Assembleur x86 : Exercice 2
.data # data segment
x:
.long 300
.long 4
.long 3
sum: .long 0
.text # code segment
.globl _start
_start: nop
# no-operation (for debug purpose)
movl $0, %eax
# EAX stores temporary result
movl $x, %ebx
# EBX
movl $3, %ecx
# ECX
proces: addl (%ebx), %eax
addl $4, %ebx
decl %ecx
jnz process
movl %eax, sum # store result in "sum"
exit: movl $1, %eax
int $0x80
1
#exit program, explanation later
Vérifier que le saut n’a lieu q’avec le flag Z présent dans le registre
EFLAGS.
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
43 / 82
Processeur et jeu d’instructions
La Pile d’exécution
La Pile d’exécution (stack)
Espace mémoire croissant vers des adresses inférieures
%esp : stack pointer (SP), pointeur permanent sur le sommet de la pile
push %eax : pose contenu de EAX sur la pile
pop %eax : retire le sommet de la pile dans EAX
push %eax
#%eax=0x19
after POP %ax
after PUSH %ax
initial State
movl $0xF17, %eax
Adresse
...
...
0x000
pop %eax
0x000
0x000
#%eax=0x19
...
SP
0x??????
SP
0x000019
0x000019
SP
0xFFFFF0
0x0F4
0xFFFFF0
0x0F4
0xFFFFF0
0x0F4
0x00B471
0x0F8
0x00B471
0x0F8
0x00B471
0x0F8
0xA5063C
0x0FC
0xA5063C
0x0FC
0xA5063C
0x0FC
un usage du stack : sauvegarde et restauration de %eax si besoin
temporaire de celui-ci pour une fonctionnalité
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
44 / 82
Processeur et jeu d’instructions
La Pile d’exécution
La Pile et les appels de procédures
CALL/RET et les procédures (fonctions)
la pile stocke les adresses PC de retour des fonctions
ret, retour au programme appelant
L’adresse de retour (nouveau PC) est prise sur la pile.
ret ≈ pop %eip
call label, adresse de retour est posée sur la pile
ET saut à la procédure call label ≈ push %eip+4 ; jmp label
Stack
0x00
main: ...
func stack frame
0x310
movl $0xF17, %ecx
0x314
call 0xA38 <func1>
0x318
...
0xA38
func1 : incl %eax
0xA3C
incl %ebx
0xA40
ret
Loı̈c Cuvillon (ENSPS)
main stack frame
SP
0x0398D
0x0FF49B
Systèmes temps réel et systèmes embarqués
previous stack
0xFC
Année scolaire 2010-2011
45 / 82
Processeur et jeu d’instructions
La Pile d’exécution
La Pile et les appels de procédures
CALL/RET et les procédures (fonctions)
la pile stocke les adresses PC de retour des fonctions
ret, retour au programme appelant
L’adresse de retour (nouveau PC) est prise sur la pile.
ret ≈ pop %eip
call label, adresse de retour est posée sur la pile
ET saut à la procédure call label ≈ push %eip+4 ; jmp label
Stack
0x00
main: ...
func stack frame
0x310
movl $0xF17, %ecx
0x314
call 0xA38 <func1>
0x318
...
Push Return IP
and jump
SP
main stack frame
0x0318
0xA38
func1 : incl %eax
0x0398D
0xA3C
incl %ebx
0x0FF49B
0xA40
ret
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
previous stack
0xFC
Année scolaire 2010-2011
46 / 82
Processeur et jeu d’instructions
La Pile d’exécution
La Pile et les appels de procédures
CALL/RET et les procédures (fonctions)
la pile stocke les adresses PC de retour des fonctions
ret, retour au programme appelant
L’adresse de retour (nouveau PC) est prise sur la pile.
ret ≈ pop %eip
call label, adresse de retour est posée sur la pile
ET saut à la procédure call label ≈ push %eip+4 ; jmp label
Stack
0x00
main: ...
func stack frame
0x310
movl $0xF17, %ecx
0x314
call 0xA38 <func1>
0x318
...
main stack frame
SP
0x0318
0xA38
func1 : incl %eax
0x0398D
0xA3C
incl %ebx
0x0FF49B
0xA40
ret
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
previous stack
0xFC
Année scolaire 2010-2011
47 / 82
Processeur et jeu d’instructions
La Pile d’exécution
La Pile et les appels de procédures
CALL/RET et les procédures (fonctions)
la pile stocke les adresses PC de retour des fonctions
ret, retour au programme appelant
L’adresse de retour (nouveau PC) est prise sur la pile.
ret ≈ pop %eip
call label, adresse de retour est posée sur la pile
ET saut à la procédure call label ≈ push %eip+4 ; jmp label
Stack
0x00
main: ...
func stack frame
0x310
movl $0xF17, %ecx
0x314
call 0xA38 <func1>
0x318
...
main stack frame
SP
0x0318
0xA38
func1 : incl %eax
0x0398D
0xA3C
incl %ebx
0x0FF49B
0xA40
ret
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
previous stack
0xFC
Année scolaire 2010-2011
48 / 82
Processeur et jeu d’instructions
La Pile d’exécution
La Pile et les appels de procédures
CALL/RET et les procédures (fonctions)
la pile stocke les adresses PC de retour des fonctions
ret, retour au programme appelant
L’adresse de retour (nouveau PC) est prise sur la pile.
ret ≈ pop %eip
call label, adresse de retour est posée sur la pile
ET saut à la procédure call label ≈ push %eip+4 ; jmp label
Stack
0x00
main: ...
func stack frame
0x310
movl $0xF17, %ecx
0x314
call 0xA38 <func1>
0x318
...
main stack frame
0x0318
0xA38
func1 : incl %eax
0xA3C
incl %ebx
0xA40
ret
Loı̈c Cuvillon (ENSPS)
SP
0x0398D
0x0FF49B
previous stack
0xFC
Pop return IP
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
49 / 82
Processeur et jeu d’instructions
La Pile d’exécution
La Pile et les appels de procédures
CALL/RET et les procédures (fonctions)
la pile stocke les adresses PC de retour des fonctions
ret, retour au programme appelant
L’adresse de retour (nouveau PC) est prise sur la pile.
ret ≈ pop %eip
call label, adresse de retour est posée sur la pile
ET saut à la procédure call label ≈ push %eip+4 ; jmp label
Stack
0x00
main: ...
func stack frame
0x310
movl $0xF17, %ecx
0x314
call 0xA38 <func1>
0x318
...
0xA38
func1 : incl %eax
0xA3C
incl %ebx
0xA40
ret
Loı̈c Cuvillon (ENSPS)
main stack frame
SP
0x0398D
0x0FF49B
Systèmes temps réel et systèmes embarqués
previous stack
0xFC
Année scolaire 2010-2011
50 / 82
Processeur et jeu d’instructions
La Pile d’exécution
La Pile et les appels de procédures
la pile autorise les appels imbriqués ou récursifs en conservant
l’historique des adresses de retour
main: ...
0x310
movl $0xF17, %ecx
0x314
call 0xA38 <func1>
0x318
...
Stack
0x00
func stack frame
0x444
func2 : incl %edx
0x448
subl %eax,%ebx
0x44C
ret
main stack frame
...
SP
0xA38
func1 : incl %eax
0xA3C
call 0x444 <func2>
0xA40
ret
Loı̈c Cuvillon (ENSPS)
0x0398D
0x0FF49B
Systèmes temps réel et systèmes embarqués
previous stack
0xFC
Année scolaire 2010-2011
51 / 82
Processeur et jeu d’instructions
La Pile d’exécution
La Pile et les appels de procédures
la pile autorise les appels imbriqués ou récursifs en conservant
l’historique des adresses de retour
main: ...
0x310
movl $0xF17, %ecx
0x314
call 0xA38 <func1>
0x318
...
Stack
0x00
func stack frame
0x444
func2 : incl %edx
0x448
subl %eax,%ebx
0x44C
ret
main stack frame
SP
...
0x0398D
0xA38
func1 : incl %eax
0xA3C
call 0x444 <func2>
0xA40
ret
Loı̈c Cuvillon (ENSPS)
0x318
0x0FF49B
Systèmes temps réel et systèmes embarqués
previous stack
0xFC
Année scolaire 2010-2011
52 / 82
Processeur et jeu d’instructions
La Pile d’exécution
La Pile et les appels de procédures
la pile autorise les appels imbriqués ou récursifs en conservant
l’historique des adresses de retour
main: ...
0x310
movl $0xF17, %ecx
0x314
call 0xA38 <func1>
0x318
...
Stack
0x00
func stack frame
0x444
func2 : incl %edx
0x448
subl %eax,%ebx
0x44C
ret
main stack frame
SP
...
0x0398D
0xA38
func1 : incl %eax
0xA3C
call 0x444 <func2>
0xA40
ret
Loı̈c Cuvillon (ENSPS)
0x318
0x0FF49B
Systèmes temps réel et systèmes embarqués
previous stack
0xFC
Année scolaire 2010-2011
53 / 82
Processeur et jeu d’instructions
La Pile d’exécution
La Pile et les appels de procédures
la pile autorise les appels imbriqués ou récursifs en conservant
l’historique des adresses de retour
main: ...
0x310
movl $0xF17, %ecx
0x314
call 0xA38 <func1>
0x318
...
Stack
0x00
func stack frame
0x444
func2 : incl %edx
0x448
subl %eax,%ebx
0x44C
ret
SP
main stack frame
0x318
...
0x0398D
0xA38
func1 : incl %eax
0xA3C
call 0x444 <func2>
0xA40
ret
Loı̈c Cuvillon (ENSPS)
0xA40
0x0FF49B
Systèmes temps réel et systèmes embarqués
previous stack
0xFC
Année scolaire 2010-2011
54 / 82
Processeur et jeu d’instructions
La Pile d’exécution
La Pile et les appels de procédures
la pile autorise les appels imbriqués ou récursifs en conservant
l’historique des adresses de retour
main: ...
0x310
movl $0xF17, %ecx
0x314
call 0xA38 <func1>
0x318
...
Stack
0x00
func stack frame
0x444
func2 : incl %edx
0x448
subl %eax,%ebx
0x44C
ret
SP
main stack frame
0x318
...
0x0398D
0xA38
func1 : incl %eax
0xA3C
call 0x444 <func2>
0xA40
ret
Loı̈c Cuvillon (ENSPS)
0xA40
0x0FF49B
Systèmes temps réel et systèmes embarqués
previous stack
0xFC
Année scolaire 2010-2011
55 / 82
Processeur et jeu d’instructions
La Pile d’exécution
La Pile et les appels de procédures
la pile autorise les appels imbriqués ou récursifs en conservant
l’historique des adresses de retour
main: ...
0x310
movl $0xF17, %ecx
0x314
call 0xA38 <func1>
0x318
...
Stack
0x00
func stack frame
0x444
func2 : incl %edx
0x448
subl %eax,%ebx
0x44C
ret
SP
main stack frame
0x318
...
0x0398D
0xA38
func1 : incl %eax
0xA3C
call 0x444 <func2>
0xA40
ret
Loı̈c Cuvillon (ENSPS)
0xA40
0x0FF49B
Systèmes temps réel et systèmes embarqués
previous stack
0xFC
Année scolaire 2010-2011
56 / 82
Processeur et jeu d’instructions
La Pile d’exécution
La Pile et les appels de procédures
la pile autorise les appels imbriqués ou récursifs en conservant
l’historique des adresses de retour
main: ...
0x310
movl $0xF17, %ecx
0x314
call 0xA38 <func1>
0x318
...
Stack
0x00
func stack frame
0x444
func2 : incl %edx
0x448
subl %eax,%ebx
0x44C
ret
0xA40
main stack frame
SP
...
0x0398D
0xA38
func1 : incl %eax
0xA3C
call 0x444 <func2>
0xA40
ret
Loı̈c Cuvillon (ENSPS)
0x318
0x0FF49B
Systèmes temps réel et systèmes embarqués
previous stack
0xFC
Année scolaire 2010-2011
57 / 82
Processeur et jeu d’instructions
La Pile d’exécution
La Pile et les appels de procédures
la pile autorise les appels imbriqués ou récursifs en conservant
l’historique des adresses de retour
main: ...
0x310
movl $0xF17, %ecx
0x314
call 0xA38 <func1>
0x318
...
Stack
0x00
func stack frame
0x444
func2 : incl %edx
0x448
subl %eax,%ebx
0x44C
ret
main stack frame
0x318
...
SP
0xA38
func1 : incl %eax
0xA3C
call 0x444 <func2>
0xA40
ret
Loı̈c Cuvillon (ENSPS)
0x0398D
0x0FF49B
Systèmes temps réel et systèmes embarqués
previous stack
0xFC
Année scolaire 2010-2011
58 / 82
Processeur et jeu d’instructions
La Pile d’exécution
La Pile et les appels de procédures
la pile autorise les appels imbriqués ou récursifs en conservant
l’historique des adresses de retour
main: ...
0x310
movl $0xF17, %ecx
0x314
call 0xA38 <func1>
0x318
...
Stack
0x00
func stack frame
0x444
func2 : incl %edx
0x448
subl %eax,%ebx
0x44C
ret
main stack frame
...
SP
0xA38
func1 : incl %eax
0xA3C
call 0x444 <func2>
0xA40
ret
Loı̈c Cuvillon (ENSPS)
0x0398D
0x0FF49B
Systèmes temps réel et systèmes embarqués
previous stack
0xFC
Année scolaire 2010-2011
59 / 82
Processeur et jeu d’instructions
La Pile d’exécution
La Pile et le passage de paramètres au fonctions
Convention pour les appels de fonctions C
1
2
Paramètres passés sur la pile dans l’ordre inverse du prototype
Après exécution du call, la procédure appelée (fonctionC) :
Trouve ses paramètres dans la pile sous l’adresse de retour (initialement :
SP+4 → param1 , SP+8 → param2,..)
Peut utiliser la pile (%ebp éventuellement disponible pour mémoriser la
position de SP à l’entrée et la position des paramètres)
Met son code d’erreur ou sa valeur de retour dans %eax.
Supprime ses variables temporaires sur la pile (donc ESP → PC retour)
Exécute l’instruction ret
3
Suppression des paramètres passés sur la pile par l’appelant
La procédure rend la pile à l’appelant dans le même état qu’avant le call
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
60 / 82
Processeur et jeu d’instructions
La Pile d’exécution
La Pile et les appels de procédures
func : ...
...
# int func(int* data, int b)
ret
Stack
main: ...
0x00
func stack frame
movl %edx, %ecx
pushl 685
pushl $data
main stack frame
call func
nop
SP
previous stack
addl $4, %esp
0xFC
...
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
61 / 82
Processeur et jeu d’instructions
La Pile d’exécution
La Pile et les appels de procédures
func : ...
...
# int func(int* data, int b)
ret
Stack
main: ...
0x00
movl %edx, %ecx
pushl 685
pushl $data
call func
SP
@data
main stack frame
685
nop
previous stack
addl $4, %esp
0xFC
...
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
62 / 82
Processeur et jeu d’instructions
La Pile d’exécution
La Pile et les appels de procédures
func : ...
...
# int func(int* data, int b)
ret
Stack
main: ...
0x00
movl %edx, %ecx
pushl 685
pushl $data
call func
SP
PC retour
@data
main stack frame
685
nop
previous stack
addl $4, %esp
0xFC
...
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
63 / 82
Processeur et jeu d’instructions
La Pile d’exécution
La Pile et les appels de procédures
func : ...
...
# int func(int* data, int b)
ret
Stack
main: ...
0x00
SP
func stack frame
movl %edx, %ecx
local var
pushl 685
PC retour
pushl $data
call func
@data
(
BP)
main stack frame
685
nop
previous stack
addl $4, %esp
0xFC
...
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
64 / 82
Processeur et jeu d’instructions
La Pile d’exécution
La Pile et les appels de procédures
func : ...
...
# int func(int* data, int b)
ret
Stack
main: ...
0x00
func stack frame
movl %edx, %ecx
pushl 685
pushl $data
call func
SP
PC retour
@data
main stack frame
685
nop
previous stack
addl $4, %esp
0xFC
...
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
65 / 82
Processeur et jeu d’instructions
La Pile d’exécution
La Pile et les appels de procédures
func : ...
...
# int func(int* data, int b)
ret
Stack
main: ...
0x00
movl %edx, %ecx
pushl 685
pushl $data
call func
SP
@data
main stack frame
685
nop
previous stack
addl $4, %esp
0xFC
...
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
66 / 82
Processeur et jeu d’instructions
La Pile d’exécution
La Pile et les appels de procédures
func : ...
...
# int func(int* data, int b)
ret
Stack
main: ...
0x00
movl %edx, %ecx
pushl 685
pushl $data
main stack frame
call func
nop
SP
previous stack
addl $4, %esp
0xFC
...
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
67 / 82
Processeur et jeu d’instructions
La Pile d’exécution
Assembleur x86 : Exemple
# Call C function "puts" from asm
# char message[]="Hello world!";
# int main()
# { puts(&message);
#
return 0;}
.data
message:
.ascii "Hello world!\0"
#.align 4
.text
.globl main
main:
pushl $message
call puts
addl $4,%esp
movl $0, %eax
ret
Loı̈c Cuvillon (ENSPS)
#push the one parameter : @ de message
#remove parameter from the stack
#main : return 0; != movl 0,%eax
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
68 / 82
Processeur et jeu d’instructions
La Pile d’exécution
Assembleur x86 : Exercice
Compilation
assemblage + debug(-g) : as -g puts.S -o puts.o
création exécutable : gcc puts.o -o puts (lien avec la libC)
déboguer : ddd sum2
Exercice
Utiliser Data− >Memory pour afficher le sommet de la pile (4 hex words
from $esp) et constater le passage des paramètres ainsi que de
l’adresse de retour.
Modifier le programme puts.S pour utiliser la fonction C write au lieu de
puts
prototype write (file descrp., *cst char message , size of msg ) et voir le
manuel man 2 write
par défaut linux associe un file descripteur =1 pour le terminal-sdout
write retourne le nombre d’octet effectivement écrit
Utiliser le débogueur pour vérifier le code de retour de la fonction write
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
69 / 82
Du source à l’exécutable
Plan
1
Processeur et jeu d’instructions
Architecture ARM : principes
Architecture Intel et Assembleur x86
Branchements et leur prédiction
La Pile d’exécution
2
Du source à l’exécutable
Le format ELF
Le code relogeable
L’exécutable et son chargement
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
70 / 82
Du source à l’exécutable
Le format ELF
Le processus : compilation de son programme/code
La compilation C via GCC
GCC :
un préprocesseur (cpp) : suppression des commentaires, expansion des
macros (.i)
un compilateur (cc1) : traduction vers assembleur (.s)
un assembleur (as) : traduction assembleur (.s) − > objet .o (binaire
machine)
options possibles : -I[/chemin/vers/include] -L[/chemin/vers/bibliothèsque]
-l[bibliothèque] (-g pour debug)
un éditeur de lien : ld
localise les symboles (fonctions, variables globales) dans les bibliothèques
et objets
reloge les symboles dans un même fichier
mise sous un format exécutable en mémoire
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
71 / 82
Du source à l’exécutable
Le format ELF
la création d’un exécutable : la compilation sous Linux
1
2
3
4
gcc -E source.c -o source.i ou cpp source.c -o source.i
gcc -S source.i -o source.s
gcc -c source.s -o source.o ou as source.s -o source.o
ld -lc -[runtime C librairies,...] source.o -o source
source
assembleur
gcc −E
gcc −S
.i
.c
cpp
objet (language machine)
gcc −c
.s
cc1
.o
as
ld −lc −l[C runtime]
−lm −ljpg
gcc −lm −ljpg
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
libjpeg.a
libm.a
libc.a
executable (ELF)
Année scolaire 2010-2011
72 / 82
Du source à l’exécutable
Le format ELF
le format ELF
ELF (Executable and Linking Format)
conteneur commun pour les fichiers objets,
exécutables et bibliothèques partagées
utilisé par Linux, Wii, PS3,...
l’entête ELF :
la localisation dans le fichier de la table des
sections
l’adresse de la fonction start (si un exécutable)
Si objet : la table des sections donne la position
dans le fichier des diversessections
(.text (code), .data, .symbols, ...)
Si exécutable : la table programme indique où
charger en mémoire les segments
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
ELF Header
Programm Header
Table
.text
.rodata
(other
sections)
.data
Section Header
Table
Année scolaire 2010-2011
73 / 82
Du source à l’exécutable
Le format ELF
le format ELF
utilitaires du format elf
readelf
objdump
-f : affiche l’entête ELF du fichier
-h : affiche la table des sections
-t : affiche la table des symboles
-r : affiche la table de relogement
-d : désassemble le code de la section .text
-D : désassemble toute les sections
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
74 / 82
Du source à l’exécutable
Le code relogeable
les différents fichiers objets
Fichier objet relogeable .o
symboles : tous les labels des procédures et données
1 table de symboles : labels et leur adresse de définition dans l’objet
1 table de relogement : adresses d’occurrences des symboles non définis
Le relogement :
fusion de sections identiques (code (.text), données (.data)) en une seule
section
et mise à jour des adresses des symboles avec leur nouvelle adresse après
fusion
bibliothèque statique .a
une archive .a contenant un ensemble de .o
Création : ar -q ma_biblioteq.a func.o func2.o ...
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
75 / 82
Du source à l’exécutable
Le code relogeable
Les bibliothèques de code relogeable
bibliothèque statique .a
code de la librairie copié dans
l’exécutable
exécutable sans dépendance
lourde empreinte disque et
mémoire
bibliothèque dynamique .so
édition de liens à l’exécution
pas de duplication de code
empreinte mémoire légère
dépendance : bibliothèque
installée ?
Hello world ! avec la lib C
gcc –static
hello.c -o hello
ls -l hello : 564 Ko
Loı̈c Cuvillon (ENSPS)
gcc hello.c -o hello
ls -l hello : 7 Ko
ldd ./hello :
(liste dépendances)
libc.so.6
ld-linux.so.2
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
76 / 82
Du source à l’exécutable
Le code relogeable
Les bibliothèques dynamiques et statiques
bibliothèques dynamiques .so
bibliothèques statiques .a
add.o
fopen.o
...
fopen.o
...
add.o
source.o
source.o
source2.o
source2.o
linker
linker
main: x
x
printf: x
x
x
add: x
x
Loı̈c Cuvillon (ENSPS)
libc.so
printf.o
libc.a
printf.o
linker
linker
main: x
x
printf: x
x
Executables
main: x
x
add: x
x
printf:−
partially linked executables
main: x
x
(en mémoire)
printf.o
libc.so printf:−
fopen.o
...
loader (execv)
dynamic linker (ld−linux.so)
loader (execv)
dynamic linker
full executable in memory
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
77 / 82
Du source à l’exécutable
Le code relogeable
Fichier objet relogeable .o
as source.s -o source.o et objdump -t -r -D source.o
Offset
section
Assembleur :source.s
Disassembly of section .text:
.text
.globl _start
_start:
Objet :source.o
0:b8 00 00 00 00
movl $a,%eax
movl $b,%ebx
as
call sum
mov
5:bb 00 00 00 00
0x6
a:e8 fc ff ff ff
$0x0,%eax
mov $0x0,%ebx
call ?
Disassembly of section .data:
0:aa 00 00 00
.data
a:
.long 0xAA
SYMBOL TABLE:
RELOCATION RECORDS FOR [.text]:
OFFSET TYPE
VALUE
00000006 R_386_32
0000000b R_386_PC32
b
sum
00000000 l .data
00000000 g .text
00000000 *UND*
00000000 *UND*
Offset
definition
00000000 a
00000000 _start
00000000
b
sum
00000000
section
Undefined
name
local/ global
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
78 / 82
Du source à l’exécutable
Le code relogeable
Relogement partiel
ld -r *.o -o prog.o : fusion sections et mise à jour adresses
+ source.o
Objet :sum.o
Objet : prog.o
Disassembly of section .text:
Disassembly of section .text:
0: 8b 08
2: 03 0b
mov (%eax),%ecx
add (%ebx),%ecx
4: c3
ret
0: b8 00 00 00 00
5: bb 00 00 00 00
a: e8 fc ff ff ff
f: 90
10: 8b 08
12: 03 0b
14: c3
Disassembly of section .data:
0: bb 00 00 00
RELOCATION RECORDS FOR [.text]:
(empty)
SYMBOL TABLE:
00000000 g .text 00000000 sum
00000000 g .data 00000000 b
mov
mov
call
nop
mov
add
ret
$0x0,%eax
$0x0,%ebx
? <_start+?>
(%eax),%ecx
(%ebx),%ecx
Disassembly of section .data:
0:aa 00 00 00
4: bb 00 00 00
SYMBOL TABLE:
00000000 l .data 00000000 a
00000004 g .data 00000000 b
00000010 g .text 00000000 sum
00000000 g .text 00000000 _start
nouvelles
adresses
RELOCATION RECORDS FOR [.text]:
00000006 R_386_32
b
0000000b R_386_PC32
sum
Loı̈c Cuvillon (ENSPS)
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
79 / 82
Du source à l’exécutable
L’exécutable et son chargement
L’exécutable : relogement finale
substitution de tous les symboles par des adresses mémoires effectives
ld
Objet : prog.o
Disassembly of section .text:
0: b8 00 00 00 00
5: bb 00 00 00 00
a: e8 fc ff ff ff
f: 90
10: 8b 08
12: 03 0b
14: c3
mov $0x0,%eax
mov $0x0 ,%ebx
call ? <_start+?>
nop
mov (%eax),%ecx
add (%ebx),%ecx
ret
Disassembly of section .data:
0:aa 00 00 00
4: bb 00 00 00
Exec File : prog
Disassembly of section .text:
8048074: b8 8c 90 04 08
mov $0x804908c,%eax
8048079: bb 90 90 04 08 mov $0x8049090 ,%ebx
804807e: e8 01 00 00 00 call
0x8048084 (next inst. +1)
8048083: 90
nop
8048084: 8b 08
mov (%eax),%ecx
8048086: 03 0b
add (%ebx),%ecx
8048088: c3
ret
Disassembly of section .data:
804908c:aa 00 00 00
8049090: bb 00 00 00
SYMBOL TABLE:
00000000 l .data 00000000 a
00000004 g .data 00000000 b
00000010 g .text 00000000 sum
00000000 g .text 00000000 _start
SYMBOL TABLE :
(optional!)
RELOCATION RECORDS FOR [.text]:
00000006 R_386_32
b
0000000b R_386_PC32
sum
start address 0x08048074
Loı̈c Cuvillon (ENSPS)
NO RELOCATION RECORDS
ELF HEADER:
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
80 / 82
Du source à l’exécutable
L’exécutable et son chargement
L’exécutable : relogement finale
suppression tables de relogement (et symboles avec utilitaire strip)
code machine prêt pour exécution par CPU
ld
Objet : prog.o
Disassembly of section .text:
0: b8 00 00 00 00
5: bb 00 00 00 00
a: e8 fc ff ff ff
f: 90
10: 8b 08
12: 03 0b
14: c3
mov $0x0,%eax
mov $0x0 ,%ebx
call ? <_start+?>
nop
mov (%eax),%ecx
add (%ebx),%ecx
ret
Disassembly of section .data:
0:aa 00 00 00
4: bb 00 00 00
SYMBOL TABLE:
00000000 l .data 00000000 a
00000004 g .data 00000000 b
00000010 g .text 00000000 sum
00000000 g .text 00000000 _start
RELOCATION RECORDS FOR [.text]:
00000006 R_386_32
b
0000000b R_386_PC32
sum
Loı̈c Cuvillon (ENSPS)
Exec File : prog
Disassembly of section .text:
8048074: b8 8c 90 04 08
mov $0x804908c,%eax
8048079: bb 90 90 04 08 mov $0x8049090 ,%ebx
0x8048084 (next inst. +1)
804807e: e8 01 00 00 00 call
8048083: 90
nop
8048084: 8b 08
mov (%eax),%ecx
8048086: 03 0b
add (%ebx),%ecx
8048088: c3
ret
Disassembly of section .data:
8049090: bb 00 00 00
804908c:aa 00 00 00
SYMBOL TABLE :
(optional!)
NO RELOCATION RECORDS
ELF HEADER:
start address 0x08048074
Systèmes temps réel et systèmes embarqués
Année scolaire 2010-2011
81 / 82
Du source à l’exécutable
L’exécutable et son chargement
L’exécutable : Exécution
Appel au programme de chargement : le loader (Linux)
(1) copie le code de l’exécutable aux adresses définies à la compilation
(2) exécution par copier de l’adresse d’entrée dans registre PC
Secondary Memory
Main Memory (RAM)
00 45 F2 71
(Hard Disk Drive)
0x0000000
./prog
...
ELF Header
Single Core CPU
@start_: 0x8048074
...
0x8048074
Programm Header
mov 0x804908c, %eax
EAX
EBX
ECX
section
...
...
jne 0x45DE804
...
PC 0x8048074
aa 00 00 00
(2)
.data
mov 0x804908c, %eax
(1)
0x804908c
.text
aa 00 00 00
...
...
Loı̈c Cuvillon (ENSPS)
0x8048074
0x804908c
"loader"
...
...
memory addr
.text
(1)
0xFFF0000
Systèmes temps réel et systèmes embarqués
.data
./toto.txt
./011.mp3
Année scolaire 2010-2011
82 / 82
Téléchargement