getrlimit (2) a la définition suivante dans les pages de manuel:
RLIMIT_AS La taille maximale de la mémoire virtuelle du processus (espace d'adressage) en octets. Cette limite affecte les appels à brk (2), mmap (2) et mremap (2), qui échouent avec l'erreur ENOMEM lors du dépassement de cette limite. L' expansion automatique de la pile échouera également (et générera un SIGSEGV qui tue le processus si aucune autre pile n'a été mise à disposition via sigaltstack (2)). Étant donné que la valeur est longue, sur les machines de 32 bits, cette limite est au maximum de 2 Gio ou cette ressource est illimitée.
Qu'entend-on ici par "expansion automatique de la pile"? La pile dans un environnement Linux / UNIX croît-elle au besoin? Si oui, quel est le mécanisme exact?
ulimit -s
).Le mécanisme exact est donné ici, sous Linux: lors de la gestion d'un défaut de page sur des mappages anonymes, vous vérifiez si c'est une "allocation de développement" que vous devez développer comme une pile. Si l'enregistrement de zone VM indique que vous devez, vous ajustez l'adresse de début pour étendre la pile.
Lorsqu'un défaut de page se produit, en fonction de l'adresse, il peut être réparé (et le défaut annulé) via l'extension de la pile. Ce comportement "croissant vers le bas en cas d'erreur" pour la mémoire virtuelle peut être demandé par des programmes utilisateur arbitraires avec l'
MAP_GROWSDOWN
indicateur transmis à l'mmap
appel système.Vous pouvez également jouer avec ce mécanisme dans un programme utilisateur:
Quand il vous invite, vous trouverez le pid du programme (via
ps
) et regardez/proc/$THAT_PID/maps
pour voir comment la zone d'origine a augmenté.la source