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.).
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
.
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
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.