OVH Cloud OVH Cloud

Utilité DLL C++

100 réponses
Avatar
Korchkidu
Bonjour,

A partir de quand estimez vous que faire une DLL plutot qu'un LIB soit
int=E9ressant. En effet, utiliser des DLL fait des programmes plus
petits (entre autres) mais induit d'enormes contraintes au niveau de la
programmation. Donc d'apres moi, faire une DLL pour une bibliotheque de
petite taille n'est pas forcement une bonne idee...

Merci pour vos commentaires.
K=2E

10 réponses

6 7 8 9 10
Avatar
kanze
Alain Gaillard wrote:
Jean-Marc Bourguet a écrit :



> Cela fait longtemps que j'ai fait de l'assembleur avec la
> syntaxe MS -- mais il me semble que



> mov eax,dword ptr [i (10017168h)]



> c'est de l'adressage absolu:



Je reviens sur la question. Donc oui ici.



> donc le code sait qu'i est à l'adresse 10017168h et pas
> ailleurs.



Mais non là.



Mais si. À l'intérieur de l'espace d'adressage du processus,
c'est bien à l'adresse 0x10017168.

Je pense que le mode d'adressage virtuel des Intel 32 bits
t'échappe et c'est ce mode qu'utilise Windows.



C'est aussi le mode qu'utilise tous les Unix depuis la version
de Berkley, 1978, environ. Je suis sûr que Jean-Marc le connaît
pertinemment bien.

[Déscription simplifiée de la mémoire virtuelle
supprimée...]

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Avatar
Jean-Marc Bourguet
Alain Gaillard writes:

Jean-Marc Bourguet a écrit :


Je crains que tu ne comprennes pas la question.



Ah ...

Cela fait longtemps que j'ai fait de l'assembleur avec la
syntaxe MS -- mais il me semble que mov eax,dword ptr [i (10017168h)]
c'est de l'adressage absolu:



En effet.

donc le code sait qu'i est à
l'adresse 10017168h et pas ailleurs.



NOOONNN!



Mais non. Je n'arrête pas de le répêter, cette adresse de
10017198h est *virtuelle* et *PAS* physique.



On s'en doute qu'on cause d'adresse virtuelle, les adresses
physiques, c'est l'affaire des OS depuis les années 70.

Il faut donc que i ait
la même adresse dans tous les process si le code est
réellement partagé.



Et bien non.

Comment Windows fait pour s'assurer que
toutes les DLL sont bien mappées pour où elles ont été
compilées?



Mais justement pas.
Si tu as lu la discussion depuis le début, tu as vu que le fichier
exécutable PE comporte de sections qui servent au
chargement.



Ca n'a donc pas changé depuis Windows 3.1 (le dernier que
j'ai programmé).

Lors de ce chargement l'OS lit ces sections et fait une
éditien de liens dynamique (au sens Windows du terme, pas
au sens compilateur du terme). Autrement dit il charge en
mémoire physique où il veut et il s'arrange pour que la
mémoire virtuelle pointe au bon endroi phyqoue pour chaque
processus.



Nous sommes d'accord. Le problème c'est les adresses
virtuelles: comment fait Windows si deux DLL veulent
utiliser les mêmes adresses virtuelles. Modifier DS et CS
est une possibilité, faire de la relocation -- et donc ne
plus pouvoir partager -- une autre. Avec un espace virtuel
plus grand on pourrait mapper chaque DLL à une adresse
unique et partagée entre process (et faire une relocation
une fois au chargement, mais partager après), mais avec 32
bits, on manquerait de place.

Les segments sont toujours sur un x86



Ils y sont toujours en effet, mais windows 32 bits
n'utilise pas ce mode d'adressage.



