DMA
Direct Memory Access
Accès Direct en Mémoire
rene.beuchat@epfl.ch
rene.beuchat@eig.unige.ch
RB - 2003/2007 1
Plan
Problème
Architecture d'un Système informatique
minimum
Scrutation / Interruption
DMA
Types de transferts
Mémoire dual-port
Contrôleur DMA
RB - 2003/2007 2
Problème
Dans un système informatique, l'accès
au périphériques (interfaces
programmables) peut être réalisé par le
processeur à travers des instructions de
transferts
Des registres de statuts permettent au
processeur de déterminer si des
données peuvent être transférées et
l'état des transferts (erreurs)
RB - 2003/2007 3
Problème (2)
Par scrutation de registres de status, le
processeur synchronise les transferts
Wait (status_transfert == OK )
Effectue le transfert
Ou
If (status_transfert == OK )
Effectue le transfert
EndIf
RB - 2003/2007 4
Scrutation
RB - 2003/2007 5
Scrutation
Avec la scrutation le système est
synchrone, le programme contrôle
exactement lorsqu'il peut accéder à une
ressource
Inconvénient, le programme doit
souvent tester les statuts pour rien, et
suffisamment souvent pour ne pas rater
de données
RB - 2003/2007 6
Interruption
Pour que le processeur ne perde pas de
temps à scruter inutilement des
interfaces, les interruptions matérielles
permettent de ne monopoliser le
processeur que lorsqu'un service est à
effectuer
La synchronisation avec le
consommateur/producteur d'information
est à traiter par logiciel (message,
sémaphore, FIFO, etc…)
RB - 2003/2007 7
Interruption
RB - 2003/2007 8
Interruption
Les interruptions mettent en œuvre du
matériel spécialisé et dépendent du
processeur utilisé (vecteur, type d'accès
à la routine de traitement, etc…)
De nombreuses instructions sont
souvent nécessaires pour le traitement
de l'interruption (sauvetage de contexte,
test de la requête, transfert I/O-mémoire,
interrupt handler, …)
bande passante limitée
RB - 2003/2007 9
DMA
Pour des systèmes où le taux de
transfert entre les I/O et la mémoire est
élevé, la scrutation ou les interruptions
sont inutilisables
Un système plus performant est
nécessaire DMA
Le transfert est effectué par une unité
spécialisée : le contrôleur DMA
RB - 2003/2007 10
DMA
RB - 2003/2007 11
DMA
Le contrôleur DMA effectue les transferts à la
place du processeur
Il doit donc avoir le contrôle des bus :
d'adresses
de données
de contrôle de transferts
Avant d'effectuer le transfert un arbitrage doit
avoir lieu:
Un seul maître peut accéder une unité esclave à un
instant donné
RB - 2003/2007 12
Contrôleur DMA : un interface
programmable
RB - 2003/2007 13
Contrôleur DMA : un interface
programmable (2)
Le contrôleur DMA est un interface
programmable qu'il faut programmer par
le processeur avant qu'il ne soit
opérationnel
Exemple de transfert double cycle
I/O mémoire
RB - 2003/2007 14
DMA : transfert I/O mémoire
Requête de transfert
RB - 2003/2007 15
DMA : transfert I/O mémoire
Demande du bus au processeur
RB - 2003/2007 16
DMA : transfert I/O mémoire
Transfert IP Ctrl DMA
RB - 2003/2007 17
DMA : transfert I/O mémoire
Transfert Ctrl DMA Mémoire
RB - 2003/2007 18
DMA : transfert I/O mémoire
Interruption de fin de transfert(s)
RB - 2003/2007 19
DMA fin de transfert(s)
Lorsqu'un paquet de données a été
transféré, le processeur est averti par
interruption ou il peut utiliser la
scrutation d'un registre de statuts
Pour que le DMA soit utile, il faut qu'une
certaine quantité de données soit
transférées
RB - 2003/2007 20
Transfert simple cycle
Pour une plus grande efficacité de
transfert, l'accès intermédiaire par le
contrôleur n'est pas forcément
nécessaire
Un accès direct I/O mémoire est
possible
RB - 2003/2007 21
DMA, simple cycle
RB - 2003/2007 22
Simple cycle
Problème de taille des bus de données
mémoire
Les données mises en mémoire doivent
pouvoir être accédées ensuite par le
processeur à des adresses contiguës. Si
l'interface programmable source est de
largeur de bus np_dma_control = 0;
RB - 2003/2007 54
suite
// | 2. Set up everything except the go-bar
dma->np_dma_status = 0;
dma->np_dma_read_address = (int)source_address;
dma->np_dma_write_address = (int)destination_address;
dma->np_dma_length = transfer_count * bytes_per_transfer;
RB - 2003/2007 55
// | 3. construct the control word...
control_bits =
mode // wcon, rcon bits
| (bytes_per_transfer & 7) // low three bits of control reg
| ((bytes_per_transfer & 8) ? np_dma_control_doubleword_mask : 0)
| ((bytes_per_transfer & 16) ? np_dma_control_quadword_mask : 0)
| np_dma_control_le_en_mask // enable length (else runs forever)
| np_dma_control_go_mask; // and... go!
dma->np_dma_control = control_bits;
RB - 2003/2007 56
Suite et fin
// | 4. Wait til it's all done !! Polling !!
while((dma->np_dma_status &
np_dma_status_busy_mask) != 0)
;
return;
}
RB - 2003/2007 57
Question ?
RB - 2003/2007 58