Sous Windows, la pile (pour un thread spécifique) croît à la demande jusqu'à ce que la taille de la pile spécifiée pour ce thread avant sa création soit atteinte.
La croissance à la demande est stimulée par l'utilisation de pages de garde, en ce sens qu'il n'y a qu'un fragment de pile disponible au départ, suivi d'une page de garde qui, lorsqu'elle est atteinte, déclenche une exception - cette exception est spéciale et est gérée par le système pour vous - la gestion augmente l'espace de pile disponible (également vérifié si une limite a été atteinte !) et l'opération de lecture est relancée.
Une fois la limite atteinte, il n'y a plus de croissance, ce qui entraîne une exception de débordement de pile. La base et la limite actuelles de la pile sont stockées dans le bloc d'environnement du thread, dans une structure appelée _NT_TIB
(bloc d'information sur les fils). Si vous avez un débogueur à portée de main, voici ce que vous voyez :
0:000> dt ntdll!_teb @$teb nttib.
+0x000 NtTib :
+0x000 ExceptionList : 0x0012e030 _EXCEPTION_REGISTRATION_RECORD
+0x004 StackBase : 0x00130000
+0x008 StackLimit : 0x0011e000
+0x00c SubSystemTib : (null)
+0x010 FiberData : 0x00001e00
+0x010 Version : 0x1e00
+0x014 ArbitraryUserPointer : (null)
+0x018 Self : 0x7ffdf000 _NT_TIB
L'attribut StackLimit sera mis à jour à la demande. Si vous vérifiez les attributs de ce bloc mémoire, vous verrez quelque chose de similaire :
0:000> !address 0x0011e000
00030000 : 0011e000 - 00012000
Type 00020000 MEM_PRIVATE
Protect 00000004 PAGE_READWRITE
State 00001000 MEM_COMMIT
Usage RegionUsageStack
Pid.Tid abc.560
Et le fait de vérifier une page à côté révèle l'attribut de garde :
0:000> !address 0x0011e000-1000
00030000 : 0011d000 - 00001000
Type 00020000 MEM_PRIVATE
Protect 00000104 PAGE_READWRITE | PAGE_GUARD
State 00001000 MEM_COMMIT
Usage RegionUsageStack
Pid.Tid abc.560
J'espère que cela vous aidera.
0 votes
En rapport : stackoverflow.com/questions/389219/
0 votes
"Je recherche spécifiquement Windows, Linux et Macintosh" - assez précis alors :)