Прерывания в защищенном режиме
Сначало я добовлял в GDT адрес 13h.
Потом в IDT указывал соответс. селектор и в атрибутах ставил шлюз задач.
Вобщем он вадает типи ошибка защиты памяти. Помогите кто знает.
Люди, как использовать программные прерывания в защ. режиме. К примеру 13h
Сначало я добовлял в GDT адрес 13h.
Потом в IDT указывал соответс. селектор и в атрибутах ставил шлюз задач.
Вобщем он вадает типи ошибка защиты памяти. Помогите кто знает.
Что значит программные? BIOS?
Если используешь BIOS прерывания можно делать следующее.
Прерывания эти работают только в реальном режиме, либо в режиме V86. Если не хочешь париться с V86, можно сделать так
.
. ;вычисляешь адрес StartInt для реалного режима
. ; сегмент:смещение
;далее выходим из защищенного режима
mov eax,cr0
and al,11111110b
mov cr0,eax
;и делаем переход, забыл я уже все...
db 66h ;префикс разрядности операнда,
;если конечно твой текущий сегмент 32битный
db 0EAh ;jmp far
dw offset StartInt; смещение в сегменте
dw ?; ? - значение сегмента, в котором наша метка
.
.
.
StartInt:
. ;не забудь ввести параметры
.
int 13h
. ;обработка результатов и переход в защищенный
. ;режим
Не забудь, что метка StartInt должна быть в 16 битном сегменте, так что не забудь указать это в своем исходнике.
Надеюсь я ничего не напутал, хотя может...
А сразу из защ. режима нельзя вызывать прерывания к примету 21h или 13h и т.д.
Я говорю, что только в режиме V86 (если тебе нужен защищенный режим). А если из чисто защищенного режима то не получится.
Все обработчики прерываний биоса и доса НАПИСАНЫ ДЛЯ РЕАЛЬНОГО РЕЖИМА (конечно есть например функции VESA через int 10h, которые возвращают точки входа на функции защищенного режима, но сама то int 10h все равно для реального режима)
Щас попробую объяснить.
Например, в обработчике встретился такой набор инструкций:
push ds
mov ax,0A000h
mov ds,ax
Если мы будем в защищенном режиме, то это будет означать загрузку селектора, которого либо вообще может не быть, либо он указывает неизвестно куда; а не сегмента видеопамяти. Понимаешь? Отсюда и получатся исключения общей защиты и т.д. Плюс не надо забывать что для защищенного режима int 01-1Ah используются для исключений!
Ладно все понял.
Еще раз спасибо!
Я написал прогу: загружает файл кода в [0:0]
а данных в [1000:0000].
Есть обработка прерываний и кабота с клавой и др.
Проект может перерасти в свою ОС. Остается лишь добавлять поддержку оборудования. Прошу высказать свое мнение на мой EMl [email]ANIPAL@mail.ru[/email]
Прерывания эти работают только в реальном режиме, либо в режиме V86.
Есть еще нереальный режим, из него тоже можно вызвать прерывания BIOS.
Я тут новичок, где можно найти исходники проекта, который может перасти в OS? Сам недавно написал загрузчик PE-Файла (специально составленной DLL) с дискеты.
Есть еще нереальный режим, из него тоже можно вызвать прерывания BIOS.
А вот и нельзя. При дальнем переходе происходит сброс теневой части регистра cs и вернешся ты из обработчика неизвестно куда.
И еще я тут вычитал, что надо еще перед вызовом и IDTR установить на векторную таблицу реальных адресов.
Процессор возвращается в режим реальных адресов, если программное
обеспечение очистит бит P E(включение защиты) в регистре
CR0 командой MOV в CR0 (для совместимости с процессором 80286
бит PE можно устанавливать с помощью команды LMSW, но нельзя очищать).
Процедура возвращения в режим реальных адресов должна сделать
нижеследующее:
1. Если включено разбиение на страницы выполняется следующее:
- Передать управление линейным адресам, которые имеют тождественное
отображение, т.е. линейные адреса эквивалентны физическим.
- Очистить бит PG в регистре CR0.
- Заполнить нулями регистр CR0 для подавления TLB.
2. Передать управление сегменту с границей 64К (0FFFFH). Это загрузит
регистр CS с требуемой для реального режима границей.
3. Загрузить в сегментные регистры SS, DS, ES, FS, и GS селектор
дескриптора, содержащего соответствующие реальному режиму значения:
- Граница = 64К (0FFFFH)
- Байтовая дробность (G = 0)
- Расширение вверх (E = 0)
- Доступ для записи (W = 1)
- Присутствие (P = 1)
- База = любое значение
Необходимо заметить, что если регистры сегмента не будут
перезагружены выполнение продолжится, используя дескрипторы,
загруженные при нахождении в защищенном режиме.
4. Запретить прерывания. Командой CLI запрещаются прерывания
INTR. Прерывания NMI можно запретить с внешней электрической
цепи.
5. Очистить бит PE в регистре CR0.
6. Перейти на программу реального режима используя команды
дальнего перехода (far JMP). Это очищает очередь команд и
устанавливает правильные значения прав доступа в регистр CS.
7. Используя команду LIDT загрузить базу и границу таблицы векторов
прерывания реального режима.
8. Разрешить прерывания.
9. Загрузить сегментные регистры в соответствии с требованиями
программы реального режима.
(C) Справочник по i486