= Auto-test = Ce document a pour objectif de vous vérifier votre niveau sur les éléments de base de la programmation bas niveau en C. En effet, vous allez être amenés à manipuler des informations très proches du matériel avec un faible niveau d'abstraction. De ce fait il est indispensable que vous soyez opérationnel sur ces aspects. Une grande partie des questions ont été abordées en cours, vous pouvez ainsi vous rendre compte si vous avez intégré les informations. == 1. Mémoire virtuelle et mapping mémoire == La carte Raspberry Pi est composée d'un système sur puce (System-on-Chip, SoC) BCM2835 de chez Broadcom. Ce SoC est composé de deux Memory Management Units (MMUs). La première MMU est intégrée au processeur ARM 11 du SoC. La seconde est une MMU "gros grain" au niveau du SoC lui-même. La première MMU est une unité de gestion des translations d'adresse "classique" tandis que la seconde MMU permet de remanier le placement mémoire des périphériques du SoC. * Qu'est-ce que la mémoire physique ? {{{#!protected - La mémoire physique est, en principe, la vraie mémoire qui est accédée par un espace d'adressage. Derrière chaque adresses physique, il y a de la vraie mémoire ou un registre de configuration de périphérique. }}} * Qu'est-ce que la mémoire virtuelle ? {{{#!protected - La mémoire virtuelle est un espace d'adressage (un ensemble d'adresses) dans lequel s'exécute un processus. - La question corollaire est qu'est-ce qu'un processus ?[[BR]] -> Un processus est un programme en train de s'exécuter dont les ressources sont - un espace d'adressage - un programme - un ensemble de fichiers ouverts - ... - un ou plusieurs fils d'exécution (threads) ayant chacun - un contexte de processeur - une pile d'exécution }}} * Pourquoi utiliser la mémoire virtuelle et dans quel contexte ? {{{#!protected - La mémoire virtuelle permet d'isoler les processus entre eux. - La mémoire virtuelle permet de produire du code binaire sans connaitre les adresses effectivement disponibles au moment de l'exécution. - La mémoire virtuelle d'étendre la mémoire utilisable au delà de la mémoire physique réellement disponible (grâce au swap disque) }}} * Qu'est-ce qu'une MMU ? {{{#!protected - Chaque espace virtuel va être mappé sur un espace physique, c'est à dire que lorsqu'un processeur exécute une instruction d'accès à la mémoire. Il commence par émettre l'adresse de l'instruction puis l'adresse de la donnée. Ces adresses sont virtuelles }}} * Comment fonctionne la traduction d'adresse avec un seul niveau de MMU ? Qu'est-ce qu'une table des pages ? Qu'est-ce qu'un défaut de page ? {{{#!protected réponse }}} * Pourquoi utiliser plusieurs niveaux de table de pages ? {{{#!protected réponse }}} * Pourquoi utiliser une seconde MMU ? Quel est son fonctionnement ? {{{#!protected réponse }}} == 2. Accès aux registres mappés en mémoire == Nous fonctionnons sur un système qui utilise un mécanisme de mémoire virtuelle et dès lors l'accès à certaines zones mémoires est protégé par le système d'exploitation, ici Linux. C'est le cas notamment pour les zones mémoires correspondant aux contrôleurs d'entrées/sorties. Néanmoins, un peut quand même accéder à ces zones mémoires grâce à l'appel système mmap, dont le prototype est le suivant: {{{#!c void * mmap ( void * addr, size_t length, int prot, int flags, int fd, off_t offset ); }}} et sa réciproque: {{{#!c int munmap ( void * addr, size_t length ); }}} L'appel système 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. * 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 ? {{{#!protected réponse }}} Pour accéder aux contrôleurs d'entrées/sorties mappés en mémoire, on utilise le mapping configuré dans le noyau Linux. Ce mapping est accessible depuis le fichier /dev/mem. * Qu'est-ce que le fichier /dev/mem ? Est-ce un vrai fichier ? {{{#!protected réponse }}} * Comment utilise-t-on le fichier /dev/mem ? {{{#!protected réponse }}} * Comment faire fonctionner ensemble les informations contenues dans le fichier /dev/mem avec l'appel système mmap ? {{{#!protected réponse }}} * 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 ? {{{#!protected réponse }}} == 4. Réalisation d'un programme pour faire clignoter une LED == * 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 ? {{{#!protected réponse }}} * Quelles sont les fonctions C associées ? {{{#!protected }}}