(Je pense qu'il y a de fortes chances que cette question soit dupliquée ou qu'elle ait déjà reçu une réponse, mais la recherche de la réponse est difficile en raison de l'interférence de l'"allocation de la pile" et des termes connexes).
J'ai travaillé sur un compilateur jouet pour un langage de script. Pour pouvoir interrompre l'exécution d'un script en cours et revenir au programme hôte, il possède sa propre pile : un simple bloc de mémoire avec une variable "pointeur de pile" qui s'incrémente en utilisant les opérations normales du code C pour ce genre de choses et ainsi de suite. Rien d'intéressant pour l'instant.
Pour l'instant, je compile en C. Mais je souhaite étudier la possibilité de compiler également en code machine - tout en conservant la pile secondaire et la possibilité de revenir au programme hôte à des points de contrôle prédéfinis.
Je suppose que l'utilisation des registres de pile conventionnels dans mon propre code ne devrait pas poser de problème, je suppose que ce qu'il advient des registres est mon affaire tant que tout est restauré quand c'est fait (corrigez-moi si je me trompe sur ce point). Mais ... si je veux que le code script fasse appel à un autre code de bibliothèque, est-il sûr de laisser le programme utiliser cette "pile virtuelle", ou est-il essentiel de lui rendre la pile d'origine à cette fin ?
Réponses comme celui-ci y celui-ci indiquent que la pile n'est pas un bloc de mémoire conventionnel, mais qu'elle repose sur un comportement spécial, propre au système, en ce qui concerne les défauts de page et autres.
Ainsi :
- Est-il possible de déplacer les pointeurs de la pile dans une autre zone de la mémoire ? La mémoire de pile n'est pas "spéciale" ? Je pense que les bibliothèques de threading doivent faire quelque chose comme ça, puisqu'elles créent plus de piles...
- En supposant que toute zone de mémoire puisse être manipulée en toute sécurité à l'aide des registres et des instructions de la pile, je ne vois aucune raison pour laquelle il serait problématique d'appeler n'importe quelle fonction avec une profondeur d'appel connue (c'est-à-dire sans récursivité, sans pointeur de fonction), tant que cette quantité est disponible sur la pile virtuelle. N'est-ce pas ?
- Le débordement de pile est de toute façon un problème dans le code normal, mais un débordement dans un tel système aurait-il des conséquences plus désastreuses ?
Ce n'est évidemment pas nécessaire, puisque le simple fait de renvoyer les pointeurs vers la vraie pile serait parfaitement utilisable, ou d'ailleurs de ne pas en abuser et de se contenter de moins de registres, et je ne devrais probablement pas essayer de le faire du tout (notamment parce que je ne suis manifestement pas à la hauteur). Mais je suis toujours curieux de savoir ce qu'il en est. Je veux savoir comment ce genre de choses fonctionne.
EDITAR: Désolé bien sûr, j'aurais dû dire. Je travaille sur x86 (32 bits pour ma propre machine), Windows et Ubuntu. Rien d'exotique.