14 | | |
15 | | 1. Qu'est-ce que la mémoire virtuelle ? |
16 | | {{{#!protected |
17 | | - La mémoire virtuelle est un espace d'adressage (un ensemble d'adresses) dans lequel s'exécute un processus. |
18 | | - La question suivante est : qu'est-ce qu'un processus ?[[BR]] |
19 | | -> Un processus est un conteneur de ressource permettant à un programme de s'exécuter. Les ressources sont : |
20 | | - un espace d'adressage |
21 | | - un programme |
22 | | - un ensemble de fichiers ouverts |
23 | | - ... |
24 | | - un ou plusieurs fils d'exécution (threads) ayant chacun |
25 | | - un contexte de processeur |
26 | | - une pile d'exécution |
27 | | }}} |
28 | | |
29 | | 2. Quelle est l'intérêt de la mémoire virtuelle ? |
30 | | {{{#!protected |
31 | | - La mémoire virtuelle permet d'isoler les processus entre eux. |
32 | | - La mémoire virtuelle permet de produire du code binaire sans connaître les adresses effectivement disponibles au moment de l'exécution. |
33 | | - 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) |
34 | | }}} |
35 | | |
36 | | 3. Qu'est-ce qu'une MMU ? |
37 | | {{{#!protected |
38 | | - Chaque espace virtuel va être mappé sur l'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 et sont traduites en adresses physiques par la MMU (Memory Management Unit) sur la base d'une table de page qui associe une page physique à chaque page virtuelle donnée à l'application avec des droits d'accès. |
39 | | }}} |
40 | | |
41 | | 4. Qu'est-ce qu'un défaut de page ? Est-ce grave ? |
42 | | {{{#!protected |
43 | | - Un défaut de pages survient lorsque que le processeur demande l'accès à une adresse virtuelle pour laquelle l'OS n'a pas encore attribuée de page physique. Ce n'est pas forcément un problème, c'est même le cas normal, puisque l'OS n'attribue des pages physiques que si c'est nécessaire. |
44 | | }}} |
| 14 | 2. Qu'est-ce que la mémoire virtuelle ? ([#R2 réponse]) |
| 15 | 3. Qu'est-ce qu'un processus ? ([#R3 réponse]) |
| 16 | 4. Quelle est l'intérêt de la mémoire virtuelle ? ([#R4 réponse]) |
| 17 | 5. Qu'est-ce qu'une MMU ? ([#R5 réponse]) |
| 18 | 6. Qu'est-ce qu'un défaut de page ? Est-ce grave ? ([#R6 réponse]) |
72 | | * Qu'est-ce que le fichier /dev/mem ? Est-ce un vrai fichier ? |
73 | | {{{#!protected |
74 | | - C'est un pseudo-fichier qui permet d'accéder à la mémoire physique au travers de l'abstraction des fichiers. |
75 | | - Il faut avoir les droits du root pour ouvrir ce fichier. |
76 | | - ce n'est évidemment pas un fichier, ce n'est qu'une abstraction. |
77 | | }}} |
| 41 | 8. Qu'est-ce que le fichier /dev/mem ? Est-ce un vrai fichier ? |
| 42 | 9. Comment utilise-t-on le fichier /dev/mem ? |
| 43 | 10. 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 ? |
79 | | * Comment utilise-t-on le fichier /dev/mem ? |
80 | | {{{#!protected |
81 | | - il faut l'ouvrir avec open() |
82 | | - 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). |
83 | | }}} |
84 | | |
85 | | * 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 ? |
86 | | {{{#!protected |
87 | | {{{#!c |
88 | | mmap_result = mmap ( |
89 | | NULL // adresse virtuelle souhaitée, laissée NULL quand on laisse choisir l'OS |
90 | | , RPI_BLOCK_SIZE // nombre d'octets demandés qui doit être un multiple de la taille d'une page |
91 | | , PROT_READ | PROT_WRITE // type d'accès autorisé par le programme |
92 | | , MAP_SHARED // si plusieurs processus map le même zone, ils verront la même copie (!=MAP_PRIVATE) |
93 | | , mmap_fd // file descriptor : identifiant de /dev/mem donné par open |
94 | | , BCM2835_GPIO_BASE ); // décalage par rapport au premier octet de la mémoire |
95 | | |
96 | | (unsigned volatile int *) GPSEL0 = mmap_result; // volatile pour ne pas avoir une mise en cache dans les registres |
97 | | *GPSELO = value; |
98 | | }}} |
99 | | }}} |
103 | | * 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 ? |
104 | | {{{#!protected |
105 | | - ouvrir /dev/mem |
106 | | - mapper la zone où se trouve les registres de contrôle des GPIO |
107 | | - configurer la broche GPIO choisie en sortie. |
108 | | - faire une boucle |
109 | | - broche <- 0 |
110 | | - attendre |
111 | | - broche <- 1 |
112 | | - attendre |
113 | | }}} |
114 | | |
115 | | * Quelles sont les fonctions C associées ? |
116 | | {{{#!protected |
117 | | - open |
118 | | - mmap |
119 | | - sleep (ou un équivalent) |
120 | | }}} |
| 48 | 11. Quelles sont les grandes étapes pour réaliser un programme qui fasse clignoter une LED à une fréquence donnée ? |
| 49 | 12. Quelles sont les fonctions C associées ? |
| 57 | 1. [=#R2] La mémoire virtuelle est un espace d'adressage (un ensemble d'adresses) dans lequel s'exécute un processus. |
| 58 | 1. [=#R3] Un processus est un conteneur de ressource permettant à un programme de s'exécuter. Les ressources sont : |
| 59 | - un espace d'adressage |
| 60 | - un programme |
| 61 | - un ensemble de fichiers ouverts |
| 62 | - ... |
| 63 | - un ou plusieurs fils d'exécution (threads) ayant chacun |
| 64 | - un contexte de processeur |
| 65 | - une pile d'exécution |
| 66 | 1. [=#R4] La mémoire virtuelle a plusieurs avantages : |
| 67 | - La mémoire virtuelle permet d'isoler les processus entre eux. |
| 68 | - La mémoire virtuelle permet de produire du code binaire sans connaître les adresses |
| 69 | effectivement disponibles au moment de l'exécution. |
| 70 | - La mémoire virtuelle d'étendre la mémoire utilisable au delà de la mémoire physique |
| 71 | réellement disponible (grâce au swap disque). |
| 72 | 1. [=#R5] Chaque espace virtuel va être mappé sur l'espace physique, |
| 73 | c'est-à-dire que lorsqu'un processeur exécute une instruction d'accès à la mémoire. |
| 74 | Il commence par émettre l'adresse de l'instruction puis l'adresse de la donnée. |
| 75 | Ces adresses sont virtuelles et sont traduites en adresses physiques par la MMU |
| 76 | (Memory Management Unit) sur la base d'une table de page qui associe une page physique à chaque |
| 77 | page virtuelle donnée à l'application avec des droits d'accès. |
| 78 | 1. [=#R6] Un défaut de pages survient lorsque que le processeur demande l'accès à une adresse |
| 79 | virtuelle pour laquelle l'OS n'a pas encore attribuée de page physique. |
| 80 | Ce n'est pas forcément un problème, c'est même le cas normal, puisque l'OS n'attribue des |
| 81 | pages physiques que si c'est nécessaire. |
| 82 | 1. [=#R7] Sûreté et sécurité : |
| 83 | - sûreté pour ne pas faire un mauvais usage du matériel |
| 84 | - sécurité pour ne pas utiliser les droits pour volontairement casser le matériel |
| 85 | 1. [=#R8] C'est un pseudo-fichier qui permet d'accéder à la mémoire physique au travers de |
| 86 | l'abstraction des fichiers. |
| 87 | 1. [=#R9] Il faut avoir les droits du root pour ouvrir ce fichier. |
| 88 | Ce n'est évidemment pas un fichier, ce n'est qu'une abstraction. |
| 89 | 1. [=#R10]il faut l'ouvrir avec open(), on peut ensuite utiliser read() et write() |
| 90 | mais il est plus propre d'utiliser mmap() qui permet d'accéder à la mémoire comme |
| 91 | de la mémoire (comme un tableau d'octets). |
| 92 | {{{#!c |
| 93 | mmap_result = mmap ( |
| 94 | NULL // adresse virtuelle souhaitée, laissée NULL quand on laisse choisir l'OS |
| 95 | , RPI_BLOCK_SIZE // nombre d'octets demandés qui doit être un multiple de la taille d'une page |
| 96 | , PROT_READ | PROT_WRITE // type d'accès autorisé par le programme |
| 97 | |