Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

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

18K
11 января 2007 года
uighur
17 / / 24.12.2006
Есть вот такой модуль(см аттач) который по идее должен перехватывать прерывание 3.
Но он этого не делает. При запуске выводится сообщение что тип сегмента то 0xe то ещё что нибудь. При этом ничего не падает, но и проги отлаживаются нормально. Код частично взят из исходников FreeBSD. Подскажите, где у меня ошибка.
Заранее благодарен.
1.9K
12 января 2007 года
disasm
232 / / 06.02.2006
Немного смущает эта строчка:
t.gd_looffset = (int)func;
Я бы на сиху не надеялся, а сделал бы ((unsigned)func & 0xffff)

Аналогично тут:
t.gd_hioffset = ((unsigned)func)>>16;

Во-вторых лучше сделать не так
unsigned gd_type:5 ;
а так:
unsigned gd_type:4 ;
unsigned gd_xx2:1; // значение по умолчанию 0, хотя может быть любым

по аналогичным причинам.
18K
12 января 2007 года
uighur
17 / / 24.12.2006
Попробывал, не помогло...
1.9K
12 января 2007 года
disasm
232 / / 06.02.2006
А результат работы printf-ов можете привести?
18K
12 января 2007 года
uighur
17 / / 24.12.2006
загрузил:
idt: 0xc091b280
looffset:b9bc selector8 :stkpy:0 xx:0 type:e dpl:0 p:1 hioffset:c07b
looffset:8418 selector8 :stkpy:0 xx:0 type:f dpl:0 p:1 hioffset:0
выгрузил и загрузил:
idt: 0xc091b280
looffset:b9bc selector8 :stkpy:0 xx:0 type:e dpl:0 p:1 hioffset:c07b
looffset:8418 selector8 :stkpy:0 xx:0 type:f dpl:0 p:1 hioffset:0
выгрузил и загрузил:
idt: 0xc091b280
looffset:b9bc selector8 :stkpy:0 xx:0 type:e dpl:0 p:1 hioffset:c07b
looffset:8418 selector8 :stkpy:0 xx:0 type:f dpl:0 p:1 hioffset:0
что интересно, значение всех полей остаётся неизменным после записи, но адрес idt постоянен.
1.9K
13 января 2007 года
disasm
232 / / 06.02.2006
Имеем:
looffset:b9bc selector8 :stkpy:0 xx:0 type:e dpl:0 p:1 hioffset:c07b
looffset:8418 selector8 :stkpy:0 xx:0 type:f dpl:0 p:1 hioffset:0

Итого ваш обработчик дожен находиться по адресу
0x00008418
А старый обработчик находится по адресу
0xc07bb9bc

У вас указан относительный адрес к обработчику (тот что прописан в самом модуле), а вам надо указать адрес с учетом GOT

Сдесь возможно несколько причин:
1. модуль компилируется без учета динамического позиционирования кода (это опция в компиляторе)
2. модуль линкуется без создания GOT
18K
14 января 2007 года
uighur
17 / / 24.12.2006
hioffset:0 был из за того, что я написал ((unsigned) func &0xffff) >> 16
Меня беспокоит другое: параметры обработчика не мняются после загрузки и выгрузки модуля
1.9K
15 января 2007 года
disasm
232 / / 06.02.2006
Я заметил что модуль не возвращает IDT в свое прежнее состояние.
Хотелось бы увидеть новый вариант исходника модуля если это можно.
18K
16 января 2007 года
uighur
17 / / 24.12.2006
Мне честно говоря и не нужно, что бы idt возвращалась в прежнее состояние. Модуль я доделал и теперь он действительно перехватывает прерывание.Но есть проблема: при вызове int 3 с уровня пользователь ядро падает в GP.
18K
16 января 2007 года
uighur
17 / / 24.12.2006
Что бы ядро не падало в GP надо в бинарнике менять ret на iret (0xc3 на 0xcf), но при этом вызов int3 с уровня пользователя заканчивается SEGMENTATION FAULT с адресом возврата 0. Как бы это исправить?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог