Обработчик третьего прерывания.
Код:
void int03_handler(void) {
printf("int 3 called!");
__asm__ __volatile__("leave\n iret\n");
Тип шлюза - 0xf(шлюз ловушки). Привелегии 3 ( возможен вызов с прикладнова уровня)
При попытке отладить прогу gdb получаю вот что:
Код:
(gdb) break main
Breakpoint 1 at 0x080484d2
(gdb) run
Starting program:/home/uighur/t
int 3 called!
Program reseived signal SIGSEGV, Segmentation fault.
0x00000000 ??()
(gdb)
ОС-FreeBSD 5.5.
Как сделать что бы после вызова обработчика управление передавалось туда, где и была команда int3?
Может лучше обработчик прерывания на асме переписать? А то у меня есть некоторые сомнения по поводу того, что сработает вообще функция printf(); если, скажем, в ds загружен селектор для юзерского сегмента данных, а не для сегмента данных ядра...
Сообщение выводится. Но при вызове из процесса пользователя возврат происходит по адресу 0, но не в ядро а в тот процесс. А разьве при переключении задач ds не будет смотреть на ds ядра?
Все-таки лучше на ассемблере обработчик написать, а то могут быть со стеком проблемы
Заменил первую инструкцию обработчика в hex редакторе на iretd. Результат прежний.Так что дело тут не в том что стек не сбалансирован.
может попробовать проанализировать дизассемблерный код этого обработчика? может все встанет на свои места. Конечно такие вещи желательно на асме писать...
Функции консольного ввода-вывода вставлять в обработчики крайне нежелательно! Хорошим тоном в программировании является отложенная визуальная обработка прерываний, в том числе и отладочных!
imho, тут всё от задачи зависит.К примеру в интерактивном отладчике уровня ядра без ввода вывода нельзя(иначе что за интерактивность).А в других случаях необходимо минимизировать время обработки прерывания => консольный ввод вывод нужно убрать. Но так как этот код я пишу тока для того что бы научится работать в защищённом режиме и одновременно изучить ядро FreeBSD то этим я пренебригаю.