Il n'y a pas de mode 32 bits qui n'utilise pas les segments.
Je suppose donc que tu veux dire que Windows place les
segments de manière à ce qu'ils se recouvrent et occupent
tout l'espace virtuel, ce que font à peu près tous les OS 32
bits sur x86 (j'ai entendu parlé d'exceptions dans les OS
temps réels, mais je suis incapable d'en cité une).

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Avatar
Vincent Burel
"Alain Gaillard" wrote in message
news:45058350$0$25920$
Vincent Burel a écrit :


> Vous allez voir qu'on va revenir à ma réflexion de départ : "Pour deux
> process utilisant la meme DLL, je ne
> suis pas certain que cette DLL ne soit pas physiquement chargé 2


fois..."
> :-)

Ben on l'a dit dès le départ non ? Elle n'est pas chargée physiquemenbt
deux fois en ce qui concerne le code.



Et bien c'est pas évidents, puisqu'une DLL peut etre relogée différemment
selon le process dans lequel elle est linké... suivant ce qu'implique ce
relogeage, l'image de la DLL peut sensiblement changer et devenir spécique à
une application... auquel cas elle ne saurait reservir dans un autre
process...

VB
Avatar
kanze
Alain Gaillard wrote:
kanze a écrit :



> Tu crois ? Si l'adresse, c'est bien 0x10017168, elle n'est
> pas dans les 2Go supérieur, mais dans le deuxième banc de
> 1Go, entre 1Go et 2Go.



Heu.. hem je me suis trompé d'un zéro.



Ce n'est pas grave. Le problème en est ailleurs.

