2010-05-17 4 views
16

J'ai une petite question simple que quelqu'un qui sait sera en mesure de répondre facilement, j'ai cherché google, mais n'a pas pu trouver la réponse.Les fichiers .dll sont-ils chargés une fois pour chaque programme ou une fois pour tous les programmes?

De nombreux programmes s'exécutent en même temps sur un ordinateur, et ma question est la suivante: lorsqu'un programme charge une DLL, charge-t-il réellement le fichier DLL ou trouve-t-il la mémoire dans laquelle la DLL est déjà chargée? Par exemple, est ws2_32.dll (winsock 2) chargé pour chaque programme qui utilise winsock, ou est-il chargé une fois et tous les programmes qui l'utilisent utilisent les mêmes adresses de mémoire pour appeler les fonctions?

Répondre

18

Il est chargé une fois et tous les programmes partagent la même copie en mémoire du code. C'est un peu compliqué, mais pour les sections en lecture seule de la DLL (c'est-à-dire du code), le chargeur du système d'exploitation utilise une technique appelée "mappage mémoire" pour mapper la DLL dans l'espace adresse du processus. Les pages ne sont chargées dans la mémoire physique qu'une seule fois pour tous les processus, même si la page peut être mappée à une adresse différente dans leur espace d'adressage virtuel. Cependant, chaque processus a une section de données distincte (de sorte que les variables globales ne sont pas partagées - à moins que vous ne le demandiez explicitement) et qu'elles ont évidemment un tas séparé de sorte que la mémoire allouée dynamiquement n'est pas partagée.

+0

Ok merci, cela a du sens. J'avais juste besoin de savoir si un pointeur vers une fonction d'une DLL pointe vers la même adresse que celle utilisée par tous les programmes qui ont utilisé la fonction. – Nilbert

+2

La réponse à cette question est "non". Les pointeurs de fonction sont des adresses dans les processus * l'espace d'adressage virtuel *, ce qui n'est certainement pas partagé entre les processus. Une DLL peut être chargée à différentes adresses dans différents processus, et donc l'adresse d'un pointeur de fonction sera différente - même si la même page physique est utilisée. –

+0

En fait, il serait hautement improbable que la fonction ait la même adresse dans deux programmes différents. Le code de la DLL sera mappé dans le prochain espace d'adressage disponible après toutes les contributions de segment de code qui le précèdent. Dans Secure Linux, la randomisation d'adresse de chargement est utilisée (pour empêcher viri d'utiliser des adresses codées en dur dans les attaques). Vous n'écrivez pas de virus, n'est-ce pas? :-) – wallyk

5

Cela dépend de ce que vous entendez par "chargé". La DLL est préparée pour une utilisation partagée du code et des données: la plupart des environnements Windows respectent la possibilité de partage (en mappant la même copie de mémoire du code dans l'espace mémoire de chaque processus) pour économiser la mémoire. Cependant, une partie de l'opération "load" (du point de vue du processus) exécute l'initialisation de la DLL: cela est fait séparément dans chaque processus avec des copies distinctes des zones de données qui sont privées à chaque processus.

Questions connexes