Я пытаюсь написать программу, которая реализует сигналы в 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));
Может кто-нибудь мне точку в правильном направлении?
Что должно сделать реставрация? «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
@ Ped7g вы смогли помочь мне понять, как реализовать благодарность' signal_deliver'. Возможно, вы хотите опубликовать ответ? Я закончил его и могу опубликовать его в качестве ответа, если вы этого не хотите. – bkennedy
входить, post рабочий решение. – Ped7g