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

Ваш аккаунт

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

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

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

Прерывания в защищенном режиме

511
08 ноября 2002 года
AntonI/O
29 / / 20.08.2000
Люди, как использовать программные прерывания в защ. режиме. К примеру 13h
Сначало я добовлял в GDT адрес 13h.
Потом в IDT указывал соответс. селектор и в атрибутах ставил шлюз задач.
Вобщем он вадает типи ошибка защиты памяти. Помогите кто знает.
395
10 ноября 2002 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by AntonI/O
Люди, как использовать программные прерывания в защ. режиме. К примеру 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 битном сегменте, так что не забудь указать это в своем исходнике.

Надеюсь я ничего не напутал, хотя может...

511
10 ноября 2002 года
AntonI/O
29 / / 20.08.2000
А сразу из защ. режима нельзя вызывать прерывания к примету 21h или 13h и т.д.
395
10 ноября 2002 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by AntonI/O
А сразу из защ. режима нельзя вызывать прерывания к примету 21h или 13h и т.д.



Я говорю, что только в режиме V86 (если тебе нужен защищенный режим). А если из чисто защищенного режима то не получится.

Все обработчики прерываний биоса и доса НАПИСАНЫ ДЛЯ РЕАЛЬНОГО РЕЖИМА (конечно есть например функции VESA через int 10h, которые возвращают точки входа на функции защищенного режима, но сама то int 10h все равно для реального режима)

Щас попробую объяснить.
Например, в обработчике встретился такой набор инструкций:

push ds
mov ax,0A000h
mov ds,ax

Если мы будем в защищенном режиме, то это будет означать загрузку селектора, которого либо вообще может не быть, либо он указывает неизвестно куда; а не сегмента видеопамяти. Понимаешь? Отсюда и получатся исключения общей защиты и т.д. Плюс не надо забывать что для защищенного режима int 01-1Ah используются для исключений!

511
11 ноября 2002 года
AntonI/O
29 / / 20.08.2000
Спасибо, а то до меня доходит как до дерева.
Ладно все понял.
Еще раз спасибо!
3.0K
05 декабря 2002 года
ANIPAL
1 / / 05.12.2002
Цитата:
Originally posted by AntonI/O

Я написал прогу: загружает файл кода в [0:0]
а данных в [1000:0000].
Есть обработка прерываний и кабота с клавой и др.
Проект может перерасти в свою ОС. Остается лишь добавлять поддержку оборудования. Прошу высказать свое мнение на мой EMl [email]ANIPAL@mail.ru[/email]

395
05 декабря 2002 года
RelB
367 / / 09.11.2002
Ну ты крут :). Думаешь, добавишь поддержку оборудования и все? Это лишь такая мелочь из всей ОС, что надо подумать сначало о архитектуре самой оси! А если идти по пути - сначало поддерку устройств, а уж потом остальное, то перерастет это все во что-то типа MenuetOS.
2.3K
06 декабря 2002 года
Mystic
17 / / 25.11.2002
Цитата:
Originally posted by RelB
Прерывания эти работают только в реальном режиме, либо в режиме V86.



Есть еще нереальный режим, из него тоже можно вызвать прерывания BIOS.



Я тут новичок, где можно найти исходники проекта, который может перасти в OS? Сам недавно написал загрузчик PE-Файла (специально составленной DLL) с дискеты.

395
06 декабря 2002 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by Mystic


Есть еще нереальный режим, из него тоже можно вызвать прерывания BIOS.



А вот и нельзя. При дальнем переходе происходит сброс теневой части регистра cs и вернешся ты из обработчика неизвестно куда.

И еще я тут вычитал, что надо еще перед вызовом и IDTR установить на векторную таблицу реальных адресов.

2.3K
07 декабря 2002 года
Mystic
17 / / 25.11.2002
Фактически, чтобы переключиться в реальный режим, необходимо:

Процессор возвращается в режим реальных адресов, если программное
обеспечение очистит бит 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
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог