Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчет / Лаба.docx
Скачиваний:
21
Добавлен:
15.09.2014
Размер:
37.06 Кб
Скачать

1. Постановка задачи

Написать программу, которая выполняет следующие действия:

1. Переход из реального режима в защищенный.

2. Перехватывает заданное аппаратное прерывание (от таймера/от часов реального времени/от клавиатуры), в обработчике которого выполняет определенные действия.

3. По наступлению определенного события выполняет обратный переход из защищенного режима в реальный и завершает свою работу.

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

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

При выполнении данной лабораторной работы должны быть соблюдены следующие условия:

После завершения работы программы компьютер должен продолжать корректно функционировать. Зависания, перезагрузки и другие аналогичные «события» недопустимы.

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

2. Алгоритм решение

Чтобы полноценно перейти в защищенный режим с минимальными настройками, нужно выполнить следующие действия:

1. Проверить, возможно ли переключиться в защищенный режим;

Для проверки того, что мы действительно находимся в реальном режиме,

следует выполнить следующие операции:

1. проверить нулевой бит регистра CR0;

Читаем регистр CR0 и проверяем нулевой бита регистра ЕАХ, АХ или AL. Если бит не установлен, то мы находимся в реальном режиме. В противном случае дальнейшее выполнение программы становится бессмысленным.

2. убедиться, что не загружена операционная система Windows.

Вызываем функцию 1600h прерывания 2fh. Эта функция позволяет получить текущую версию операционной системы Windows. Если после вызова функции в регистре AL содержится ноль, то операционная система не загружена. В противном случае, опять же, нашей программе бессмысленно продолжать какие-либо дальнейшие действия.

2. Инициализировать таблицы дескрипторов;

3. запретить прерывания (как маскируемые, так и не маскируемые);

Чтобы запретить маскируемые прерывания, надо сбросить флаг IF регистра EFLAGS <\-командой cli, разрешение же прерываний выполняется командой sti. Немаскируемые / прерывания запрещаются изменением седьмого бита порта 70h: если бит установлен, то прерывания запрещены, если бит сброшен - прерывания могут выполняться.

4. открыть линию А20;

Для полноценного функционирования 32-разрядного приложения линия А20 обязательно должна быть открыта. Осуществляется это установкой бита 1 порта 92h, закрытие линии А20 - сброс этого бита.

5. загрузить регистры управления памятью;

6. установить нулевой бит (далее он будет называться РЕ) регистра CR0;

7. выполнить переход на 32-битный сегмент кода, переопределив регистр CS.

Первой командой после перехода в защищенный режим должна быть команда дальнего перехода (far jump), в которой будет указан селектор дескриптора сегмента кода и смещение в этом сегменте. Команда дальнего перехода обязательно очистит конвейер процессора и заставит его обратится к таблице GDT, выбрать оттуда дескриптор, селектор которого указан в адресе команды и начать выборку команд со смещения, также указанного в этом адресе.

Для того, чтобы определить прерывания в защищенном режиме, нужно выполнить следующие действия:

1. Перенаправить аппаратные прерывания (IRQ)

2. Создать дескрипторы для всех используемых векторов (исключений, аппаратных и программных прерываний).

3. Подготовить образ IDTR и загрузить его в регистр IDTR.

4. Разрешить прерывания

Соседние файлы в папке Отчет