Changes between Version 24 and Version 25 of AS6-TME-B1


Ignore:
Timestamp:
Feb 9, 2022, 11:33:07 AM (2 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AS6-TME-B1

    v24 v25  
    13241324**Exercice**
    13251325
     1326Vous 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.
     1327Dans 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
     1328A la fin de l'opération, le registre LEN contient le nombre d'octet non écrits donc 0.
     1329
     1330Les registres du DMA sont à l'adresse 0xd1200000
     1331{{{
     1332DMA_IRQ_DISABLE         (lecture/écriture)      masquage de la ligne IRQ
     1333DMA_RESET               (écriture seule)        acquittement de la ligne IRQ 
     1334DMA_LEN                 (écriture/lecture)      taille en octets à déplacer
     1335DMA_DST                 (écriture seule)        adresse de destination
     1336DMA_SRC                 (écriture seule)        adresse source
     1337}}}
     1338 
    13261339- 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:
    13271340  - 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`.
    13281341  - Ajouter la déclaration de `SYSCALL_DMA_MEMCPY` dans le fichier `commun/syscall.h`.
    13291342  - 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
     1346Idé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.