Linux Tailles De Tapis
Je suis à la recherche d'une bonne description de piles dans le noyau linux, mais je suis de trouver 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 suis en supposant que chaque thread du noyau /moitié inférieure a sa propre pile. J'ai aussi entendu dire que si une interruption se déclenche, il utilise la pile du thread actuel, mais je ne trouve pas de documentation sur tout cela. Ce que je cherche est la façon dont les piles sont alloués, si il y a de bonnes routines de débogage pour eux (je suis soupçonnant un débordement de pile pour un problème particulier, et je voudrais savoir si c'est possible de compiler le noyau à la police la taille du tapis, etc).
- quelle version du noyau sont ce que vous travaillez avec? si nous avons une meilleure idée de la débogage du noyau les options de configuration disponibles pour vous.
- Je ne semble pas pour obtenir cette. Pourquoi n'est-ce pas un débogueur suffisant pour la tâche ?
- "bas-moitiés" probablement partager la même pile. Aussi, "bas-moitiés" disparu il y a longtemps, maintenant il y a softirqs gauche.
- Utiliser le
ulimit -s
de commande. Le résultat est dans KiB. - Est-ce à propos userland ou kthreads? Utilisateur: unix.stackexchange.com/questions/145557/...
Vous devez vous connecter pour publier un commentaire.
La raison que la documentation est rare, c'est que c'est un domaine qui est tout à fait dépendants de l'architecture. Le code est vraiment le meilleur de la documentation - par exemple, la
THREAD_SIZE
macro définit l' (dépendants de l'architecture) par thread noyau de la taille de la pile.Les piles sont alloués dans
alloc_thread_info_node()
, ou l'architecture spécifique de la remplacer pour que la fonction (lestruct thread_info
vit toujours au bas de la pile). Le pointeur de pile dans lestruct task_struct
est mis à jour endup_task_struct()
, qui est appelée dans le cadre du clonage d'un thread.Le noyau ne vérifie noyau débordements de pile, en plaçant un canari valeur
STACK_END_MAGIC
à la fin de la pile (immédiatement après lestruct thread_info
en mémoire). Dans le gestionnaire de défauts de page, si une faute dans l'espace du noyau se produit ce canari est vérifié - voir, par exemple, le x86 gestionnaire de panne qui imprime le messageThread overran stack, or stack corrupted
après la Oups le message si la pile canaries a été tabassé.Bien sûr, cela ne se déclenche pas sur tous dépassements de pile, seulement ceux qui clobber de la pile des canaries. Toutefois, vous devriez toujours être en mesure de dire à partir de la sortie du Oops si vous avez souffert d'une débordements de pile - c'est le cas si le pointeur de pile est en dessous de
&threadinfo
.Vous pouvez déterminer le processus de la taille de la pile avec le
ulimit
de commande. Je reçois 8192 Ko sur mon système:ulimit -s
dans la ligne de cmdPour les processus, vous pouvez contrôler la taille de la pile du processus via
ulimit
de commande (-s
option). Pour les threads, la taille de pile par défaut varie beaucoup, mais vous pouvez le contrôler via un appel àpthread_attr_setstacksize()
(en supposant que vous utilisez pthreads).Comme pour l'interrompre à l'aide de l'implémentation de la pile, j'ai un peu de doute que l'accès à l'espace utilisateur de la mémoire est une sorte de tracas à partir du noyau, en particulier à partir d'une routine d'interruption. Mais je ne sais pas pour sûr.