Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Orgevm_Ekzamen.docx
Скачиваний:
3
Добавлен:
01.05.2025
Размер:
999 Кб
Скачать
☆
    1. Программирование кпдп вт37

Часть внутренних регистров ВТ37 имеют формат восемь бит, другая часть – 16 бит. Для того, чтобы по восьмиразрядной шине загрузить 16 разрядный регистр, требуется две передачи. Перед началом загрузки (или считывания) 16 битного регистра ВТ37, необходимо программным образом установить в ноль триггер «старший/младший», находящийся внутри ВТ37.

Системные адреса 0h, 2h, 4h и 6h выделены 16 разрядным регистрам адреса, соответственно канала 0, канала 1 и. т. д.

Системные адреса 1h, 3h, 5h и 7h присвоены счетчиком байт соответствующих каналов. По этим адресам загружаются размеры передаваемых блоков (число байт в блоке минус 1). Счетчики имеют формат 16 бит, но максимальный размер блока 214.

Все остальные регистры КПДП имеют формат 8 бит.

По адресу 8h загружается командное слово КПДП. Оно относится сразу ко всем каналам и имеет формат, показанный (в упрощенном виде!) на рис. 27.

Рис. 27

D1=1 – режим автофиксации при передаче «память –память».

=0 – нет режима автофиксации.

D0 =1 – режим «память – память».

=0 – нет режима «память – память».

По адресу 0bh производится настройка каналов на режимы работы. Настройка по этому адресу производится для каждого канала. Настроечное слово имеет формат, показанный на рис. 28.

Рис. 28

N1 и N0 задают двоичный номер канала.

D7 и D6 задают режим работы канала (00 – передача по требованию, 01 – одиночная передача, 10 – блоковая передача, 11 – каскадный режим).

D5 =1 – автодекремент адреса.

=0 – автоинкремент адреса.

D4 =1 – есть автоинициализация.

=0 – нет автоинициализации.

D3 и D2 задают направление передачи (01- из ВУ в ОП, 10 – из ОП в ВУ).

Передача любого байта по адресу 0ch, сбрасывает триггер старший/младший.

Передача любого байта по адресу 0dh вызывает программный сброс контроллера (аналогично действию сигнала RESET).

Передача любого байта по адресу 0eh демаскирует все каналы контроллера.

Вопрос №2

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

  1. Создать в памяти таблицы GDT и IDT.

  2. Запретить внешние прерывания, в том числе и по входу NMI (если последний в системе используется). Связано это с тем, что в процессе переключения есть временной интервал когда таблица векторов прерываний реального режима уже не действует, а таблица IDT ещё не действует. Если на этом интервале МП воспримет любое прерывание наступит крах системы.

  3. Перенастроить контроллеры прерываний на новые типы (номера) прерываний, с тем чтобы исключить конфликты между внутренними и внешними прерываниями. Собственно этот пункт не имеет никакого отношения к самому МП, а связан с особенностями функционирования IBM-подобных ПЭВМ. Когда фирма Intel выпустила МП 8086 она заняла под внутренние прерывания типы 0 - 4, но предупредила, что типы 5 -31 резервируются для внутренних прерываний будущих процессоров. По каким-то причинам (нам они не известны) фирма IBM это предупреждение проигнорировала и отвела типы 8 - 15 внешним прерываниям. В результате, например, тип 8 присвоен внешнему прерыванию от таймера (этот тип выдает на МП контроллер прерываний) и одновременно в 32 разрядных МП этот тип отведен особому случаю (внутреннему прерыванию) «двойная ошибка». Получается конфликт так как МП не знает какой обработчик он должен выполнять.

  4. Открыть линию А20 (если она была закрыта).

  5. Во внутренние регистры процессора gdtr и idtr загрузить начальные адреса и размеры таблиц GDT и IDT.

  6. Установить бит РЕ. С этого момента мы в защищенном режиме.

  7. Обычно первой командой в защищенном режиме ставится команда jmp far next (дальний переход на следующую команду программы). Команда очищает очередь команд от команд защищенного режима, а также заносит в видимую часть cs правильный селектор, по которому в дескрипторной таблице GDT отыскивается дескриптор сегмента кода. Далее этот дескриптор копируется в теневую часть cs. Очистка очереди команд нужна исходя из следующих соображений. Во всех рассматриваемых процессорах реализован конвейер команд. То есть в любой момент времени внутри процессора обрабатывается сразу несколько команд, находящихся на разных стадиях выполнения. Отсюда при переключении режимов возникает ситуация когда с конвейера еще сходят команды одного режима, а на конвейер уже поступают команды другого режима. Поскольку в разных режимах одни и те же команды выполняются по разному, такая ситуация иногда может приводить к различным коллизиям. Использование команды jmp снимает эту проблему. Начиная с Pentium использование команды jmp, для рассмотренной выше цели, необязательно, поскольку команды, меняющие содержимое регистров управления cr0-cr4, гарантируют, что все команды, идущие перед ними, будут завершены (так называемые «сериалайзд» команды – serialized instruction).

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

Не следует считать что все эти пункты всегда обязательны к исполнению, Это только общая схема действий, причем подразумевающая что мы переключаемся в защищенный режим «всерьёз и надолго». Если же требуется только «нырнуть» в защищенный режим и тут же вернуться обратно многие пункты можно исключить. В частности можно не создавать IDT, не загружать IDTR, и вообще не выполнять пункты 3,4 и 7.

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