2016-10-14 4 views
2
Blocs d'activation

Je suis en train d'écrire un programme qui met en oeuvre des signaux dans xv6Restauration dans x86

J'ai compris comment manipuler la pile (je pense) et je suis tout simplement de la difficulté à le restaurer. Voici mon code pour le signal livrer:

Cette fonction ajoute la trame de signal ot la pile de processus et enregistre les registres volatils

void signal_deliver(int signum) 
{ 
*((uint*) (proc->tf->esp-4)) = proc->tf->eip; 
*((uint*) (proc->tf->esp-8)) = proc->tf->eax; 
*((uint*) (proc->tf->esp-12)) = proc->tf->ecx; 
*((uint*) (proc->tf->esp-16)) = proc->tf->edx; 
*((uint*) (proc->tf->esp-20)) = signum; 
*((uint*) (proc->tf->esp-24)) = *(uint*) proc -> signal_trampoline; 
proc->tf->esp = proc->tf->esp-24; 
proc->tf->eip = (uint) (proc->signal_handlers[signum]); 
} 

Je ne parviens pas restaurer mon processus de trapframe dans mon void signal_return(void).

Ma tentative de rétablir le cadre est:

proc->tf->esp = proc->tf->esp + 24; 
    *((uint*)(proc->tf->esp - 16)) = proc->tf->esp; 
    *((uint*)(proc->tf->esp - 12)) = proc->tf->esp; 
    *((uint*)(proc->tf->esp - 8)) = proc->tf->esp; 
    proc->tf->eip = *((uint*)(proc->tf->esp - 4)); 

me point Quelqu'un peut-il dans la bonne direction?

+1

que devrait faire la restauration? Le 'proc-> tf-> esp = proc-> tf-> esp + 24;' cherche à inverser l'action de 'signal_deliver', et le dernier' eip = 'restaure la variable' eip'. Mais pourquoi écrivez-vous dans la pile libérée le pointeur de la pile lui-même, là où 'eax/ecx/edx' était stocké dans' signal_deliver'? Tu ne veux pas plutôt les restaurer à la place? C'est à dire. 'proc-> tf-> eax = * ((uint *) (proc-> tf-> esp-8)); ... (attention, je n'ai aucune idée de ce qui se passe dans ce code, et quels sont 'proc-> tf', si cela est des regs CPU en direct, je me demande comment cela peut même fonctionner sans se briser à cause des interruptions/etc.) – Ped7g

+0

@ Ped7g vous avez été en mesure de m'aider à comprendre comment implémenter le' signal_deliver' merci. Peut-être que vous voulez poster la réponse? Je l'ai rempli et je peux l'afficher comme réponse si vous ne le voulez pas. – bkennedy

+1

allez-y, solution post travail. – Ped7g

Répondre

2
void signal_return(void) { 
    proc->tf->esp = proc->tf->esp + 24; 
    proc->tf->edx = *((uint*)(proc->tf->esp - 16)); 
    proc->tf->ecx = *((uint*)(proc->tf->esp - 12)); 
    proc->tf->eax = *((uint*)(proc->tf->esp - 8)); 
    proc->tf->eip = *((uint*)(proc->tf->esp - 4)); 
}