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

Ваш аккаунт

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

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

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

Пишу ОС - проблема с прерываниями в защищеном режиме.

4
06 марта 2002 года
mike
3.7K / / 01.10.2002
Вот, начитался http//sasm.narod.ru и решил вспомнить молодость (http//www.codenet.ru/progr/os/intro.php).

Перешел в защищенный режим нормально, вот когда начал устанавливать прерывания начались траблы. 2-ые сутки борюсь. Видимо срабатывает исключение, почему и какое не могу понять.

Вообще может кто подскажет, как лучше отлаживать такого рода вещи ???

Листинг в следующем посте
572
11 марта 2002 года
Chingachguk
29 / / 20.01.2000
О ! Хорошо, что есть люди, пишущие в ринге-0.

А в чем конкретно-то трабл ?
А то у тебя тут довольно много кода

Ты что, исключение ловишь ? Обработчик таймера управление получает ? Воткни в него дебаг-месс, что он управление-то получил, что-ли ... Перед iret-ом ...

Кстати, если обработчик в сегменте с use16, то пиши db 66h, iret. Ну это так, к слову ...

В обработчике инта от ведомого контроллера вроде в порт ведущего тоже EOI надо посылать ...

[ Это Сообщение было отредактировано Chingachguk в 2002-03-11 0316 ]

[ Это Сообщение было отредактировано Chingachguk в 2002-03-11 0321 ]
4
11 марта 2002 года
mike
3.7K / / 01.10.2002
Ух ты, не думал я, что мне кто-нибудь ответит.

На счет EOI я знаю, и вроде делаю (унаследовал из R-Mode). А вот на счет db 66h - спасибо, я честно говоря не совсем понимаю, 16 битный или 32 битный режим. Точнее не до конца понимаю, в чем у них различия.

А у меня проблема такая, что исключение срабатывает в тот момент, когда я еще не все прерывания установил. Такое впечатление, что срабатывает сначала таймер, потом срабатывает отсутствие сегмента… Может, конечно, дело в не том iret’е
Аноним
Честно гря, я совсем немного писал такого кода. Но мне такие фишки очень нравятся.
Если хочешь, кинь мне на мыло(vzubko@mail.ru)
свою прогу и напиши тока, как ее компилировать и чем. Я попробую тоже посмотреть

Насчет db 66h - сегменты бывают двух типов: use16 и use32. В первом 32-х разрядные команды идут с префиксом(этот db 66h, к примеру), чтобы проц врубился, что происходит. И наоборот. Сам use-это скорее для компилятора, а вот тип сегмента проц трактует по какому-то битику в дескрипторе. Так что вроде надо это самому контролировать.

А почему ты не выводишь дебух на каждое исключение и прерывание - чтобы видеть все точно ?
572
11 марта 2002 года
Chingachguk
29 / / 20.01.2000
Прошу пардону, предидущее сообщение внес Chingachguk, но забыл ввести логин.
4
11 марта 2002 года
mike
3.7K / / 01.10.2002
Я удалил сорцы с форума. Теперь они тут
http//home.novgorod.ru/lab/files/advprogr/os/pmode.rar

В архиве есть compile.bat
Для компиляции нужны tasm и tlink. Все остальное в архиве.

Утилитка fat12.exe создает образ дискеты, пишет туда boot сектор, и
саму "ось" (kernel.com)

Образ дискеты - *.flp (Я его VMWare подсовываю)

Проблема то в чем. Как только я в обработчик любого прерывания
что-нибудь вписываю (кроме iret) VMWare сразу валится (если без
VMWare, то перезагружается тачка)
572
13 марта 2002 года
Chingachguk
29 / / 20.01.2000
Хай !

Решил я твой трабл.
Фишка-то в том, что ты неправильно описываешь ловушки и шлюзы прерываний. Смотри
Пошла инициализация дескрипторов прерываний

lea eax,Int_30_entry_point
;; call set_int_IDT_descriptor - Это было
call set_trap_IDT_descriptor - А так надо.

