Table of Contents

TP 08 - Mémoire Virtuelle (Mappage de fichiers)

Objectifs

Le but de ce TP est d'apprendre à utiliser

Assignment

Vous devez accepter le assignment d'ici et travailler avec ce repository: Lab8

Mappage de fichiers

Après avoir mappé un fichier à l'espace d'adressage du processus, l'accès à ce fichier peut se faire de la même manière que l'accès aux données à partir d'un vecteur. L'efficacité de la méthode vient du fait que la zone mémoire est gérée de la même manière que la mémoire virtuelle, soumise aux règles d'évacuation du disque lorsque la mémoire devient insuffisante (de cette façon on peut travailler avec des mappages qui dépassent la taille effective de la mémoire physique). De plus, la partie I / O est réalisée par le noyau, le programmeur écrivant du code qui ne récupère / stocke que les valeurs de / dans la région mappée. Ainsi, il n'est plus appelé read , write , lseek - ce qui simplifie souvent l'écriture de code.

Tous les descripteurs de fichiers ne peuvent pas être mappés en mémoire. Les sockets, les tuyaux, les périphériques qui n'autorisent que l'accès séquentiel (par exemple, le périphérique char) sont incompatibles avec les concepts de mappage. Il existe des cas où les fichiers normaux ne peuvent pas être mappés (par exemple, s'ils n'étaient pas ouverts pour plus de lisibilité; pour plus d'informations: man mmap ).

mmap

Prototype de fonction mmap qui permet le mappage d'un fichier à l'espace d'adressage du processus est le suivant:

void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
pub unsafe fn mmap(
    addr: Option<NonZeroUsize>,
    length: NonZeroUsize,
    prot: ProtFlags,
    flags: MapFlags,
    fd: RawFd,
    offset: off_t
) -> Result<*mut c_void>

La fonction retournera en cas d'erreur MAP_FAILED . Si le mappage a réussi, il renverra un pointeur vers une zone de mémoire dans l'espace d'adressage du processus, la zone où le fichier décrit par le descripteur fd a été mappé, en commençant par l'offset. L'utilisation du paramètre start vous permet de proposer une zone mémoire spécifique à mapper. L'utilisation de la valeur NULL pour le paramètre start indique l'absence de préférence concernant la zone dans laquelle l'allocation sera effectuée. L'adresse spécifiée par le paramètre start doit être multiple de la taille d'une page . Si le système d'exploitation ne peut pas mapper le fichier à l'adresse requise, il le mappera à un emplacement proche et multiple de la taille d'une page. L'adresse la plus appropriée est également retournée.

Le paramètre prot spécifie le type d'accès souhaité:

Lorsque la zone est utilisée autrement que ce qui est indiqué, un signal SIGSEGV est généré.

Le paramètre flags vous permet de définir le type de mappage que vous souhaitez; il peut prendre les valeurs suivantes (combinées par OR en bits; il doit y avoir au moins MAP_PRIVATE ou MAP_SHARED ):

  Il est à noter que l'utilisation de MAP_SHARED permet le partage de mémoire entre des processus qui ne sont pas liés. Dans ce cas, le contenu du fichier devient le contenu initial de la mémoire partagée et toutes les modifications apportées par les processus dans cette zone sont ensuite copiées dans le fichier, garantissant ainsi la persistance dans le système de fichiers.

shm_open

shm_open() crée et ouvre un nouveau POSIX ou ouvre un POSIX existant objet de mémoire partagée. Un objet de mémoire partagée POSIX est en vigueur un handle qui peut être utilisé par des processus non liés à mmap() même région de mémoire partagée. La fonction shm_unlink() effectue l'opération inverse, en supprimant un objet précédemment créé par shm_open().

pub fn shm_open<P>(name: &P, flag: OFlag, mode: Mode) -> Result<RawFd>

En cas de réussite, shm_open() renvoie un nouveau descripteur de fichier se référant à l'objet de mémoire partagée. Ce descripteur de fichier est garanti d'être le descripteur de fichier avec le numéro le plus bas non précédemment ouvert dans le cadre du processus.

The file descriptor is normally used in subsequent calls to ftruncate() (for a newly created object) and mmap(). After a call to mmap() the file descriptor may be closed without affecting the memory mapping.

Bibliographie

Exercices

  1. Résolvez les lignes TODO (dans l'ordre) à partir de ex1.
  2. Résolvez les lignes TODO (dans l'ordre) de ex2.
  3. Résolvez les lignes TODO (dans l'ordre) de ex3.