Я пытаюсь обрабатывать прерывания ядра через IDT. Я работаю на Intel x86 под Linux.x86: цикл обработчика прерываний
Я установил свои IDT и мои записи прерываний, и я запустил несколько тестов для просмотра обработчиков прерываний.
Когда я пытаюсь использовать int $0x0
, он отлично работает: мой обработчик вызывается, но когда я пытаюсь сделать какое-то исключение с нажатым кодом ошибки, я вхожу в бесконечный цикл.
Схема выглядит следующим образом:
Когда приходит исключение, первая часть моего обработчика в ASM и вызывает общую C часть.
my_handler.c
void handler(int i)
{
printf("Exception %d caught\n", i);
}
my_handlers.S
common:
pushal
pushl %ds
pushl %es
pushl %fs
pushl %gs
addl $48, %esp // 4 4-bytes segments pushed
// + 8 4-bytes registers (pushal)
` // esp points on exception code
call handler // call the C handler with exception code
subl $48, %esp
popl %gs
popl %fs
popl %es
popl %ds
popal
addl $8, %esp // 4-byte error code + 4-byte exception number
iret
exception_de_handler:
pushl $0 // Fake error code
pushl $0 // interrupt number
jmp common
exception_gp_handler:
// error code is pushed by µproc.
pushl $13 // interrupt number
jmp common
exception_pf_handler:
// error code is pushed by µproc.
pushl $14 // interrupt number
jmp common
Если я пытаюсь запустить код followig:
int* a = 0x0;
*a = 42;
Он работает, то exceution возобновляется после *a = 42;
Но если я стараюсь:
int* a = 0x0;
*a = 42;
*a = 1337;
Он идет в бесконечном цикле:
Exception 14 caught
Exception 13 caught
Exception 13 caught
Exception 13 caught
Exception 13 caught
.....
Exception 13 caught
Exception 13 caught
Exception 13 caught
.....
Почему первое исключение ошибки страницы (14) обрабатывались затем цикл по общей защите (13)?
Благодарим за ответы.
Почему вы вручную манипулируете IDT из-под Linux? Это не может закончиться хорошо. Вы должны использовать API-интерфейсы драйверов устройств Linux для прерывающихся прерываний. (Также я не уверен, как вам удается вызывать 'printf' из режима ядра - нам может понадобиться дополнительное объяснение того, что вы на самом деле сделали.) – zwol
@ Zack - хорошая точка – Stewart