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

Objectifs

Le but de ce TP est d'apprendre à utiliser

  • Comment fonctionne la mémoire virtuelle
  • Inspection de la disposition de la mémoire de processus (pmap)
  • Mappage de fichiers et de pages vides en mémoire

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é:

  • PROT_READ (lire)
  • PROT_WRITE (écrire)
  • PROT_EXEC (exécution)
  • PROT_NONE .

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 ):

  • MAP_PRIVATE - Utilisez une politique de copie sur écriture . La zone contiendra initialement une copie du fichier, mais les écritures ne sont pas effectuées dans le fichier. Les modifications ne seront pas visibles dans les autres processus , s'il y a plusieurs processus qui ont fait “mmap” sur la même zone du même fichier.
  • MAP_SHARED - Les entrées sont mises à jour immédiatement dans tous les mappages existants. De cette façon, tous les processus qui ont effectué des mappages verront les modifications. En effet, les mappages “MAP_SHARED” sont effectués sur les pages physiques du cache de pages et les appels r / w utilisent les pages physiques du cache de pages pour réduire le nombre de lectures / écritures à partir du disque. Les mises à jour du disque auront lieu ultérieurement, sans précision.
  • MAP_FIXED - Si l'affectation à l'adresse spécifiée par start ne peut pas être effectuée, l'appel échouera.
  • MAP_LOCKED - Cette page sera bloquée de cette manière mlock.
  • MAP_ANONYMOUS - Mappe la RAM (les arguments fd et offset sont ignorés).

  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.
sde2/laboratoare/08_rust.txt · Last modified: 2023/05/02 08:07 by cristiana.andrei
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0