(03) add day
This commit is contained in:
parent
a793ed14af
commit
7e6630de43
3 changed files with 101 additions and 0 deletions
9
03/Makefile
Normal file
9
03/Makefile
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
CC = gcc
|
||||||
|
CFLAGS = -Wall -g
|
||||||
|
SRC = main.c
|
||||||
|
|
||||||
|
all:
|
||||||
|
$(CC) $(CFLAGS) $(SRC) -o mmap
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm mmap
|
84
03/main.c
Normal file
84
03/main.c
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Je me suis aidé du template pour les variables à utiliser. Je les ai
|
||||||
|
* cependant renommées pour mieux m'y retrouver.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define PAGE_SIZE 4096
|
||||||
|
#define PERSISTENT_SIZE sizeof(int) * 2
|
||||||
|
|
||||||
|
/*
|
||||||
|
* __attribute__(()) = macro pour GCC afin de rajouter des informations
|
||||||
|
*
|
||||||
|
* section("persistent") : on met dans la section persistent les valeurs au
|
||||||
|
* lieu de la section text de l'ELF.
|
||||||
|
*
|
||||||
|
* aligned(PAGE_SIZE) = on a besoin d'aligner notre "borne supérieur" car on
|
||||||
|
* est en dehors de la section data et qu'on doit suivre les règles du MMU.
|
||||||
|
* Cela permet aussi de commencer au début d'une page.
|
||||||
|
* cf. le template pour + d'infos.
|
||||||
|
*
|
||||||
|
* À noter que si on lui assigne une valeur, celle-ci sera écrite dans le
|
||||||
|
* fichier si on écrit dans le fichier les valeurs de la section persistent.
|
||||||
|
*/
|
||||||
|
__attribute__((section("persistent"), aligned(PAGE_SIZE))) int start;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Comme il n'y a pas l'attribut de section, cette variable sera mise dans
|
||||||
|
* la section text au lieu de persistent. La mettre au milieu des 2 autres
|
||||||
|
* variables ne fait rien.
|
||||||
|
*/
|
||||||
|
int foo = 42;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* on place le compteur dans la section persistent afin de le copier dans le
|
||||||
|
* lier avec le fichier.
|
||||||
|
*/
|
||||||
|
__attribute__((section("persistent"))) int count;
|
||||||
|
|
||||||
|
int setup_persistent(char *name)
|
||||||
|
{
|
||||||
|
/* on ouvre en lecture écriture ou créé le fichier */
|
||||||
|
int fd = open(name, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
|
||||||
|
|
||||||
|
if (fd < 0) return -1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* on le coupe à la bonne taille pour pouvoir lier la section persistent et
|
||||||
|
* le fichier. Comme la section persistent contient start et count, on
|
||||||
|
* redimenssionne le fichier pour stocker 2 entiers.
|
||||||
|
*/
|
||||||
|
if (ftruncate(fd, PERSISTENT_SIZE)) return -1;
|
||||||
|
|
||||||
|
if (mmap(
|
||||||
|
&start, /* début de la section persistent */
|
||||||
|
PERSISTENT_SIZE, /* taille de la section persistent */
|
||||||
|
PROT_WRITE | PROT_READ, /* on accède en lecture/écriture au mapping */
|
||||||
|
MAP_SHARED | MAP_FIXED, /* on partage le mapping et on se place à
|
||||||
|
l'adresse exact du start */
|
||||||
|
fd, /* on lie notre fichier mmap.persistent à la
|
||||||
|
zone mémoire */
|
||||||
|
0) /* on commence au début du fichier */
|
||||||
|
== MAP_FAILED)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
if (setup_persistent("mmap.persistent"))
|
||||||
|
{
|
||||||
|
perror("setup_persistent");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("count = %d\n", count++);
|
||||||
|
printf("foo = %d\n", foo++);
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -25,3 +25,11 @@ On fait un fork basique, avec d'autres épreuves tel qu'une chimère
|
||||||
processus-thread, un thread et un processus qui change d'utilisateur.
|
processus-thread, un thread et un processus qui change d'utilisateur.
|
||||||
|
|
||||||
Je n'ai pas fait la denière étape où il faut changer l'UID.
|
Je n'ai pas fait la denière étape où il faut changer l'UID.
|
||||||
|
|
||||||
|
### 03 - Zone mémoire
|
||||||
|
|
||||||
|
Syscalls utilisés: ftruncate, mmap, open, close.
|
||||||
|
|
||||||
|
Liaison d'un fichier et d'une zone mémoire. Chaque fois qu'on lance le
|
||||||
|
programme, un compteur est incrémenté de 1. Je me suis aidé du template pour la
|
||||||
|
création des variables de base.
|
||||||
|
|
Loading…
Reference in a new issue