Changes between Version 8 and Version 9 of SujetTD0
- Timestamp:
- Jan 27, 2017, 6:58:45 AM (8 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
SujetTD0
v8 v9 62 62 }}} 63 63 64 L'appel système mmappermet de récupérer un pointeur vers une zone mémoire donnée en paramètres. À l'inverse, munmap permet de libérer l'association entre le pointeur fourni par mmap et la zone mémoire associée lors de l'appel à mmap.64 L'appel système [[http://manpagesfr.free.fr/man/man2/mmap.2.html|mmap]] permet de récupérer un pointeur vers une zone mémoire donnée en paramètres. À l'inverse, munmap permet de libérer l'association entre le pointeur fourni par mmap et la zone mémoire associée lors de l'appel à mmap. 65 65 66 66 * Quel est l'intérêt ou le besoin de protéger les zones mémoires liées aux contrôleurs d'entrées/sorties ? 67 67 {{{#!protected 68 réponse 68 - Sureté et sécurité 69 - sureté pour ne pas faire un mauvais usage du matériel 70 - sécurité pour ne pas utiliser les droits pour volontairement casser le matériel 69 71 }}} 70 72 … … 73 75 * Qu'est-ce que le fichier /dev/mem ? Est-ce un vrai fichier ? 74 76 {{{#!protected 75 réponse 77 - C'est un pseudo-fichier qui permet d'accéder à la mémoire physique au travers de l'abstraction des fichiers. 78 - Il faut avoir les droits du root pour ouvrir ce fichier. 79 - ce n'est évidemment pas un fichier, ce n'est qu'une abstraction. 76 80 }}} 77 81 78 82 * Comment utilise-t-on le fichier /dev/mem ? 79 83 {{{#!protected 80 réponse 81 }}} 82 83 * Comment faire fonctionner ensemble les informations contenues dans le fichier /dev/mem avec l'appel système mmap ? 84 {{{#!protected 85 réponse 84 - il faut l'ouvrir avec open() 85 - on peut ensuite utiliser read() et write() mais il est plus propre d'utiliser mmap() qui permet d'accéder à la mémoire comme de la mémoire (comme un tableau d'octets). 86 86 }}} 87 87 88 88 * Sachant que l'adresse de base du contrôleur de GPIO est 0x20200000, quel serait le code C qui permettrait d'accéder au registre GPFSEL0 du contrôleur de GPIO ? 89 89 {{{#!protected 90 réponse 90 {{{#!c 91 mmap_result = mmap ( 92 NULL // adresse virtuelle souhaitée, laissée NULL quand on laisse choisir l'OS 93 , RPI_BLOCK_SIZE // nombre d'octets demandés qui doit être un multiple de la taille d'une page 94 , PROT_READ | PROT_WRITE // type d'accès autorisé par le programme 95 , MAP_SHARED // si plusieurs processus map le même zone, ils verront la même copie (!=MAP_PRIVATE) 96 , mmap_fd // file descriptor : identifiant de /dev/mem donné par open 97 , BCM2835_GPIO_BASE ); // décalage par rapport au premier octet de la mémoire 98 99 (unsigned volatile int *) GPSEL0 = mmap_result; // volatile pour ne pas avoir une mise en cache dans les registres 100 *GPSELO = value; 101 }}} 91 102 }}} 92 103 … … 95 106 * Avec tout ce que vous avez appris jusqu'à présent, quelles seraient les grandes étapes pour réaliser un programme qui fasse clignoter une LED à une fréquence donnée ? 96 107 {{{#!protected 97 réponse 108 - ouvrir /dev/mem 109 - mapper la zone où se trouve les registres de contrôle des GPIO 110 - configurer la broche GPIO choisie en sortie. 111 - faire une boucle 112 - broche <- 0 113 - attendre 114 - broche <- 1 115 - attendre 98 116 }}} 99 117 100 118 * Quelles sont les fonctions C associées ? 101 119 {{{#!protected 120 - open 121 - mmap 122 - sleep (ou un équivalent) 102 123 }}}