Fonctionnement de la pile d'exécution

Messages postés
246
Date d'inscription
dimanche 2 juin 2002
Statut
Membre
Dernière intervention
11 septembre 2016
- - Dernière réponse : BruNews
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
- 5 mars 2013 à 00:30
Bonjour,

J'essaie de comprendre le fonctionnement de la pile d'exécution pour les exécutables sous Linux (exécutables au format ELF).
Il y a un certains nombres de points que je ne comprend pas. Pourriez-vous m'aider sur ces points ?

1. Avant d'entrer dans une fonction, on met la valeur du pointeur EIP sur la pile. C'est logique, car nous dépilerons cette valeur en sortant de la fonction afin de reprendre le cours d'exécution normal dans la fonction appelante. Mais pourquoi met-on les variables locales et les paramètres des fonctions dans la pile d’exécution ? Quel est l'intérêt de faire ça ?

2. Si j'exécute deux programmes dans deux consoles différentes, je vois que les deux programmes utilisent les même adresses mémoires pour la pile. Par exemple, le bas de la pile est à l'adresse 0xbfffffff. J'en déduis donc qu'il s'agit de fausses adresses fournies par le système puisque mes deux programmes ont en réalité deux piles différentes. Est-il possible de connaître la vraie adresse en mémoire ?

3. Je vois que le tas monte à partir de l'adresse 0x804a008. La pile descend en démarrant à l'adresse 0xbfffffff. Lorsque les deux se rencontrent, le programme crash à priori. Si je fais la différence entre ces deux adresses, je trouve 3086704631 soit environs 3Go. Donc au mieux, mon programme peut allouer 3Go de mémoire. Qui choisi cette valeur ? Et si je voulais avoir + de 3Go dans mon tas, je devrais faire comment ?

N'hésitez pas à commenter, même si vous ne savez pas les réponses à tout. Tout commentaire est le bienvenu.

Cordialement,
Afficher la suite 

1 réponse

Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
0
Merci
Salut,

je bosse sur Windows mais il y aura surement de fortes ressemblances, les 2 systemes basculent en mode protégé au load.

Mode protégé => Adresse virtuelle, garantie de stabilite du systeme.

On met les variables (registres) sur la pile avant appel fonction pour retrouver ces registres comme avant appel. Une fonction a besoin de registres pour faire son job.

On pousse les params sur la pile, c'est une question de convention d'appel, la fonction doit savoir où lire ses params. Si mode x64, on en passe la plus groose partie direct dans les registres, autre convention.

"fausses adresses", en quelque sorte, c'est adresse virtuelle. L'OS enregistre un offset associé à ton processus pour faire le map entre virtuelle et réelle. Le prog USER n'a rien à savoir de cela, il bosse avec des adresses qui sont toutes virtuelles comme si c'était des réelles, l'OS gère par offset et tout va bon.

3 Go, c'est maxi pour un prog 32 car OS mappe une partie system dans chaque processus, on peut donc considérer que les 4 Go sont atteints.
Je rappelle que 32bits 4 Go sizeof(int), il est clair qu'en mode 32 bits on ne peut gérer d'adresse supérieure, voila pourquoi il était plus que temps que le 32 bits laisse la place au 64 bits.

ciao...
Commenter la réponse de BruNews