Есть вот такой модуль(см аттач) который по идее должен перехватывать прерывание 3. Но он этого не делает. При запуске выводится сообщение что тип сегмента то 0xe то ещё что нибудь. При этом ничего не падает, но и проги отлаживаются нормально. Код частично взят из исходников FreeBSD. Подскажите, где у меня ошибка. Заранее благодарен.
Пробовал, не помогает.... И еще: иногда выводится разная информация то тип шлюза e то f , то dpl 0 то 3.
Вот тут статейка есть http://www.opennet.ru/base/dev/proccess_in_linux.txt.html. Там в самом конце про перехват #BP под Linux-ом. Задача примерно как у тебя.
Привёл код к вот такому виду(см аттач). При загрузке выводит: idt: 0xe9504000 func c38ff4b8 idt: 0xe9505000 looffset:b9d4 selector8 :stkpy:0 xx:0 type:e dpl:3 p:1 hioffset:c07b looffset:f4b8 selector8 :stkpy:0 xx:0 type:f dpl:0 p:1 hioffset:c38f looffset:b9d4 selector8 :stkpy:0 xx:0 type:e dpl:3 p:1 hioffset:c07b(Ничего не изменилось!!!!!) Память для идт выделяется распределителем ядра и доступна для записи. Такое впечатление что я дро востанавливает оригинальное содержимое. Что это может быть?
До меня дошло в чём было дело. Строкой gate_d t=traps[3] я создавал локальную копию того дескриптора(скорее всего в стеке). Далее я заполнял именно его.Добавление строки traps[3]=t решает проблему.
После перехвата при установки точки останова и запуска проги, прога получает SIGBUS: (gdb) break main Breakpoint 1 at 0x804853e (gdb) run Starting program: /tmp/t Program received signal SIGBUS, Bus error. 0x28050a84 in ?? () При чём обработчик похоже не вызывался так как в dmesg нет соответствующегосообщения.