Перехват 3-его прерывания в модуле ядра под FreeBSD.

Тема в разделе "WASM.UNIX", создана пользователем uighur, 10 янв 2007.

  1. uighur

    uighur New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2007
    Сообщения:
    10
    Есть вот такой модуль(см аттач) который по идее должен перехватывать прерывание 3.
    Но он этого не делает. При запуске выводится сообщение что тип сегмента то 0xe то ещё что нибудь. При этом ничего не падает, но и проги отлаживаются нормально. Код частично взят из исходников FreeBSD. Подскажите, где у меня ошибка.
    Заранее благодарен.
     
  2. Bob

    Bob New Member

    Публикаций:
    0
    Регистрация:
    2 авг 2004
    Сообщения:
    112
    Адрес:
    Ukraine
    Не пробовал упаковать структуры?
     
  3. uighur

    uighur New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2007
    Сообщения:
    10
    Пробовал, не помогает....
    И еще: иногда выводится разная информация то тип шлюза e то f , то dpl 0 то 3.
     
  4. Bob

    Bob New Member

    Публикаций:
    0
    Регистрация:
    2 авг 2004
    Сообщения:
    112
    Адрес:
    Ukraine
    Вот тут статейка есть http://www.opennet.ru/base/dev/proccess_in_linux.txt.html.
    Там в самом конце про перехват #BP под Linux-ом. Задача примерно как у тебя.
     
  5. uighur

    uighur New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2007
    Сообщения:
    10
    Привёл код к вот такому виду(см аттач).
    При загрузке выводит:
    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(Ничего не изменилось!!!!!)
    Память для идт выделяется распределителем ядра и доступна для записи. Такое впечатление что я дро востанавливает оригинальное содержимое. Что это может быть?
     
  6. uighur

    uighur New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2007
    Сообщения:
    10
    До меня дошло в чём было дело. Строкой gate_d t=traps[3] я создавал локальную копию того дескриптора(скорее всего в стеке). Далее я заполнял именно его.Добавление строки traps[3]=t
    решает проблему.
     
  7. uighur

    uighur New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2007
    Сообщения:
    10
    После перехвата при установки точки останова и запуска проги, прога получает SIGBUS:
    (gdb) break main
    Breakpoint 1 at 0x804853e
    (gdb) run
    Starting program: /tmp/t

    Program received signal SIGBUS, Bus error.
    0x28050a84 in ?? ()
    При чём обработчик похоже не вызывался так как в dmesg нет соответствующегосообщения.