2012-06-29 4 views
4

Je suis en mesure d'obtenir l'exécution de l'appel d'appels système et son traitement dans le noyau. Mais peu de choses ne me sont pas encore claires. En entrant dans la routine swi, le noyau enregistre les registres du mode Utilisateur sur la pile. La question est -Linux Appel système

  1. De qui s'agit-il? (Comme la gestion de swi et la routine d'appel système correspondante a besoin du cadre de pile pour fonctionner)

  2. Si c'est la pile du noyau, d'où la pile sera-t-elle allouée? Est-ce qu'il commencera à utiliser la pile du courant? Si oui, alors courant peut être n'importe quel processus qui pourrait être en cours d'exécution dans le noyau. Est-ce que cela n'épuise pas la pile de courant? S'il utilise la pile du processus utilisateur en cours d'exécution dans le gestionnaire swi, il s'agira de l'espace adresse de l'utilisateur auquel le noyau va maintenant accéder. Est-ce possible? Comme la mémoire adressable du noyau est inférieure à 1 Go (si le rapport d'espace d'adressage Kernel-to-User est utilisé dans un système de mémoire RAM de 4 Go).

Répondre

5

La plupart des modes ARM ont une pile distincte. Les piles sont généralement mises en place peu après la réinitialisation du gestionnaire. De arch/arm/kernel/setup.c:

/* 
* setup stacks for re-entrant exception handlers 
*/ 
__asm__ (
"msr cpsr_c, %1\n\t" 
"add sp, %0, %2\n\t" 
"msr cpsr_c, %3\n\t" 
"add sp, %0, %4\n\t" 
"msr cpsr_c, %5\n\t" 
"add sp, %0, %6\n\t" 
"msr cpsr_c, %7" 
    : 
    : "r" (stk), 
     "I" (PSR_F_BIT | PSR_I_BIT | IRQ_MODE), 
     "I" (offsetof(struct stack, irq[0])), 
     "I" (PSR_F_BIT | PSR_I_BIT | ABT_MODE), 
     "I" (offsetof(struct stack, abt[0])), 
     "I" (PSR_F_BIT | PSR_I_BIT | UND_MODE), 
     "I" (offsetof(struct stack, und[0])), 
     "I" (PSR_F_BIT | PSR_I_BIT | SVC_MODE) 
    : "r14"); 

P.S. SVC est le nom actuel de ce qu'on a appelé SWI.

+0

Merci et vous avez raison .. Le mode utilisateur SP, LR sont sauvegardés lors de l'entrée dans SWI hander. Mais je peux voir les informations actuelles (le noyau Linux task_struct qui est actif) de la pile de gestionnaires SWI. Comment est-ce possible? –

0

Il est vrai que la pile est spécifique aux modes ARM.

Ceci est le chemin de retour de syscall rapide. Nous faisons aussi peu que possible ici, et cela inclut de sauvegarder r0 dans la pile SVC.

Les lignes ci-dessus sont cités dans entrée-common.S. La pile est donc une pile SVC. (Note: swi est remplacé par svc).