Дело в том, что програмное прерывние - это ловушка.
А вот с аппартаным прерыванием пока все в порядке
lea eax,ex_00_entry_point
call set_int_IDT_descriptor - Это действительно шлюз прерывания.

Но это пока. Смотри дальше

set_int_IDT_descriptor proc near
; Установка IDT-дескриптора прерывания.
; DSBX = дескриптор в IDT
; DX = селектор сегмента кода обработчика
; EAX = смещение в сегменте кода

push cx
;; mov cx,8600h ; Права доступа шлюза прерывания
mov cx,8E00h ; Права доступа шлюза прерывания
call set_IDT_descriptor
pop cx
ret
endp

set_trap_IDT_descriptor proc near
; Установка IDT-дескриптора ловушки.
; DSBX = дескриптор в IDT
; DX = селектор сегмента кода обработчика
; EAX = смещение в сегменте кода

push cx
;; mov cx,8700h ; Права доступа шлюза ловушки с D=0
mov cx,8F00h ; Права доступа шлюза ловушки с D=0
call set_IDT_descriptor
pop cx
ret
endp

У тебя атрибуты шлюза прерывания(86h) и ловушки(87h) заданы нифига
неверно. Надо писать 8Eh и 8Fh (исправлено).

Код с исправлениями я тебе кинул.
Все инклюды слил в один файл.
Если хочешь таймер глянуть, раскомментарь sti.

Удачи !

ps В моем исправленном коде я доработал обработчик исключений. Он теперь показывает номер исключения, csip и 4 байта команды, вызвавшей его. Когда я запускал с ним твой начальный код, возникало исключение 0Ch(ошибка работы со стеком - после iret-а), а вот код команды, его вызвавшей, не поверишь, был вот этот

;; sti
int 30h ; Демонстрация работы программных прерываний

; iret был, но ...

; Выводим ZS-строку
lea dx,string_test <- вот сюда приходил адрес команды, вызвавшей исключение !!!


[ Это Сообщение было отредактировано Chingachguk в 2002-03-13 0136 ]
Аноним
Цитата:

On 2002-03-06 1518, mike wrote
Вот, начитался http//sasm.narod.ru и решил вспомнить молодость (http//www.codenet.ru/progr/os/intro.php).

Перешел в защищенный режим нормально, вот когда начал устанавливать прерывания начались траблы. 2-ые сутки борюсь. Видимо срабатывает исключение, почему и какое не могу понять.

Вообще может кто подскажет, как лучше отлаживать такого рода вещи ???

Листинг в следующем посте


Совет если только начинаешь работу с прерываниями, то положи в каждый неиспользуемый обработчик вызов процедуры, которая издает писк на динамике (в смысле не сама процедура). И будешь знать проблема в обработчики или в том что он ваще не вызывается.
Кстати полезная комбинация
cli
hlt
можно использовать чтобы комп сам не перезагружался, а то так бывает, при переходе на &quot;плохой адрес&quot;.

Аноним
Mike. Не верю, что ты не знал отличия iret (CF) от iretd (66CF). В первом случае проц восстанавливает flags и cs:ip, сохранённые им самим автоматически во время возникновения прерывания, используется в реальном режиме; во втором случае - eflags и cs:eip, используется в запрещённом режиме. Как видишь, если в PM после обработки прерыв. исполнить команду iret, в стеке останутся лишние байты, а проц прыгнет не в то место памяти для продолжения работы (т.к. eip>ip и eflags>flags)
Аноним
Я практически закончил написание 32-битной ОС чисто на TASM.
Если ты серьёзно, то помогу. Только если &quot;ради развлечения&quot; - не выйдет.
4
22 сентября 2002 года
mike
3.7K / / 01.10.2002
Да не, спасибо, не надо. Я ради развлечения, и уже развлекся. Спасибо за советы, все что я хотел у меня получилось.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог