Pourquoi la pile croît-elle vers le bas?


31

Je suppose qu'il y a une histoire, mais pourquoi la pile se développe-t-elle vers le bas?

Il me semble que les dépassements de tampon seraient beaucoup plus difficiles à exploiter si la pile augmentait ...


3
stackoverflow.com/questions/1677415/… note que la pile peut croître dans un sens ou dans l'autre.
JB King

6
Il y a une question comme celle-ci: stackoverflow.com/questions/2035568/… . En fait, il y a une bien meilleure question et réponse ici: stackoverflow.com/questions/664744/…
Karlson

La question liée ne couvre pas tout à fait le problème de dépassement de tampon.
deadalnix

1
parce que le tas croît vers le haut.
tylerl

2
L'emplacement de mémoire 0 est-il en haut ou en bas?

Réponses:


21

Je crois cela vient des tout premiers jours de l'informatique, lorsque la mémoire était très limitée, et il n'était pas judicieux de pré-allouer un gros morceau de mémoire à l'usage exclusif de la pile. Ainsi, en allouant de la mémoire de tas à partir de l'adresse zéro vers le haut et en empilant de la mémoire de la fin de la mémoire vers le bas, vous pouvez avoir le tas et la pile partager la même zone de mémoire.

Si vous aviez besoin d'un peu plus de tas, vous pourriez être prudent avec l'utilisation de votre pile; si vous aviez besoin de plus de pile, vous pouvez essayer de libérer de la mémoire. Le résultat a été, bien sûr, surtout, des plantages spectaculaires, car la pile écrasait parfois le tas et vice versa.

À l'époque, il n'y avait pas d'interwebz, il n'y avait donc pas de problème d'exploitation de dépassement de tampon. (Ou du moins dans la mesure où les interwebz existaient, ils se trouvaient tous dans des installations de haute sécurité du département de la défense des États-Unis, de sorte que la possibilité de données malveillantes n'avait pas besoin d'être beaucoup réfléchie.)

Après cela, avec la plupart des architectures, il s'agissait de maintenir la compatibilité avec les versions précédentes de la même architecture. C'est pourquoi des piles à l'envers sont toujours avec nous aujourd'hui.


8
Remontez plus loin dans l'histoire et il n'y avait pas de tas, même aujourd'hui, de nombreux microcontrôleurs 8 et 16 bits n'ont pas de tas. La pile s'est agrandie afin que le programme puisse être installé dans une adresse de mémoire faible, et la pile était la mémoire restante. L'initialisation de la pile peut être effectuée avant le chargement du programme, ce qui simplifie les programmes.
mattnz

1
La plupart des petits microcontrôleurs ont un tas, mais pas un tas qui pousse. Il est difficile de justifier l'utilisation de l'allocation dynamique de mémoire sur le tas lorsque vous avez une petite quantité de RAM (<1 Ko) avec laquelle travailler. Habituellement, la seule taille de la section mémoire qui change est la pile.
tehnyit

7

la mémoire du programme est traditionnellement

code
constants
heap (growing up)
...
stack (growing down)

le tas et la pile peuvent être échangés

mais les dépassements de tampon peuvent toujours être exploités si la pile va dans l'autre sens

prendre le classique strcpycomme exemple

foo(char* in){
char[100] buff;
strcpy(buff,in);
}

avec la mémoire de pile comme

ret foo
arg in
buff array
ret strcpy
buf pointer
in

cela signifierait que lorsque la copie est effectuée, l'adresse de retour de se strcpytrouve après le tampon (au lieu de fool'adresse de retour de) et peut être remplacée par ce qui se trouve dansin


4

Certains matériels ont le tas commençant à une mémoire élevée, augmentant vers le bas, tandis que la pile commence à une mémoire faible augmentant.

Le matériel PA-RISC de HP, entre autres, le fait: http://www.embeddedrelated.com/usenet/embedded/show/68749-1.php

Le vénérable système d'exploitation Multics fonctionnait sur du matériel qui avait (peut-être plusieurs) des piles grandissant: voir http://www.acsac.org/2002/papers/classic-multics.pdf , fin de la section 2.3.2:

Troisièmement, les piles sur les processeurs Multics ont augmenté dans le sens positif plutôt que dans le sens négatif. Cela signifiait que si vous accomplissiez réellement un débordement de tampon, vous écraseriez les trames de pile inutilisées, plutôt que votre propre pointeur de retour, ce qui rend l'exploitation beaucoup plus difficile.

C'est une déclaration assez intéressante. Les débordements de mémoire tampon sont-ils devenus un problème si énorme uniquement en raison de l'arrangement "habituel" procédure-appel-pile-cadre? De plus, dans quelle mesure la réputation de Multics comme totalement invulnérable n'était-elle qu'un coup de chance dans la conception matérielle?


Eh bien, le fait de ne pas avoir de pile exécutable a probablement aidé Multics tout autant que la direction de pile intelligente, et bien sûr, avec de nombreux programmes écrits en PL / 1, les débordements de chaînes n'étaient pas vraiment un problème.
Greg A. Woods du
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.