web-dev-qa-db-fra.com

Tailles de pile Linux

Je cherche une bonne description des piles dans le noyau Linux, mais je trouve qu'il est étonnamment difficile de trouver quelque chose d'utile.

Je sais que les piles sont limitées à 4k pour la plupart des systèmes et à 8k pour les autres. Je suppose que chaque thread/moitié inférieure du noyau a sa propre pile. J'ai également entendu dire que si une interruption se déclenche, il utilise la pile du thread actuel, mais je ne trouve aucune documentation à ce sujet. Ce que je recherche, c'est comment les piles sont allouées, s'il y a de bonnes routines de débogage pour elles (je soupçonne un débordement de pile pour un problème particulier, et j'aimerais savoir s'il est possible de compiler le noyau à la police tailles de pile, etc.).

38
John Ulvr

La raison pour laquelle la documentation est rare est que c'est un domaine qui dépend assez de l'architecture. Le code est vraiment la meilleure documentation - par exemple, la macro THREAD_SIZE Définit la taille de la pile du noyau (dépendante de l'architecture) par thread.

Les piles sont allouées dans alloc_thread_stack_node() . Le pointeur de pile dans le struct task_struct Est mis à jour dans dup_task_struct() , qui est appelé dans le cadre du clonage d'un thread.

Le noyau vérifie les débordements de la pile du noyau, en en plaçant une valeur canari STACK_END_MAGIC À la fin de la pile . Dans le gestionnaire de défauts de page, si un défaut dans l'espace du noyau se produit, ce canari est vérifié - voir par exemple le gestionnaire de défauts x86 qui affiche le message Thread overran stack, or stack corrupted Après le Oops message si le canari de la pile a été encombré.

Bien sûr, cela ne se déclenchera pas sur tous les dépassements de pile , seuls ceux qui encombrent la pile canari. Cependant, vous devriez toujours pouvoir dire à partir de la sortie Oops si vous avez subi un dépassement de pile - c'est le cas si le pointeur de pile est inférieur à task->stack.

36
caf

Vous pouvez déterminer la taille de la pile de processus avec la commande ulimit. J'obtiens 8192 Kio sur mon système:

$ ulimit -s
8192
3
Miles Rout

Pour les processus, vous pouvez contrôler la taille de la pile des processus via la commande ulimit (option -s). Pour les threads, la taille de pile par défaut varie beaucoup, mais vous pouvez la contrôler via un appel à pthread_attr_setstacksize() (en supposant que vous utilisez pthreads).

Quant à l'interruption utilisant la pile userland, j'en doute quelque peu, car l'accès à la mémoire userland est une sorte de tracas du noyau, en particulier d'une routine d'interruption. Mais je n'en suis pas sûr.

0
vhallac