> J'avoue que j'ai assez de mal à l'expliquer clairement. Le
> problème, si tu veux, c'est ce qui se passe si je démarre
> processus A, qui utilise cette DLL, et qu'on mappe bien la
> variable à l'adresse 0x100217C0. Qu'est-ce qui se passe ensuite
> si un processus B démande la même DLL, et qu'il a déjà quelque
> chose mappée à cette adresse (toujours, dans son espace
> d'adressage logique à lui).



Ce 0x100217C0 étant une adresse virtuelle, pourquoi l'adresse
physique à laquelle elle correspond devrait elle être la me^me
pour chaque proc.



Mais qui parle donc des adresses physiques. C'est évident que
les adresses physiques sont différentes pour chaque processus
(et qu'elles évolvent pendant l'exécution du processus, au fur
et à mesure que des pages passent sur disque et reviennent).

Elle peut l'être ou pas. Si l'adresse pointe sur du code alors
ce sera la même adresse physique et alors le code est partagé.
Si l'adresse pointe sur des données, alors l'adresse physique
correspondante est différente pour chaque processus qui a sa
copie en mémoire physique des données.



On répète. Le problème n'a rien à voir avec les adresses
physiques en mémoire réele. C'est un problème de l'adresse dans
l'espace d'adressage du processus. Une fois que la variable
positionnée bien à 0x100217C0, comment est-ce que tu peux
garantir que cette adresse ne sert pas déjà dans d'autres
processus qui veulent utiliser la DLL ?

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Avatar
Vincent Burel
"Arnold McDonald (AMcD)" wrote in message
news:450583c8$0$287$
Vincent Burel wrote:

> ha mais les DLL sont completement relogés dynamiquement au
> chargement... faut demander à AMCD, mais le système est obligé de de
> le faire...

Nan ! J'aime pas le ton de certains intervenants de ce fil, je fais grève.



t'es syndiqué toi ? :-)
Avatar
Alain Gaillard
kanze a écrit :


Et alors. On le sait. (Je le sais très bien, et je suis sûr que
Jean-Marc le sait aussi.)



Oui, mais chaque processus accédera bien à la même adresse à
l'intérieur de son espace d'adressage.




Mais enfin, pourquoi voulez vous qu'une même adresse virtuelle pour tout
le monde corresponde à la même adresse physique pour tout le monde ? Ca
dépend de la table de descripteur propre à chaque processus et que le
système constitue losqu'il lance un exe.

--
Alain
Avatar
Alain Gaillard
Vincent Burel a écrit :

relogeage, l'image de la DLL peut sensiblement changer et devenir spécique à
une application... auquel cas elle ne saurait reservir dans un autre
process...



C'est vrai que cette possibilité ne semble pas exclue non plus :)
--
Alain
Avatar
kanze
Arnold McDonald (AMcD) wrote:
Alain Gaillard wrote:



> Tiens au fait toi qui parle volontiers "d'engueulo, de franche
> camaraderie, de docte". Que dirais tu toi même de ta propre
> intervention là ? LOL



Je connais la plupart des intervenants ici depuis des années.
Eux aussi...



Attention ! Il y a un cross-posting. Je suis un reguilier de
fr.comp.lang.c++, où je lis ces postings, et je ne t'y aie
jamais vu.

C'est d'ailleurs sans doute pour ça que Alain et moi ont tant de
problèmes à se faire comprendre. S'il avait fréquenté
fr.comp.lang.c++ avant, je suis assez sûr qu'il se serait rendu
compte que ce n'était pas nécessaire à m'expliquer la mémoire
virtuelle, et qu'il devait avoir quelque chose d'autre derrière
ma question. (Et que n'étant pas francophone d'origine, j'ai
parfois du mal à m'exprimer bien comme il faut.)

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Avatar
Jean-Marc Bourguet
Alain Gaillard writes:

Jean-Marc Bourguet a écrit :


Cela fait longtemps que j'ai fait de l'assembleur avec la
syntaxe MS -- mais il me semble que mov eax,dword ptr [i (10017168h)]
c'est de l'adressage absolu:



Je reviens sur la question. Donc oui ici.

donc le code sait qu'i est à
l'adresse 10017168h et pas ailleurs.



Mais non là.
Je pense que le mode d'adressage virtuel des Intel 32 bits
t'échappe



Je crois que tu me sous-estimes. J'ai fait pas mal
d'assembleur x86 dont un DOS extender, qui utilisait la
mémoire virtuelle pour imiter la mémoire paginée (donc je
partais du DOS, j'activais le mode protégé, j'activais la
pagination et je retournais sous DOS en mode virtuel, et
j'avais implémenté les interuptions LM? pour modifier le
mapping), je doute que ça ait fonctionné si je n'avais pas
compris les différents mode de fonctionnement de la machine.
A ma connaissance il n'y a pas eu de changement depuis cette
époque si on excepte le mode 64 bits.

Voilà pourquoi une adresse virtuelle donnée va pointer
vers des adresses physiques différentes selon le
processus. Quand Windows charge un exe il construit cette
table (table qui n'est pas la table de saut en mémoire
haute dont j'ai parlé avant, ça tombe sous le sens), donc
à priori différentes pour chaque processus, même si elle
peuvent avoir des points communs, comme le code partagé
des dll.



Bon, on va faire un exemple simple:
J'ai deux DLL: LIB1 et LIB2 et trois exécutables A, B, et C.
A utilise LIB1. B utilise LIB2. C utilise LIB1 et LIB2.

Je lance A, Windows mappe LIB1 à l'adresse virtuelle
$80000000 de A.

Je lance B, Windows mappe LIB2 à l'adresse virtuelle
$80000000 de B.

Je lance C, Windows ne peut pas mapper et LIB1 et LIB2 à
l'adresse virtuelle $80000000 de C, donc comme il y a des
références absolues il doit modifier le code et ne plus le
partager.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Avatar
Alain Gaillard
kanze a écrit :


On répète. Le problème n'a rien à voir avec les adresses
physiques en mémoire réele. C'est un problème de l'adresse dans
l'espace d'adressage du processus. Une fois que la variable
positionnée bien à 0x100217C0, comment est-ce que tu peux
garantir que cette adresse ne sert pas déjà dans d'autres
processus qui veulent utiliser la DLL ?



Mais en quoi est-ce un problème ?

--
Alain
6 7 8 9 10