[Kos-dev] Anonymous : pas si facile que ca

David Decotigny kos-dev@enix.org
02 Apr 2002 10:07:30 +0200


Hello,

T'avances comme un gros fou, je vois. C'est cooooooool.

Pour l'histoire du map(/dev/null), j'avais propose un protocole y'a
pas longtemps (semaine derniere ?). Ca reposait sur l'alloc d'une
nouvelle SR en meme temps que la creation de la ressource au moment du
open(), et ca permettait la chose suivante :
  - team A : map(/dev/null) sur VR "VA" => nouvelle ressource +
    *nouvelle* SR "RA" (callback "open" un peu particulier pour la SR
    dev_null_master qui cree une nouvelle SR avec chaque ressource)
  - team A : fork => team B (=> copie VR "VA" dans AS de B => meme SR
    "RA" pour les 2 "VA").
  - team A+team B : partagent effectivement la meme SR "RA", donc
    partage de memoire explicite. Si tout autre team fait
    map(/dev/null), il ne partagera *jamais* la /meme/ SR (puisqu'il y
    aura creation d'une nouvelle SR au map(/dev/null)).

Pour l'histoire des anonymous, je suis d'accord que la technique de
marquage de "page swappee" dans les PTE permet de determiner si un #PF
a lieu sur page anonymous swappee ou sur la SR "originale". 2
questions :
  - est-ce que ce mecanisme de marquage reste valide sur d'autres
    architectures ? Je pense que oui tres fortement (j'imagine mal une
    archi sans ne serait-ce que le bit "P" des PTE).
  - est-ce que le modele vmm de kos ne se retrouve pas un peu bancal ?
    Car on a alors 2 types de pages anonymous. Celles qui resultent de
    map(/dev/null) et qui sont associees a une SR ; et celles qui
    resultent de la differenciation par rapport a du MAP_PRIVATE et
    qui ne sont pas associees a une SR. Voir la suite.

Ce que je craignais avec ce modele, c'est qu'on ait des problemes avec
le partage des anonymous du type "anonymous resultant d'une
differentiation". Mais le scenario suivant parait qd meme tenir
debout :
  - team A => map("/foobar") MAP_SHARED  => VR VA
  - team B => map("/foobar") MAP_PRIVATE
  - differentiation (A ou B font des #PF en write sur VA ou VB
    respectivement). Si VA et VB se recouvrent sur la SR de "/foobar",
    il en resulte que la zone VA se retrouve etre une succession de
    mappings de "/foobar" original et de pages anonymous sans SR.
  - team A => fork() => team C : copie (ou COW) des PT + copie des VR
    + MAJ des rmap
  - dans ce cas, A et C mappent un melange de pages de /foobar orignal
    presentes ou absentes de swap/RAM (mais presentes sur disque), et
    des pages anonymous differenciees mais qui sont forcement
    physiquement presentes (RAM ou SWAP), donc on est capable dans les
    2 cas de gerer le partage des pages effectif (via la liste des VR
    de /foobar, ou via le rmap).

Tout ca pour dire que les anonymous /dev/null et les anonymous
resultant de la differentiation ont certes ttes 2 le meme backing
store (le swap). Mais les ressources associees ne sont pas du meme
type : les premieres sont des ressources _logiques_ explicites "sans
nom" (ie map /dev/null), et les 2ndes sont des ressources _physiques_
implicites egalement sans nom (ie swap ou RAM). Dans les 2 cas, on est
capable de faire le partage, puisque dans le 1er cas la SR anonymous
contient la liste des VR qui la partagent, et dans le 2eme cas c'est
rmap qui s'en occupe (bien sur, ca suppose d'avoir un rmap pr le
swap).

Je propose qu'on ait une terminologie plus precise a ce niveau pour
nous y retrouver : "logical anonymous mapping" (ie associe a 1 SR sans
nom cree au map /dev/null), et "physical anonymous mapping" (ie les
pages RAM ou swap physiquement presentes et resultant de la
differentation a cause des MAP_PRIVATE).

Bonne journee,

-- 
David Decotigny