la pile noyau et l'espace utilisateur de la pile
Quelle est la différence entre le noyau de la pile et la pile de l'utilisateur? Pourquoi la pile noyau est-il utilisé? Si une variable locale est déclarée dans un rapport de recherche internationale, où il sera stocké? Est-ce que chaque processus a son propre noyau de la pile? Alors comment le processus de coordonnées entre ces deux piles?
Vous devez vous connecter pour publier un commentaire.
Bref, rien - à part à l'aide d'un autre emplacement dans la mémoire (et donc une valeur différente pour le stackpointer registre), et généralement différentes d'accès à la mémoire de protections. I. e. lors de l'exécution en mode utilisateur, la mémoire du noyau (partie de qui est le noyau de la pile) ne sera pas accessible, même si mappé. Vice-versa, sans explicitement demandé par le code du noyau (Linux, grâce à des fonctions comme
copy_from_user()
), mémoire utilisateur (y compris la pile de l'utilisateur) n'est généralement pas directement accessible.Séparation des privilèges et de la sécurité. Pour l'un, de l'espace utilisateur, les programmes peuvent faire leur pile(pointeur) ce qu'ils veulent, et il n'y a généralement pas d'exigence architecturale de même avoir un valide. Le noyau ne peut donc pas confiance de l'espace utilisateur stackpointer pour être valables, ni utilisable, et il faudra donc un jeu sous son propre contrôle. Différentes architectures des processeurs de mettre en œuvre de façon différente; les Processeurs x86 basculer automatiquement stackpointers quand privilège commutateurs de mode se produire, et les valeurs à utiliser pour les différents niveaux de privilège sont configurables par code privilégié (c'est à dire uniquement le noyau).
De la pile du noyau. Le noyau (noyau Linux, qui est) ne pas crochet ISRs directement à l'architecture x86 est interrompre portes mais plutôt les délégués de l'interruption envoi d'un noyau commun d'interruption d'entrée/sortie mécanisme qui enregistre pré-interrompre le registre de l'état avant d'appeler le gestionnaire enregistré(s). Le PROCESSEUR lui-même lors de l'envoi d'une interruption peut exécuter un privilège et/ou de la pile commutateur, et ce est utilisé/mis en place par le noyau, de sorte que la commune interrompre le code d'accès peut déjà compter sur une pile de noyau être présent.
Cela dit, les interruptions qui se produisent lors de l'exécution de code du noyau sera tout simplement continuer à utiliser le noyau de la pile en place à ce point. Cela peut, si les gestionnaires d'interruption ont profondément imbriqués appel chemins, conduire à des débordements de pile (si une profonde du noyau d'appel de chemin d'accès est interrompu, et le gestionnaire des causes d'une autre profonde chemin; dans Linux, système de fichiers /RAID logiciel d'être interrompu par le code réseau avec iptables actif est connu pour déclencher telle dans désaccordé les anciens noyaux ... la solution est d'augmenter la pile noyau tailles pour de telles charges de travail).
Pas seulement chaque - chaque fil dispose de sa propre pile de noyau (et, en fait, sa propre pile de l'utilisateur ainsi). Rappelez-vous, la seule différence entre les processus et les threads (pour Linux), c'est le fait que plusieurs threads peuvent partager un espace d'adressage (formant un processus).
Pas du tout - il n'est pas nécessaire. La planification (comment /quand les différents threads sont en cours d'exécution, comment leur état est sauvegardé et restauré) est le système d'exploitation de la tâche et le processus n'avez pas besoin de se préoccuper de cela. Que les threads sont créés (et chaque processus doit avoir au moins un thread), le noyau crée les piles du noyau pour eux, tout l'espace utilisateur, les piles sont soit explicitement créé/fourni par n'importe quel mécanisme est utilisé pour créer un thread (comme les fonctions
makecontext()
oupthread_create()
permettre à l'appelant de spécifier une zone de mémoire pour être utilisés pour le terme "enfant" pile du thread), ou héréditaires (par accéder à la mémoire de clonage, généralement appelé "copy on write" /VACHE, lors de la création d'un nouveau processus).Cela dit, le processus de peut influence de la planification de ses fils et/ou de l'influence de la contexte (état, entre qui est le thread stackpointer). Il existe plusieurs moyens pour cela: UNIX signaux,
setcontext()
,pthread_yield()
/pthread_cancel()
, ... -, mais c'est disgressing un peu de la question d'origine.Ma réponse est recueillie à partir d'autres AINSI en question avec mes animaux.
Comme un noyau programmeur, vous savez que le noyau doit être limitée à des indications erronées programmes de l'utilisateur. Supposons que vous garder la même pile de noyau & utilisateur de l'espace, alors simple erreur de segmentation dans l'utilisateur de l'application se bloque noyau et doit redémarrer.
Il y a un "noyau de la pile" par UC comme ISR Pile et une pile de noyau" par Processus. Il y a une "pile de l'utilisateur" pour chaque processus, bien que chaque thread possède sa propre pile, y compris à la fois l'utilisateur et le noyau fils.
http://linux.derkeiler.com/Mailing-Lists/Kernel/2004-10/3194.html
Ainsi, lorsque nous sommes en mode noyau, pile type de mécanisme est nécessaire pour traiter les appels de fonction, les variables locales semblable à l'espace utilisateur.
http://www.kernel.org/doc/Documentation/x86/kernel-stacks
Il sera stocké dans ISR pile(IRQSTACKSIZE). Le rapport de recherche internationale s'exécute sur un autre interruption de la pile uniquement si le matériel prend en charge. Sinon, le rapport de recherche internationale stack frames sont poussés sur la pile du thread interrompu.
L'espace utilisateur ne sait pas, et franchement, il ne se soucie pas de savoir si l'interruption est servi dans le processus actuel de la pile du noyau ou d'un des rapports de recherche internationale de la pile. Comme les interruptions vient par uc, donc ISR de la pile doit être par uc.
Oui. Chaque processus a sa propre pile de noyau.
@FrankH réponse ressemble beaucoup à moi.
La prise de référence de Robert Amour du Noyau Linux, le Développement, la principale différence est la taille:
Également de la pile du noyau contient un pointeur vers le thread_info struct détiennent des informations sur le thread.