IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

organisation de la mémoire: Memory Descriptor List (MDL) et mappage


Sujet :

Windows

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 105
    Points : 61
    Points
    61
    Par défaut organisation de la mémoire: Memory Descriptor List (MDL) et mappage
    Bonjour à tous,
    j'ai un petit souci concernant une définition et je trouve peu de doc qui en parle. Dans un premier temps un petit rappel de ce qu'est un mappage mémoire m'aiderais grandement. Je peux juste en dire qu'il s'agit plus ou moins d'uen ralation entre uen adresse et une autre, genre un lien symbolique mais je me perds déjà :p
    Après, j'aimerais savoir exactement ce qu'est une MDL (memory descriptor list).

    D'après le peu que j'ai pu comprendre, la MDL est une structure définie par le système qui décrit un buffer comme un ensemble d'adresses physiques.
    la structure est la suivante:
    typedef struct _MDL {
    struct _MDL *Next;
    CSHORT Size;
    CSHORT MdlFlags;
    struct _EPROCESS *Process;
    PVOID MappedSystemVa;
    PVOID StartVa;
    ULONG ByteCount;
    ULONG ByteOffset;
    } MDL, *PMDL;
    Pour créer une MDL on appelle:
    //fonction obsolète mais c sur celle-ci que j'ai pu trouver les meillerus exemples
    PMDL MmCreateMdl(
    IN PMDL MemoryDescriptorList OPTIONAL,
    IN PVOID Base,
    IN SIZE_T Length
    );
    En gros , si je lui passe comme base une adresse A sur une longeur de x octets, il crée une MDL. En gros, il crée une sorte de lien entre adresse virtuelle et adresse physique. Mais comment ça fonctionne? Quels mécanismes sont mis en place pour que quand je fasse @MDL+offset, il s'agit exactement de A+offset (avec offset <= x)?
    A quel moment le lien entre les deux adresses est effectué?

    Je susi un peu paumé et j'arrive pas vraiment à expliquer de relation, donc enn espéran qu'une ame charitable puisse m'éclairer un peu
    en vous rerkiant

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Euh, ça, ça me parait être du très bas niveau, genre les fonctions du Kernel. C'est pour faire des drivers, mais aucun programme "utilisateur" n'appelle ces fonctions...

    Ce qu'on appelle "mappage mémoire", c'est plus souvent le concept de "mappage de fichier en mémoire" : Cela permet d'accéder à un fichier ouvert par de simples opérations sur pointeurs plutôt que par des fonctions de lecture/écriture séquentielles (comme fread() et fwrite()).
    Sous Windows, on fait ça avec les fonctions CreateFileMapping() et MapViewOfFile(). Sous un système unixoïde, on utilise la fonction mmap().

    Sinon, au niveau en-dessous dans l'architecture, il y a tout le concept de "mémoire virtuelle", qui consiste à faire correspondre différentes parties des 4Go adressables à différentes parties de la mémoire physique (qui fait souvent beaucoup moins de 4Go) et au disque dur. Et ce, différemment selon chaque processus. Deux processus peuvent écrire à des adresses virtuelles identiques, qui correspondront à deux adresses physiques différentes...

  3. #3
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    Citation Envoyé par johan_b Voir le message
    Dans un premier temps un petit rappel de ce qu'est un mappage mémoire m'aiderais grandement. Je peux juste en dire qu'il s'agit plus ou moins d'uen ralation entre uen adresse et une autre, genre un lien symbolique mais je me perds déjà :p
    Comme il existe différent type de "mapping" (c'est un terme un peu fourre-tout). Dans l'acception où tu semble l'entendre il s'agit du processus de transition entre une adresse physique et une adresse virtuelle (et vice-versa).

    Après, j'aimerais savoir exactement ce qu'est une MDL (memory descriptor list).

    D'après le peu que j'ai pu comprendre, la MDL est une structure définie par le système qui décrit un buffer comme un ensemble d'adresses physiques.
    Dis autrement : Une MDL est un structure système qui décrit les pages d'un buffer (des adresses virtuelles) par un ensemble d'adresses physiques.

    En gros, il crée une sorte de lien entre adresse virtuelle et adresse physique.
    Exactement, c'est la raison d'être d'une MDL. Toutefois, pour être précis, ça n'est pas un lien, mais une "simple" description. Les PTEs, PDEs et autres structures par contre, établissent réellement un lien.

    Mais comment ça fonctionne? Quels mécanismes sont mis en place pour que quand je fasse @MDL+offset, il s'agit exactement de A+offset (avec offset <= x)?
    Je n'ai pas compris la deuxième phrase...

    A quel moment le lien entre les deux adresses est effectué?

    Je susi un peu paumé et j'arrive pas vraiment à expliquer de relation, donc enn espéran qu'une ame charitable puisse m'éclairer un peu
    en vous rerkiant
    Si tu cherches à établir des correspondances entre adresses virtuelles et physiques, cela se fait grâce aux page table entry (PTE) et page directory entry (PDE) notamment. Tu trouvera un peu de littérature sur le sujet sur le net.

    Sous Windbg tu as les commandes !pte et !vtop.

    Il faut savoir que c'est un mécanisme relativement complexe à la base sur lequel viennent en plus se rajouter d'autres mécanismes, comme par exemple le transition lookaside buffer (TLB).

    Si toutefois tu veux plus d'infos, n'hésites pas à demander.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 105
    Points : 61
    Points
    61
    Par défaut
    Bonjour bonjour,
    déjà merci pour les réponses ça m'a bien éclairé. Sinon entre temps j'ai trouvé (plus ou moins) des réponses sur ce bouquin (une petite description des MDL page 217):
    http://books.google.com/books?id=nZu...jOIc#PPA217,M1

    Citation Envoyé par Neitsa Voir le message
    Bonjour,
    Dis autrement : Une MDL est un structure système qui décrit les pages d'un buffer (des adresses virtuelles) par un ensemble d'adresses physiques.
    Exactement, c'est la raison d'être d'une MDL. Toutefois, pour être précis, ça n'est pas un lien, mais une "simple" description. Les PTEs, PDEs et autres structures par contre, établissent réellement un lien.
    ok maintenant c'est clair pour moi , après pour les PTE et PDE va falloir que je bouquine un peut, ça a pas l'air très evident :p

    Citation Envoyé par Neitsa
    Citation Envoyé par johan_b
    Mais comment ça fonctionne? Quels mécanismes sont mis en place pour que quand je fasse @MDL+offset, il s'agit exactement de A+offset (avec offset <= x)?
    Je n'ai pas compris la deuxième phrase...
    Je ne le comprend pas non plus XD. En fait j'avais pas compris une portion de code notemment MmMapLockedPages. j'ai trouvé peu de doc dessus mais si j'ai pigé: cette fonction mappe les pages physiques décrites dans la MDL et renvoie l'adresse de base des pages mappées en mémoire (soit le champ startVa de notre MDL).
    c"est cette adresse que j'avais nommé @MDL, et A était l'adresse de la zone mémoire à mapper
    (heu au final j'ai l'impression de toujours pas savoir m'exprimer :p)

    Pour les mécanismes mis en oeuvre, c'est vrai que ça a l'air assez complexe.
    En plus je m'éloigne de mon sujet :p mais bon c'est vrai que ça fait tjrs plaisir de bien comprendre les mécanismes qui se passent en dessous même si c'est pas indispensable pour comprendre certains principes.
    En tout cas, quand j'aurrais du temps (oui en ce moment tendu, ya des rapports à faire et des partiels à passer :p) je ferais un peu de lecture la dessus, et comptes sur moi pour poser des question

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 105
    Points : 61
    Points
    61
    Par défaut
    ah si une dernière question ^^
    non pas que je craches sur devnet - qui a tjrs été mon fofo de prédilection pour poser des questions car toujours des gens compétents pour répondre -jme demande si c'est le meilleur fofo pour parler de ça, dc à la limite si vous avez des adresses, MPez moi (oui c'est un néologisme ^^)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 25/08/2011, 09h20
  2. Réponses: 7
    Dernier message: 02/09/2009, 22h39
  3. [AJAX] Que faire contre les fuites mémoires (memory leaks)
    Par cassy dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 21/08/2007, 16h50
  4. Fuite de mémoire en utilisant le template list
    Par schtroumpf_farceur dans le forum Langage
    Réponses: 9
    Dernier message: 18/07/2005, 20h44
  5. [pb mémoire] out of memory d'eclipse
    Par Casp dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 12/05/2005, 16h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo