Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Shpory_Sp_(1)

.pdf
Скачиваний:
8
Добавлен:
08.03.2016
Размер:
1 Mб
Скачать

или так mov eax,cr0 btr eax,0 mov cr0,eax

Для корректного перехода из P-Mode в R-Mode необходимо подготовить процессор следующим образом:

1.Запретить прерывания (CLI).

2.Передать управление в читаемый сегмент кода, имеющий предел в 64Кб (FFFFh).

3.Загрузить в SS, DS, ES, FS и GS селекторы дескрипторов, имеющих следующие параметры: Предел = 64 Кб (FFFFh)

Байтная гранулярность (G = 0) Расширяется вверх (E = 0) Записываемый (W = 1) Присутствующий (P = 1) Базовый адрес = любое значение

Сегментные регистры должны быть загружены ненулевыми селекторами. Те сегментные регистры, в которые не будут загружены описанные выше значения, будут использоваться с атрибутами, установленными в защищѐнном режиме.

4.Сбросить флаг PE в CR0.

5.Выполнить команду far jmp на программу режима реальных адресов.

6.Загрузить в регистры SS, DS, ES, FS и GS необходимые значения или 0.

7.Разрешить прерывания (STI).

29. Виклик через кільця захисту. Шлюзи виклику.

Защита требует наложения на обычные программы (не входящие в операционную систему) трех типов ограничений:

1)обычным программам запрещается выполнять некоторые команды.

2)обычным программам должны быть недоступны определенные сегменты, доступные операционной системе;

3)должно быть невозможным получение привилегии операционной системы кроме как входом в нее в разрешенной точке входа.Рассмотрим, например, защиту средств управления памятью. Пределы сегментов соотносят задачу с теми сегментами, для которых она имеет дескрипторы. Эти дескрипторы находятся в GDT и в LDT задачи.

Если дескрипторы в GDT и LDT считаются "безопасными", то для нарушения защиты задача должна образовать другие дескрипторы. Один из способов заключается в использовании команды LGDT для загрузки регистра GDT и изменения базы GDT на ту область памяти, в которую задача может записывать. Следовательно, обычным программам необходимо запретить пользоваться командой LGDT. Для доказательства необходимости ограничения 2 замечаем, что операционная система должна иметь доступ к таблице GDT с правом записи, чтобы создавать дескриптор таблицы LDT для новых задач.

Но мы только что видели, что обычным программам необходимо запретить запись в GDT. Для удовлетворения ограничения 2 можно использовать изолирование задач. Обслуживания операционной системы реализуются как отдельные задачи, в которых дескрипторы всех "чувствительных" сегментов (например, записываемый сегмент, содержащий таблицу GDT) находятся только в таблице LDT задачи обслуживания. Пользовательские программы могут запросить обслуживание операционной системы путем переключения задач.

Но у такого подхода имеются следующие недостатки:

1 . Хотя переключение задач в процессоре 80286 реализуется относительно быстро, на него все же уходит времени в семь раз больше, чем на вызов.

2.При переключении задач трудно передавать параметры. Например, виртуальные адреса, содержащие селекторы LDT, имеют различное отображение в задачах с разными LDT.

3.Процедуры обработки особых случаев часто требуют доступа к адресному пространству задачи, вызвавшей особый случай, чтобы установить его причину. Доступ оказывается затрудненным, если процедуре обработки особого случая требуется своя LDT

Конкретная ОС необязательно должна поддерживать все 4 уровня привилегий. В Windows NT используются только два уровня привилегий: нулевое и третье кольцо. В нулевом кольце работает ядро системы и системные драйверы, а в третьем - все запущенные приложения. Привилегированные команды и ввод-ввод для третьего кольца запрещены. Для взаимодействия с аппаратной частью компьютера пользовательские программы вызывают системные сервисы ядра ОС, обращение к которым оформлено как шлюзы. При вызове такого шлюза процесс переходит в нулевое кольцо, и там ядро ОС и драйверы обрабатывают запрос и возвращают результаты приложению. После перехода в нулевое кольцо приложение не может как-либо контролировать свое исполнение, пока управление не будет возвращено коду третьего кольца. Это является необходимым условием защиты, обеспечивающим безопасность всей системы.

14. Програмна генерація внутрішніх переривань

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

Особые ситуации, генерируемые процессором подразделяются на три типа — ошибки, ловушки и сбои. В зависимости от типа особой ситуации различается реакция процессора на ее возникновение.

Ошибка — это особая ситуация, которая может быть исправлена обработчиком особой ситуации. При встрече ошибки состояние процессора сохраняется в том виде, каким оно было до начала выполнения команды, инициировавшей генерацию ошибки, а значения CS:EIP, указывающие на эту команду сохраняются в стеке обработчика. Прерванная программа после исправления ошибки может быть продолжена непосредственно с команды, вызвавшей эту ошибку.

Ловушка — особая ситуация, которая генерируется после выполнения соответствующей команды. В этом случае сохраняемые в стеке значения CS:EIP, указывают на команду, которая будет выполняться вслед за командой, вызвавшей ловушку; например, если ловушка произошла во время команды JMP, то сохраненные значения CS:EIP указывают на команду, являвшуюся целью команды JMP.

Сбой — это особая ситуация, которая не допускает точную локализацию вызвавшей ее команды и не допускает перезапуска. Сбои используются для сообщений о некоторых ошибках, таких как: технические неисправности и наличие некорректных значений в системных таблицах.

17. Розробка обробників переривань реального режиму за каскадним принципом (наприклад, переривання 09h)

Прерывание 09h - Это аппаратно генерируемое прерывание (IRQ 1) выполняется при каждом нажатии и отпускании клавиши. код ROM-BIOS интерпретирует это, сохраняя значения в буфере клавиатуры по адресу 0:041e. Он также обрабатывает специальные случаи клавиш PrtSc и SysReq, и отслеживает состояние клавиш Shift и различных Lock.

Один контроллер 8259A способен обслуживать прерывания от 8 источников. Для обслуживания большего количества устройств используется каскадное включение контроллеров.

Рис. Каскадное включение контроллеров прерываний

Контроллер прерываний 8259A представляет собой устройство, реализующее до восьми уровней запросов на прерывания, с возможностью программного маскирования и изменения порядка обслуживания прерываний.

26. Програмна модель мікропроцесорів х86 для захищенного режиму (protected mode)

Архитектура защищенного режима принципиально отличается от архитектуры реального режима. Программно эти режимы не совместимы в силу различных механизмов управления памятью. Защищенный режим и все принципы работы процессора в этом режиме разрабатывались с целью возможности мультизадачного выполнения программ.

Регистры общего назначения.

Регистры указатели сегментов памяти.

FS, GS – регистры дополнительных сегментов данных

Флаги ID, VIP, VIF, AC, VM, RF, NT, IOPL используются операционной системой только в защищенном режиме.

Системные регистры.

Используются при управлении памятью и переключении задач. К ним относятся:

Регистр адреса глобальной дескрипторной таблицы (GDT)

Регистр адреса таблицы дескрипторов прерываний (IDT)

Регистр – селектор сегмента локальной дескрипторной таблицы (LDT)

Регистр – селектор сегмента состояния задачи (TSS)

38. Обчислення та завантаження в режимі Real Mode лінійної адреси сегмента в дескриптор цього сегмента для режиму Protected Mode

Формирование линейного адреса в защищенном режиме Значения, помещаемые в сегментные регистры, называются селекторами. Селектор содержит

индекс дескриптора, определяющий номер записи в дескрипторной таблице, бит TI, указывающий, к какой дескрипторной таблице производится обращение LDT (TI = 1) или GDT (TI = 0), а также запрашиваемые права доступа к сегменту - RPL.

По указанному в селекторе номеру записи в соответствующей (бит TI селектора) дескрипторной таблице определяется дескриптор сегмента.

Дескриптор - это 8-байтная единица описательной информации, распознаваемая устройством управления памятью в защищенном режиме, хранящаяся в дескрипторной таблице. Дескриптор сегмента содержит базовый адрес описываемого сегмента, предел (размер) сегмента и права доступа к сегменту. В защищенном режиме сегменты могут начинаться с

любого линейного адреса. Для определения физического адреса базовый адрес сегмента суммируется со смещением.

Существуют две обязательных дескрипторных таблицы - глобальная (GDT) и дескрипторная таблица прерывания (IDT), - а также множество (до 8192) локальных дескрипторных таблиц (LDT), из которых в одинединый момент времени процессору доступна только одна.

Расположение дескрипторных таблиц определяется регистрами процессора GDTR, IDTR,

LDTR.

Регистры GDTR и IDTR - содержат базовый адрес и предел дескрипторной таблицы. Программно доступная часть регистра LDTR - 16 бит, которые являются селектором LDT. Дескрипторы LDT находятся в GDT. Однако, чтобы не обращаться каждый раз к GDT, в процессоре имеется теневая (программно недоступная) часть регистра LDTR, в которую процессор помещает дескриптор LDT при каждой перегрузке селектора в регистре LDTR. Чтобы перейти в protected mode, нужно:

-Создать Global Descriptor Table (GDT),

-создать Interrupt Descriptor Table (IDT), -запретить прерывания,

-загрузить в GDTR указатель на GDT,

-загрузить в IDTR указатель на IDT,

-установить бит PE в регистре MSW,

-сделать т.н. far jump (загрузка CS плюс IP/EIP) (в CS загрузить адрес кодового сегмента), -загрузить регистры DS и SS соответственно data/stack segment selector,

-проинитить pmode stack, - разрешаем interrupts.

Чтобы вернуться назад в Real Mode, нужно: -запретить прерывания,

-делаем far jump в 16-битный кодовый сегмент , -грузим SS 16-битным селектором data/stack segment, -обнуляем PE bit,

-делаем far jump в real-mode адрес,

-грузим DS, ES, FS, GS, SS real-mode-значениями,

- устанавливаем IDTR real-mode значение (base 0, limit 0xFFFF), -включаем прерывания.

Перед выполнением кода в real mode, CS и SS нужно загрузить селекторы, которые указывают на дескрипторы , которые поддерживают "real mode".

18. Розробка нових обробників переривань реального режиму (переривання 1Ch)

Обработка прерывания в реальном режиме

производится в три этапа:

1) прекращение выполнения текущей программы; Должно произойти так, чтобы потом вернуться и продолжить работу. Для этого

необходимо сохранить содержимое регистров, так как они являются ресурсами, разделяемыми между программами.

Эти регистры сохраняются микропроцессором автоматически. Наиболее удобным местом хранения регистров является стек.

2) переход к выполнению и выполнение программы обработки прерывания; Здесь определяется источник прерывания и вызывается соответствующий обработчик прерывания.

В реальном режиме микропроцессора допускается 256 источников - по кол-ву элементов таблицы векторов прерываний.

3) возврат управления прерванной программе.

Необходимо привести стек в состояние, в котором он был сразу после передачи управления данной процедуре.

В реальном режиме диапазон номеров для обработки аппаратных прерываний находился: IRQ0¸IRQ7 номера прерываний 08h¸0Fh и IRQ8¸IRQ15 – 70h¸77h. В связи с тем, что первые

32 номера заняты под исключения, возникает необходимость перепрограммировать контроллер прерываний на другие номера. Изначальным программирование контроллера для реального режима занимается BIOS. Итого в защищенном режиме остается 208 номеров под программные прерывания.

IRQ0 (INT 8) — прерывание системного таймера. Это прерывание вызывается 18,2 раза в секунду. Стандартный обработчик этого прерывания вызывает INT 1Ch при каждом вызове, так что, если программе необходимо только регулярно получать управление, а не перепрограммировать таймер, рекомендуется использовать прерывание 1Ch.

Самые полезные для программ аппаратные прерывания — прерывания системного таймера и клавиатуры. Так как их стандартные обработчики выполняют множество функций, от которых зависит работа системы, их нельзя заменять полностью.

Посмотрим, как работает перехват прерывания от таймера на следующем примере:

;timer.asm

;демонстрация перехвата прерывания системного таймера: вывод текущего времени

;в левом углу экрана

.model

tiny

 

.code

 

 

.186

 

; для pusha/popa и сдвигов

org

100h

 

start proc

near

 

; сохранить адрес предыдущего обработчика прерывания 1Ch

mov

ax,351Ch

; АН = 35h, AL = номер прерывания

int

21h

; функция DOS: определить адрес обработчика

mov

word ptr old_int1Ch,bx ; прерывания

mov

word ptr old_int1Ch+2,es ; (возвращается в ES:BX)

; установить наш обработчик

mov

ax,251Ch

; АН = 25h, AL = номер прерывания

mov

dx,offset int1Ch_handler ; DS:DX - адрес обработчика

int

21h

; установить обработчик прерывания 1Ch

; здесь размещается собственно программа, например вызов command.com

mov

ah,1

 

int

21h

; ожидание нажатия на любую клавишу

; конец программы

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]