Changes between Version 24 and Version 25 of AS6-TME-B1
- Timestamp:
- Feb 9, 2022, 11:33:07 AM (3 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
AS6-TME-B1
v24 v25 1324 1324 **Exercice** 1325 1325 1326 Vous allez utiliser le composant DMA. En cours, nous avons vu que le DMA réalise un copie de mémoire à partir de l'adresse contenu dans le registre DMA_SRC vers l'adresse contenu dans le registre DMA_DST du nombre d'octet contenu dans le registre DMA_LEN. 1327 Dans l'ordre, on commence par écrire les adresses SRC, DST et IRQ_DISABLE (si besoin), puis on écrit LEN, ce qui provoque le démarrage de la copie par le DMA 1328 A la fin de l'opération, le registre LEN contient le nombre d'octet non écrits donc 0. 1329 1330 Les registres du DMA sont à l'adresse 0xd1200000 1331 {{{ 1332 DMA_IRQ_DISABLE (lecture/écriture) masquage de la ligne IRQ 1333 DMA_RESET (écriture seule) acquittement de la ligne IRQ 1334 DMA_LEN (écriture/lecture) taille en octets à déplacer 1335 DMA_DST (écriture seule) adresse de destination 1336 DMA_SRC (écriture seule) adresse source 1337 }}} 1338 1326 1339 - Vous allez ajouter un appel système nommé `SYSCALL_MEMCPY` qui réalise la copie d'une zone de la mémoire. Pour cela, vous devez: 1327 1340 - Ajouter une fonction dans la libc que vous appellerez `dma_memcpy()` qui a le même comportement de `memcpy()` avec les mêmes arguments, vous devez modifier les fichiers `ulib/libc.h` et `ulib/libc.c`. 1328 1341 - Ajouter la déclaration de `SYSCALL_DMA_MEMCPY` dans le fichier `commun/syscall.h`. 1329 1342 - Ajouter une entrée dans le tableau `syscall_vector[]` dans le fichier `kernel/ksyscalls.h` pour la fonction `dma_memcpy()`. 1330 - Ajouter une fonction `dma_memcpy()`, vous devez modifier les fichiers `kernel/harch.h` et `kernel/harch.c`. Pour savoir comment écrire cette fonction, vous devez vous référez au cours : 1331 1332 1343 - Ajouter la déclaration d'une variable `__dma_regs_map` dans le fichier `kernel/kernel.ld`. 1344 - Ajouter une fonction `dma_memcpy()`, vous devez modifier les fichiers `kernel/harch.h` et `kernel/harch.c` 1345 1346 Idéalement, il faudrait vérifier que les adresses utilisées sont uniquement dans la partie de l'espace d'adressage autorisée pour l'utilisateur. Cette vérification serait faite dans une fonction intermédiaire dans `kernel/ksyscalls.c` qui ferait les vérifications et qui appellerait `dma_memcpy()` si les adresses sont correctes. Je vous laisse y réfléchir.