Nous avons vu que certaines pages de la mémoire virtuelle:
Nous allons voir un appel système qui permet d'associer un segment de mémoire virtuelle à un segment de fichier. Cet appel système est par exemple utilisé pour charger les librairies partagées.
Associer le segment (une partie) d'un fichier à un nouveau segments de mémoire partagé (file mapping). Cela permet de:
Un tel fichier ne sera pas chargé intégralement en mémoire mais page par page au fur et a mesure des fautes de page du processus.
Deux processus peuvent partager un segment en y associant des espaces d’adressage virtuel différents:
Pour associer un fichier à un espace de la mémoire virtuelle du processus on:
fd
:int open(const char *pathname, int flags);
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
int munmap(void *addr, size_t length);
int close(int fd);
On peut ouvrir un fichier avec l'appel système suivant:
int open(const char *pathname, int flags);
pathname
est le nom du fichier;flags
est un champ de bit indiquant le mode d'accès au fichier (O_RDONLY, O_WRONLY, O_RDWR
);errno
).On doit fermer un fichier avec l'appel système suivant:
int close(int fd);
fd
est l'entier représentant le fichier (descripteur de fichier);errno
).
#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
fd
: entier représentant le fichier (file descriptor);addr
: adresse d‘un début de page (ajustée automatiquement), si NULL l'adresse est choisie automatiquement;offset
: début du mapping dans le fichier, doit être multiple de la taille d'une pagelength
: taille du mapping dans le fichier, complété par des zéros pour remplir une page en mémoire
#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
prot
, bit field définissant la protection des pages partagées:
PROT_READ / PROT_WRITE / PROT_EXEC
autorise respectivement la lecture, l’écriture et l’exécution;PROT_NONE
aucun droit, utilisé pour réserver des pages;flags
, bit field utilisé pour les options suivantes:
MAP_SHARED
: la zone est partagée entre les processus / fichiers toute modification sera reportée aux autres processus et dans le fichier;MAP_PRIVATE
: copy-on-write, si un processus modifie le contenu il crée sa propre copie des pages et le fichier ne sera pas modifié;MAP_ANONYMOUS
: pas d’association avec un fichier, la mémoire est initialisée à 0 (fd et offset sont ignorés) et partageable uniquement avec ses enfants.L'objectif de cet exercice est de créer un processus qui:
On simule ainsi l'exécution d'un code externe un peu comme cela est fait pour une librairie partagée
Le programme à charger est fournit en assembleur. Il faut le compiler avec nasm
(voir Makefile).
Il faut donc:
simple
,readelf
pour identifier le segment à charger et le point d'entrée du programme,#define
mmap
,Pour aller plus loin: votre programme C devra rechercher les informations du segment et du point d'entrée directement dans le fichier executable.