2016-10-14 5 views
2

Я пытаюсь написать программу, которая реализует сигналы в xv6Восстановление StackFrame в x86

Я понял, как манипулировать стеком (я думаю), и я просто возникли проблемы с восстанавливающей его. Вот мой код для сигнала доставки:

Эта функция добавляет кадр сигнала ВЗ стека процесса и сохраняет летучие регистры

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]); 
} 

У меня возникают проблемы, восстанавливающий мой процесс trapframe в моей void signal_return(void).

Моя попытка восстановить кадр:

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

Может кто-нибудь мне точку в правильном направлении?

+1

Что должно сделать реставрация? «Proc-> tf-> esp = proc-> tf-> esp + 24;' пытается вернуть действие 'signal_deliver', а последний' eip = 'восстанавливает переменную' eip'. Но зачем вы записываете в выпущенный стек указатель стека, где «eax/ecx/edx» хранится в 'signal_deliver'? Разве вы не хотите скорее их восстановить? То есть. 'proc-> tf-> eax = * ((uint *) (proc-> tf-> esp-8));' ... (остерегайтесь, я понятия не имею, что происходит в этом коде, и что 'proc-> tf', если это текущие CPU regs, мне интересно, как это даже может работать без сбоев из-за прерываний/и т. д.) – Ped7g

+0

@ Ped7g вы смогли помочь мне понять, как реализовать благодарность' signal_deliver'. Возможно, вы хотите опубликовать ответ? Я закончил его и могу опубликовать его в качестве ответа, если вы этого не хотите. – bkennedy

+1

входить, post рабочий решение. – Ped7g

ответ

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)); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^