Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.14.142.115] |
|
Сообщ.
#1
,
|
|
|
Реальный и защищенный режимы работы процессора Главным недостатком работы процессора в реальном режиме (он устанавливается с момента запуска процессора, и в нем работает ДОС) является то, что любое приложение может нарушить работу системы. Чтобы избежать этого был придуман защищенный (начиная с i80386). Прим.: вообще говоря, с i80286, но с весьма ограниченных набором возможностей. Главным образом защищается память. Модель памяти защищенного режима В реальном режиме физический адрес формируется - seg:offset -> (seg<<4)+offset. И доступен только первый мегабайт (0ffff0h+0ffffh). В защищенном режиме физический адрес формируется немного сложнее. Теперь логический адрес определяется селектором (в сегментном регистре) : смещением. Формат селектора: +15----------------+-2+1-0+ |Индекс дескриптора|TI|RPL| +------------------+--+---+ Таблицы дескрипторов представляют собой массив структур дескрипторов. Причем первый дескриптор в GDT не используется, должен быть пустым. Дескриптор: Байты: 7 6 5 4 3 2 1 0 +-----------+----------+----------+---------------+--------------+ | База сег. | Атрибуты | Атрибуты | База сегмента | Граница | | (биты | 2 | 1 | (биты 0..23) | сегмента | | 24..31) | | | | (биты 0..15) | +-----------+----------+----------+---------------+--------------+ / \ / \ Атрибуты 2 Атрибуты 1 +7+6+5+4+-3------0-+ +7+6+5+4+3---0+ | |D| |A| Граница | | | | | | |G|/|0|V| сегмента | |P|DPL|S| Тип | | |B| |L| (16..19) | | | | | | +-+-+-+-+----------+ +-+---+-+-----+ В TASM это обычно описывается структурой: GdtDescr struc limit dw ? base_low dw ? base_mid db ? attr1 db ? attr2 db ? base_high db ? GdtDescr ends Итак. Когда рассмотрели структуры данных защищенного режима, пора определить, как формируется физический адрес из sel:offset. В селекторе (он хранится в сегментном регистре) берется индекс дескриптора. По этому индексу ищется дескриптор в таблице GDT или LDT (в зависимости от бита TI). Проверяется, есть ли этот сегмент в памяти, CPL (Current Privilege Level - определяется полем RPL у cs) <= DPL (это будет рассмотрено отдельно), проверяется выход за границу, на исполнение, запись или чтение, в случае неудачи вызывается исключение. Далее берется база. База + offset = линейный адрес. При отключенной страничной адресации это и будет физическим адресом. Адрес GDT и LDT определяется регистрами соответственно GDTR и LDTR. Их структура: GDTR: +-47------------------16-+-15----0-+ | Линейный базовый адрес | Граница | +------------------------+---------+ Для лучшей производительности таблица должна быть выровнена на 8 байт. LDTR: +-15-----0-+ | Селектор | +----------+ Загрузка их осуществляется командами: Основные правила защиты по привилегиям: Уровни привилегий часто именуют кольцами защиты. Изменяются от 0 (самый высокий уровень привилегий) до 3 (наименьшие привилегии). Прерывания и исключения в защищенном режиме Обработчики прерываний и исключений определяются таблицей дескрипторов прерываний (IDT). Дескриптор шлюза (дескриптор из IDT) имеет структуру: Байты 7 6 5 4 3 2 1 0 +---------------+----------+----------+----------+--------------+ | Смещение | Атрибуты | Атрибуты | Селектор | Смещение | | (биты 16..31) | 2 | 1 | | (биты 0..15) | +---------------+----------+----------+----------+--------------+ / \ / \ Атрибуты 2 Атрибуты 1 +7+6-5+4+3---0+ +7+6+5+4-----0+ | | | | | | | | | Word | |P|DPL|0| Тип | |0|0|0| count | | | | | | | | | | | +-+---+-+-----+ +-+-+-+-------+ В TASM это обычно описывается структурой: IdtDescr struc l_off dw ? sel dw ? res db ? attr db ? h_offs dw ? IdtDescr ends Расположение IDT определяется регистром IDTR. Таблица может содержать до 256 прерываний, и минимальный размер 256 байт (32 дескриптора). Обязательные 32 входа в IDT - исключения: +------+-----------------------------------------------------------+-------------+-----------+ | No | Исключение | Обозначение | Тип | +------+-----------------------------------------------------------+-------------+-----------+ | 0 | Деление на 0 | #DE | F | | 1 | Исключение отладки (трассировка) | #DB | F/T | | 2 | Немаскируемое прерывание | - | Interrupt | | 3 | Исключение отладки | #BP | T | | 4 | Исключение по переполнению (into) | #OF | T | | 5 | Прерывание по контролю диапазона (bound) | #BR | F | | 6 | Недопустимый код операции | #UD | F | | 7 | Сопроцессор недоступен или переключилась задача | #NM | F | | 8 | Двойной отказ | #DF | A,EC=0 | | 9 | Нарушение границы сегмента сопроцессором (только 386/387) | | F | | 10 | Недоступный сегмент состояния задачи (TSS) | #TS | F,EC | | 11 | Сегмент отсутствует | #NP | F,EC | | 12 | Ошибка сегмента стека | #SS | F,EC | | 13 | Общее нарушение защиты | #GP | F,EC | | 14 | Ошибка страницы | #PF | F,EC | | 15 | Зарезервировано | | | | 16 | Исключение сопроцессора | #MF | F | | 17 | Контроль выравнивания(486+) | #AC | F,EC=0 | | 18 | Машинный контроль(P5+) | #MC | A,EC | | 19 | Исключение SIMD(XMM) | #XF | F | |20..31| Зарезервировано | | | +------+-----------------------------------------------------------+-------------+-----------+ Формат кода ошибки (у ошибки страницы имеет другой формат): +31--------16+15----3+-2+-1-+-0-+ | Резерв (0) | Index |TI|IDT|EXT| +------------+-------+--+---+---+ Cтек в обработчике прерывания: +------------+ <-ESP в обработчике. | Код ошибки | - если требуется +------------+ | EIP | +------------+ | CS | +------------+ | EFLAGS | +------------+ | ESP | - только при смене привилегий +------------+ | SS | - только при смене привилегий +------------+ <- ESP до вызова Переход в защищенный режим Системный регистр CR0: 31 30 18 16 0 +-+-+-+-------+-+-+-+-------+-+-+-+-+-+-+ |P|C|N| |A| |W| |N|E|T|E|M|P| |G|D|W| |M| |P| |E|T|S|M|P|E| +-+-+-+-------+-+-+-+-------+-+-+-+-+-+-+ | | | | | | | | | | | | | | | | | | | | | +-- Protection Enable | | | | | | | | | +---- Monitor Processor Extension | | | | | | | | +------ Processor Extension Emulated | | | | | | | +-------- Task Switch | | | | | | +---------- Extension Type | | | | | +------------ Numeric Error | | | | +--------------------- Write Protect | | | +------------------------- Alignment Mask | | +----------------------------------- Not WriteThrough | +------------------------------------- Cache Disable +--------------------------------------- Paging Enable Для работы с ним (только младшие 16 бит) в 80286 предназначались команды lmsw и smsw. В новых процессорах можно работать с ним, используя mov (это более предпочтительно). Для того чтобы перейти в защищенный режим, надо выполнить несколько действий: Переключение в реальный режим: Прим.: он же "режим реальных адресов" (real-address mode) - так даже правильнее, но длиннее . Примечание. Если при возврате не изменить сегментные регистры, то получается "нереальный" режим, в котором через эти регистры можно обращаться к памяти > 1Mb (как в защищенном режиме). Прим.: UnReal Mode, он же BigReal Mode, он же Flat Real Mode. Использованная литература [1] "Intel Architecture Software Developer's Manual. Volume 3. System Programming". |