Comment est un programme (E.G. C ou C ++) organisé dans la mémoire de l'ordinateur? Je connais un peu un peu sur les segments, les variables, etc., mais au fond, je n'ai pas de solide compréhension de la structure Étant donné que la structure en mémoire peut différer, assumons une application de console C ++ sur Windows. P>
Certains pointeurs à ce que je suis après précision: p>
Les liens vers des matériaux de type tutoriel et tels sont les bienvenus, mais s'il vous plaît, aucun matériau de style de référence en supposant la connaissance de l'assembleur, etc. P>
6 Réponses :
Serait-ce ce que vous cherchez:
http://en.wikipedia.org/ wiki / Portable_Executable p>
le format de fichier PE est la structure de fichier binaire des fichiers binaires Windows (.exe, .dll, etc.). En fait, ils sont mis en correspondance dans la mémoire comme ça. Plus de détails sont décrits ici avec une explication comment vous vous pouvez jeter un oeil à la représentation binaire de DLLs chargé en mémoire: p>
http://msdn.microsoft.com/en-us/magazine/cc301805.aspx p>
Edit: p> maintenant, je comprends que vous voulez apprendre le code source se rapporte au code binaire dans le fichier PE. C'est un champ énorme. P>
D'abord, vous devez comprendre les notions de base sur l'architecture informatique qui impliqueront l'apprentissage des bases générales du code assembleur. Tous « Introduction à l'architecture informatique » cours de niveau collégial fera. La littérature comprend par exemple « John L. Hennessy et David A. Patterson Architecture des ordinateurs. Une approche quantitative ». Ou « Andrew Tanenbaum, Organisation informatique structuré » p>
Après avoir lu ceci, vous devez comprendre ce qu'est un pile est et sa différence le tas. Qu'est-ce que la pile pointeur et le pointeur de base et ce que l'adresse de retour est, combien de registres il y a etc p>
Une fois que vous avez compris cela, il est relativement facile de mettre les morceaux ensemble. p>
A l'objet de C contient du code et des données, à savoir, les variables membres. Une classe p>
SimpleClass c1; c1.m_nInteger = 1; c1.m_fDouble = 5.0; c1.SomeFunction();
Merci. Bonnes informations générales sur la structure du module. Cependant, j'espère que vous devez plus d'informations sur la façon dont tout mappe au code du programme lui-même.
OK compris. Vous souhaitez connaître la relation entre le code source et ce qui se passe réellement sur la machine.
@Sebastian: Type de, mais avec la structure. Par exemple. Je suis plus après la façon dont la pile d'une fonction regarde en mémoire plutôt que les instructions de montage du code de fonction.
@Sebastian: Après vos mises à jour, cela est devenu une bonne et une riche réponse, merci!
Ce n'est peut-être pas les informations les plus précises, mais MS app apple fournit des exemples de chapitres du livre Inside Microsoft® Windows® 2000, troisième édition , contenant des informations sur les processus et leur création avec des images de certaines structures de données importantes. P>
J'ai aussi trébuché sur Ce fichier PDF résume certaines des informations ci-dessus dans un graphique agréable. P>
Mais toutes les informations fournies sont davantage du point de vue du système d'exploitation et non trop détaillées sur les aspects de l'application. P>
En réalité - vous ne serez pas loin dans cette affaire avec au moins un peu de connaissances en assembleur. Je serais recoomrer un site d'inversion (tutoriel), par exemple Openrce.org. P>
sur openrce.org le pouvez-vous donner exactement quel tutoriel vous parlez de
Quelle énorme question! p>
Tout d'abord, vous voulez en savoir plus sur Mémoire virtuelle . Sans cela, rien d'autre n'a de sens. En bref, les pointeurs C / C ++ ne sont pas des adresses de mémoire physique. Les pointeurs sont des adresses virtuelles. Il existe une fonction spéciale de la CPU (l'unité de gestion de la mémoire MMU) qui les mappe de manière transparente à la mémoire physique. Seul le système d'exploitation est autorisé à configurer le MMU. P>
Ceci fournit une sécurité (il n'y a pas de valeur de pointeur C / C ++, vous pouvez éventuellement faire de ces points dans l'espace d'adresses virtuel d'un autre processus, à moins que ce processus partageait intentionnellement la mémoire avec vous) et permet aux os de faire des choses vraiment magiques que nous Prendre pour acquis (comme échanger de manière transparente une partie de la mémoire d'un processus sur le disque, puis le charge de manière transparente lorsque le processus tente de l'utiliser). P>
Espace d'adresse d'un processus (A.K.A. Espace d'adresse virtuelle, A.K.A. Mémoire adressable) Contient: P>
Une énorme région de mémoire réservée au noyau Windows, que le processus n'est pas autorisé à toucher; p> li>
Régions de la mémoire virtuelle "non accessible", c'est-à-dire que rien n'est chargé là-bas, il n'y a pas de mémoire physique attribuée à ces adresses, et le processus s'écrasera s'il tente d'y accéder; p> li >
parties Les différents modules (fichiers EXE et DLL) chargés (chacun d'entre eux contient chacun des codes de machine, des constantes à cordes et d'autres données); et p> li>
Quelle autre mémoire est allouée à partir du système. P> LI> ul>
Maintenant généralement un processus permet la bibliothèque d'exécution C ou les bibliothèques Win32 font la majeure partie de la gestion de la mémoire de niveau super bas, qui comprend la configuration: P>
une pile (pour chaque fil), où les variables locales et les arguments de fonction et les valeurs de retour sont stockées; et p> li>
Un tas, où la mémoire est allouée si le processus appelle Pour plus d'informations sur la pile est structuré, love à propos de Conventions d'appel . Pour plus d'informations sur la structure de la structure du tas, lisez à propos de MALLOC Mises en œuvre . En général, la pile est vraiment une pile, une dernière structure de données en première sortie, contenant des arguments, des variables locales et le résultat temporaire occasionnel, et pas beaucoup plus. Comme il est facile pour un programme d'écrire droit au-delà de la fin de la pile (le bogue C / C ++ courant après laquelle ce site est nommé), les bibliothèques système assurent généralement qu'il existe une page non mappée adjacente à la pile. Cela rend le processus crash instantanément lorsqu'un tel bogue se produit, il est donc beaucoup plus facile de déboguer (et le processus est tué avant de pouvoir faire plus de dégâts). P>
Le tas n'est pas vraiment un tas dans le sens de la structure de données. C'est une structure de données maintenue par la bibliothèque CRT ou WIN32 qui prend des pages de mémoire à partir du système d'exploitation et les parcelles à chaque fois que le processus demande de petites pièces de mémoire via Un processus peut également demander des pages directement à partir du système d'exploitation, à l'aide d'une API comme Il y en a plus, mais je ferais mieux d'arrêter! P> malloc code> ou fait
neuf x code>. p> li>
ul>
Malloc code> et amis. (Notez que le système d'exploitation n'est pas la micromanage que cela; un processus peut dans une large mesure gérer son espace d'adresses cependant qu'il souhaite, si cela n'aime pas la manière dont le CRT le fait.) P>
virtualalloc code>
ou mapviewoffile code> . p>
Pour comprendre la structure de cadre de pile, vous pouvez faire référence à http://fr.wikipedia.org/wiki/call_stack P>
Il vous donne des informations sur la structure de la pile d'appels, la manière dont les locaux, les globaux, l'adresse de retour est stocké sur la pile d'appels p>
Une autre bonne illustration http://www.cs.uleth.ca/~holzmann/ C / system / memorylayout.pdf p>
Cela dépend cela ne dépend pas des compilateurs spécifiquement et l'EXE est un format standard qui pourrait avoir ses propres segments. De plus, il pourrait également être spécifique au système d'exploitation, comme sur certains OS, il n'y a pas d'alignement de mots, alors que sur certains OS, toutes les variables sont alignées sur une limite de 4 octets.
@Priyank: OS dépend en effet, c'est pourquoi j'ai proposé de Windows. Je ne crois pas que ce soit un compilateur spécifique cependant. Une étape de liaison pour créer un programme Windows doit toujours produire la même structure (c'est-à-dire l'EXE) ou l'architecture hôte ne saura pas quoi faire avec elle.