kanze a écrit :
> Reste à savoir comment il s'arrange pour rétrouver ces
> données sans imposer qu'il soit liées à la même adresse dans
> dans tous les processus.. Comment fait VC++ pour résoudre ce
> problème.
VC++ ne fait rien. C'est le système qui le fait.
Dans l'exécutable qui est un format baptisé PE et documenté par Kro $oft.
Il y des des sections décrivant les dépendances. Soit telles dlls et
telles fonctions. L'éditeur de liens (disosn VC globalement) crée ces
sectiosn et son rôle s'arrête là
C'est ensuite le système qui fait tout. Quand un exécutable est charg é,
ces sections sont analysées. Si une dll requise est déjà chargée, comme
c'est toujours le cas de kernel32 par exemple, la table de sauts est
construite. Sinon la dll est chargée puis la table de saut est
construite. Cette dernière dll ne sera pas chargée si une deuxième
application s'en sert. Seule une table de saut est construite dans les 2
Go supérieurs de l'appli.
Tout ce mécanisme je le connais très très bien. A une époque
j'avais écrit un outil pour modifier les table de saut et
garder une trace des appel à certaines fonctions des dll
systèmes dans un log. Et puis tout ce que je dis est documenté
par Kro$oft. Chacun peut vérifer.
kanze a écrit :
> Reste à savoir comment il s'arrange pour rétrouver ces
> données sans imposer qu'il soit liées à la même adresse dans
> dans tous les processus.. Comment fait VC++ pour résoudre ce
> problème.
VC++ ne fait rien. C'est le système qui le fait.
Dans l'exécutable qui est un format baptisé PE et documenté par Kro $oft.
Il y des des sections décrivant les dépendances. Soit telles dlls et
telles fonctions. L'éditeur de liens (disosn VC globalement) crée ces
sectiosn et son rôle s'arrête là
C'est ensuite le système qui fait tout. Quand un exécutable est charg é,
ces sections sont analysées. Si une dll requise est déjà chargée, comme
c'est toujours le cas de kernel32 par exemple, la table de sauts est
construite. Sinon la dll est chargée puis la table de saut est
construite. Cette dernière dll ne sera pas chargée si une deuxième
application s'en sert. Seule une table de saut est construite dans les 2
Go supérieurs de l'appli.
Tout ce mécanisme je le connais très très bien. A une époque
j'avais écrit un outil pour modifier les table de saut et
garder une trace des appel à certaines fonctions des dll
systèmes dans un log. Et puis tout ce que je dis est documenté
par Kro$oft. Chacun peut vérifer.
kanze a écrit :
> Reste à savoir comment il s'arrange pour rétrouver ces
> données sans imposer qu'il soit liées à la même adresse dans
> dans tous les processus.. Comment fait VC++ pour résoudre ce
> problème.
VC++ ne fait rien. C'est le système qui le fait.
Dans l'exécutable qui est un format baptisé PE et documenté par Kro $oft.
Il y des des sections décrivant les dépendances. Soit telles dlls et
telles fonctions. L'éditeur de liens (disosn VC globalement) crée ces
sectiosn et son rôle s'arrête là
C'est ensuite le système qui fait tout. Quand un exécutable est charg é,
ces sections sont analysées. Si une dll requise est déjà chargée, comme
c'est toujours le cas de kernel32 par exemple, la table de sauts est
construite. Sinon la dll est chargée puis la table de saut est
construite. Cette dernière dll ne sera pas chargée si une deuxième
application s'en sert. Seule une table de saut est construite dans les 2
Go supérieurs de l'appli.
Tout ce mécanisme je le connais très très bien. A une époque
j'avais écrit un outil pour modifier les table de saut et
garder une trace des appel à certaines fonctions des dll
systèmes dans un log. Et puis tout ce que je dis est documenté
par Kro$oft. Chacun peut vérifer.
kanze a écrit :
> J'aurais imaginé que ces DLL ne contient que le mapping de
> l'API C aux véritables appels systèmes (qui n'était pas des
> call dans le temps, parce qu'il fallait passer en mode
> superuser, masquer les interruptions, etc.).
Le mécanisme de la table de saut est complexe. Il y a
effectivment un basculement en mode superuser lors des appels
systèmes. II y a table de saut, mais l'adresse où on saute est
telle que le basculement se produit. C'est un peu compliéqué à
expliquer, mais encore une fois c'ets documentée chez kro$oft
>>Le mécanisme de gestion de mémoire virtuelle est assez
>>particulier. En quelques mots disons que toute application
>>se voit attribuer les 4 Go adressables, mais toute cette
>>zone est une zone de mémoire virtuelle, pas physique
>>évidemment. Les 2 go de mémoire basse sont à son usage.
>>Dans les 2 Go de mémoire haute sont installée les tables de
>>saut vers les dll utilisées par l'application, comme par
>>exemple kernel32.dll, user32.dll, madll.dll. Je parle bien
>>ici de mémoire virtuelle.
> Il lui faut 2 Go pour ça ?
Non je n'ai pas dit ça.
Il lui faut les octets *physiques* qu'il lui faut.
Mais chaque sous Windows chaque appli se voit octroyer tout l'espace
d'adressage systèmatiquement mais virtuellement. Sois 4 Go en 32 bits.
Et les tables de sauts sont installées dans les 2 Go supérieurs,
justement parce qu'être là participe au mécanisme de basculement
mentionné plus haut.
> Pour les sauts dans le code, je comprends bien comment ça
> marche, bien que j'ai du mal à croire que tout le monde soit
> d'accord pour le prix de l'indirection supplémentaire.
Microsoft ne te demand pas d'être d'accord. c'ets comme ça et
c'est tout.
> Je ne trouve pas d'option pareil dans VC++
Mon bon James, tu manques d'expérience dans le domaine ;) Il
n'y a pas d'option dans VC++ pour la bonne raison que ce n'est
pas son rôle. Lis mon autre poste dans cette discussion.
kanze a écrit :
> J'aurais imaginé que ces DLL ne contient que le mapping de
> l'API C aux véritables appels systèmes (qui n'était pas des
> call dans le temps, parce qu'il fallait passer en mode
> superuser, masquer les interruptions, etc.).
Le mécanisme de la table de saut est complexe. Il y a
effectivment un basculement en mode superuser lors des appels
systèmes. II y a table de saut, mais l'adresse où on saute est
telle que le basculement se produit. C'est un peu compliéqué à
expliquer, mais encore une fois c'ets documentée chez kro$oft
>>Le mécanisme de gestion de mémoire virtuelle est assez
>>particulier. En quelques mots disons que toute application
>>se voit attribuer les 4 Go adressables, mais toute cette
>>zone est une zone de mémoire virtuelle, pas physique
>>évidemment. Les 2 go de mémoire basse sont à son usage.
>>Dans les 2 Go de mémoire haute sont installée les tables de
>>saut vers les dll utilisées par l'application, comme par
>>exemple kernel32.dll, user32.dll, madll.dll. Je parle bien
>>ici de mémoire virtuelle.
> Il lui faut 2 Go pour ça ?
Non je n'ai pas dit ça.
Il lui faut les octets *physiques* qu'il lui faut.
Mais chaque sous Windows chaque appli se voit octroyer tout l'espace
d'adressage systèmatiquement mais virtuellement. Sois 4 Go en 32 bits.
Et les tables de sauts sont installées dans les 2 Go supérieurs,
justement parce qu'être là participe au mécanisme de basculement
mentionné plus haut.
> Pour les sauts dans le code, je comprends bien comment ça
> marche, bien que j'ai du mal à croire que tout le monde soit
> d'accord pour le prix de l'indirection supplémentaire.
Microsoft ne te demand pas d'être d'accord. c'ets comme ça et
c'est tout.
> Je ne trouve pas d'option pareil dans VC++
Mon bon James, tu manques d'expérience dans le domaine ;) Il
n'y a pas d'option dans VC++ pour la bonne raison que ce n'est
pas son rôle. Lis mon autre poste dans cette discussion.
kanze a écrit :
> J'aurais imaginé que ces DLL ne contient que le mapping de
> l'API C aux véritables appels systèmes (qui n'était pas des
> call dans le temps, parce qu'il fallait passer en mode
> superuser, masquer les interruptions, etc.).
Le mécanisme de la table de saut est complexe. Il y a
effectivment un basculement en mode superuser lors des appels
systèmes. II y a table de saut, mais l'adresse où on saute est
telle que le basculement se produit. C'est un peu compliéqué à
expliquer, mais encore une fois c'ets documentée chez kro$oft
>>Le mécanisme de gestion de mémoire virtuelle est assez
>>particulier. En quelques mots disons que toute application
>>se voit attribuer les 4 Go adressables, mais toute cette
>>zone est une zone de mémoire virtuelle, pas physique
>>évidemment. Les 2 go de mémoire basse sont à son usage.
>>Dans les 2 Go de mémoire haute sont installée les tables de
>>saut vers les dll utilisées par l'application, comme par
>>exemple kernel32.dll, user32.dll, madll.dll. Je parle bien
>>ici de mémoire virtuelle.
> Il lui faut 2 Go pour ça ?
Non je n'ai pas dit ça.
Il lui faut les octets *physiques* qu'il lui faut.
Mais chaque sous Windows chaque appli se voit octroyer tout l'espace
d'adressage systèmatiquement mais virtuellement. Sois 4 Go en 32 bits.
Et les tables de sauts sont installées dans les 2 Go supérieurs,
justement parce qu'être là participe au mécanisme de basculement
mentionné plus haut.
> Pour les sauts dans le code, je comprends bien comment ça
> marche, bien que j'ai du mal à croire que tout le monde soit
> d'accord pour le prix de l'indirection supplémentaire.
Microsoft ne te demand pas d'être d'accord. c'ets comme ça et
c'est tout.
> Je ne trouve pas d'option pareil dans VC++
Mon bon James, tu manques d'expérience dans le domaine ;) Il
n'y a pas d'option dans VC++ pour la bonne raison que ce n'est
pas son rôle. Lis mon autre poste dans cette discussion.
L'idée qu'un processus utilisateur ne
peut se servir de 2 Go, à la place de 4, sur un processeur
moderne 32 bits avec mémoire virtuelle, me faisait en fait
penser au commentaire « 564 [ou quelque chose comme ça] mémoire
serait assez grande pour n'importe qui », attribué à Bill Gates
(faussement, je crois). J'ai déjà vu des applications Solaris 32
bits qui se servait de plus.
L'idée qu'un processus utilisateur ne
peut se servir de 2 Go, à la place de 4, sur un processeur
moderne 32 bits avec mémoire virtuelle, me faisait en fait
penser au commentaire « 564 [ou quelque chose comme ça] mémoire
serait assez grande pour n'importe qui », attribué à Bill Gates
(faussement, je crois). J'ai déjà vu des applications Solaris 32
bits qui se servait de plus.
L'idée qu'un processus utilisateur ne
peut se servir de 2 Go, à la place de 4, sur un processeur
moderne 32 bits avec mémoire virtuelle, me faisait en fait
penser au commentaire « 564 [ou quelque chose comme ça] mémoire
serait assez grande pour n'importe qui », attribué à Bill Gates
(faussement, je crois). J'ai déjà vu des applications Solaris 32
bits qui se servait de plus.
kanze a écrit :
> Reste à savoir comment il s'arrange pour rétrouver ces
> données sans imposer qu'il soit liées à la même adresse dans
> dans tous les processus.. Comment fait VC++ pour résoudre ce
> problème.
VC++ ne fait rien. C'est le système qui le fait.
Dans l'exécutable qui est un format baptisé PE et documenté par Kro$oft.
Il y des des sections décrivant les dépendances. Soit telles dlls et
telles fonctions. L'éditeur de liens (disosn VC globalement) crée ces
sectiosn et son rôle s'arrête là
C'est ensuite le système qui fait tout. Quand un exécutable est chargé,
ces sections sont analysées. Si une dll requise est déjà chargée, comme
c'est toujours le cas de kernel32 par exemple, la table de sauts est
construite. Sinon la dll est chargée puis la table de saut est
construite. Cette dernière dll ne sera pas chargée si une deuxième
application s'en sert. Seule une table de saut est construite dans les 2
Go supérieurs de l'appli.
kanze a écrit :
> Reste à savoir comment il s'arrange pour rétrouver ces
> données sans imposer qu'il soit liées à la même adresse dans
> dans tous les processus.. Comment fait VC++ pour résoudre ce
> problème.
VC++ ne fait rien. C'est le système qui le fait.
Dans l'exécutable qui est un format baptisé PE et documenté par Kro$oft.
Il y des des sections décrivant les dépendances. Soit telles dlls et
telles fonctions. L'éditeur de liens (disosn VC globalement) crée ces
sectiosn et son rôle s'arrête là
C'est ensuite le système qui fait tout. Quand un exécutable est chargé,
ces sections sont analysées. Si une dll requise est déjà chargée, comme
c'est toujours le cas de kernel32 par exemple, la table de sauts est
construite. Sinon la dll est chargée puis la table de saut est
construite. Cette dernière dll ne sera pas chargée si une deuxième
application s'en sert. Seule une table de saut est construite dans les 2
Go supérieurs de l'appli.
kanze a écrit :
> Reste à savoir comment il s'arrange pour rétrouver ces
> données sans imposer qu'il soit liées à la même adresse dans
> dans tous les processus.. Comment fait VC++ pour résoudre ce
> problème.
VC++ ne fait rien. C'est le système qui le fait.
Dans l'exécutable qui est un format baptisé PE et documenté par Kro$oft.
Il y des des sections décrivant les dépendances. Soit telles dlls et
telles fonctions. L'éditeur de liens (disosn VC globalement) crée ces
sectiosn et son rôle s'arrête là
C'est ensuite le système qui fait tout. Quand un exécutable est chargé,
ces sections sont analysées. Si une dll requise est déjà chargée, comme
c'est toujours le cas de kernel32 par exemple, la table de sauts est
construite. Sinon la dll est chargée puis la table de saut est
construite. Cette dernière dll ne sera pas chargée si une deuxième
application s'en sert. Seule une table de saut est construite dans les 2
Go supérieurs de l'appli.
"James Kanze" wrote in message
news:
Alain Gaillard wrote:
> kanze a écrit :
[...]
Le problème n'est pas vraiment pour les fonctions. Je reconnais
bien qu'un niveau d'indirection supplémentaire pourrait faire
l'affaire (et encore, il y a des cas où ça ne doit pas être
évident). Le problème, c'est les données statiques.
Non, parce qu'une DLL (ou un exe) ne gère que des adresse 32
bit (qui sont que des offset en fait), le système lui gère
aussi les segments, et peut faire en sorte qu'un code
s'éxécute avec le bon segment de données (et bien sur le bon
segement de pile etc...).
"James Kanze" <kanze.james@neuf.fr> wrote in message
news:1157885071.765095.141990@m79g2000cwm.googlegroups.com...
Alain Gaillard wrote:
> kanze a écrit :
[...]
Le problème n'est pas vraiment pour les fonctions. Je reconnais
bien qu'un niveau d'indirection supplémentaire pourrait faire
l'affaire (et encore, il y a des cas où ça ne doit pas être
évident). Le problème, c'est les données statiques.
Non, parce qu'une DLL (ou un exe) ne gère que des adresse 32
bit (qui sont que des offset en fait), le système lui gère
aussi les segments, et peut faire en sorte qu'un code
s'éxécute avec le bon segment de données (et bien sur le bon
segement de pile etc...).
"James Kanze" wrote in message
news:
Alain Gaillard wrote:
> kanze a écrit :
[...]
Le problème n'est pas vraiment pour les fonctions. Je reconnais
bien qu'un niveau d'indirection supplémentaire pourrait faire
l'affaire (et encore, il y a des cas où ça ne doit pas être
évident). Le problème, c'est les données statiques.
Non, parce qu'une DLL (ou un exe) ne gère que des adresse 32
bit (qui sont que des offset en fait), le système lui gère
aussi les segments, et peut faire en sorte qu'un code
s'éxécute avec le bon segment de données (et bien sur le bon
segement de pile etc...).
Alain Gaillard a écrit :C'est ensuite le système qui fait tout. Quand un exécutable est
chargé, ces sections sont analysées.
Est-ce que le mécanisme est identique pour les DLL chargées dynamiquement ?
Alain Gaillard a écrit :
C'est ensuite le système qui fait tout. Quand un exécutable est
chargé, ces sections sont analysées.
Est-ce que le mécanisme est identique pour les DLL chargées dynamiquement ?
Alain Gaillard a écrit :C'est ensuite le système qui fait tout. Quand un exécutable est
chargé, ces sections sont analysées.
Est-ce que le mécanisme est identique pour les DLL chargées dynamiquement ?
Je pense que non. Il me semble qu'a ce moment, c'est pendant les appels à
GetProcAddress que le mapping se réalise. Je me trompe peut-être...
Je pense que non. Il me semble qu'a ce moment, c'est pendant les appels à
GetProcAddress que le mapping se réalise. Je me trompe peut-être...
Je pense que non. Il me semble qu'a ce moment, c'est pendant les appels à
GetProcAddress que le mapping se réalise. Je me trompe peut-être...
Alors, comment fait-il si cette fonction fait partie d'une
DLL ? Est-ce qu'il y a une option que je n'ai pas vue ?
Alors, comment fait-il si cette fonction fait partie d'une
DLL ? Est-ce qu'il y a une option que je n'ai pas vue ?
Alors, comment fait-il si cette fonction fait partie d'une
DLL ? Est-ce qu'il y a une option que je n'ai pas vue ?
Mais alors, il faudrait des pointeurs FAR, à 48 bits, ou ?
Mais alors, il faudrait des pointeurs FAR, à 48 bits, ou ?
Mais alors, il faudrait des pointeurs FAR, à 48 bits, ou ?
Je lis en diagonale votre engueulo là,
d'y mettre mon gain de sel. Mais, tout de même, j'y vois écrit quelques
inexactitudes.
Déjà, ce n'est pas le processeur qui possède la mémoire virtuelle ("un
processeur moderne 32 bits avec mémoire virtuelle"),
Ensuite, ça fait quand même quelques années déjà qu'un processus peut avoir
plus de 2Go. En 1999, on lisait déjà dans le MSDN :
Je lis en diagonale votre engueulo là,
d'y mettre mon gain de sel. Mais, tout de même, j'y vois écrit quelques
inexactitudes.
Déjà, ce n'est pas le processeur qui possède la mémoire virtuelle ("un
processeur moderne 32 bits avec mémoire virtuelle"),
Ensuite, ça fait quand même quelques années déjà qu'un processus peut avoir
plus de 2Go. En 1999, on lisait déjà dans le MSDN :
Je lis en diagonale votre engueulo là,
d'y mettre mon gain de sel. Mais, tout de même, j'y vois écrit quelques
inexactitudes.
Déjà, ce n'est pas le processeur qui possède la mémoire virtuelle ("un
processeur moderne 32 bits avec mémoire virtuelle"),
Ensuite, ça fait quand même quelques années déjà qu'un processus peut avoir
plus de 2Go. En 1999, on lisait déjà dans le MSDN :