В работе ПДП различаются 2 основных цикла: цикл ожидания (Idle cycle) и активный цикл (Active cycle). Каждый цикл подразделяется на ряд состояний, занимающих по времени один период часов (тик). Из цикла ожидания контроллер может быть переведен в состояние программирования (Program Condition) путем подачи на вход RESET сигнала высокого уровня, длительностью не менее 300 нc и следующей за ним подачи сигнала низкого уровня (уровня 0) на вывод CS (Chip Select). В состоянии программирования контроллер будет находится до тех пор, пока на выводе CS сохранится сигнал низкого уровня.
В процессе программирования контроллеру задаются три параметра:
- начальный адрес памяти для обмена;
- уменьшенное на единицу число передаваемых байтов;
- направление обмена.
Кроме того, устанавливаются требуемые режимы работы (разрешить или запретить циклическое изменение приоритетов, автоинициализацию, задать направление изменения адреса при обмене и т. д.).
Загрузка 16-разрядных регистров контроллера осуществляется через 8-разрядные порты ввода-вывода. Перед загрузкой первого (младшего) байта должен быть сброшен (очищен) триггер-защелка (триггер первый/последний, First/Last flip-flop), который изменяет свое состояние после вывода в порт первого байта и таким образом дает возможность следующей командой вывода в тот же порт загрузить старший байт соответствующего регистра. Запрограммированный канал должен быть демаскирован (бит маски канала устанавливается при этом в 0), после чего он может принимать сигналы "Запрос на ПДП", генерируемые тем внешним устройством, которое обслуживается через этот канал. Сигнал "Запрос на ПДП" может быть также инициирован установкой в 1 бита запроса данного канала в регистре запросов контроллера. После появления сигнала запроса контроллер входит в активный цикл, в котором выполняется обмен данными.
Передача данных может осуществляться в одном из четырех режимов:
Режим одиночной передачи (Signle Transfer Mode). После каждого цикла передачи контроллер освобождает шину процессору, но сразу же начинает проверку сигналов запроса и, как только обнаруживает активный сигнал запроса, инициирует следующий цикл передачи.
Режим блочной передачи (Block Transfer Mode). В этом режиме наличие сигнала запроса требуется только до момента выдачи контроллером сигнала "Подтверждение запроса на ПДП" (DACK), после чего шина не освобождается вплоть до завершения передачи всего блока.
Режим передачи по требованию (Demand Transfer Mode). Данный режим является промежуточным между двумя первыми: передача идет непрерывно до тех пор, пока активен сигнал запроса, состояние которого проверяется после каждого цикла передачи. Как только устройство не может продолжить передачу, сигнал запроса сбрасывается им и контроллер приостанавливает работу. Этот режим применяется для обмена с медленными устройствами, не позволяющими по своим временным характеристикам работать с ПДП в режиме блочной передачи.
Каскадный режим (Cascade Mode). Режим позволяет включить в подсистему ПДП более одного контроллера в тех случаях, когда недостаточно четырех каналов ПДП. В этом режиме один из каналов ведущего контроллера используется для каскадирования с контроллером второго уровня. Для работы в каскаде сигнал HRQ ("Запрос на захват") ведомого контроллера подается на вход DREG ("Запрос на канал ПДП") ведущего, а сигнал DACK ("Подтверждение запроса") ведущего подается на вход HDLA ("Потверждение захвата") ведомого. Такая схема подключения аналогична подключению ведущего (первого) контроллера к микропроцессору, с которым он обменивается сигналами HRQ и HDLA.
Типы передач.
1. Передача память-память (Memory-to-memory). Используется для передачи блока данных из одного места памяти в другое. Исходный адрес определяется в регистрах нулевого канала, выходной - в регистрах первого канала. Число циклов обмена (число байт минус 1) задается в регистре числа циклов канала 1. Передача происходит с использованием рабочего регистра контроллера в качестве промежуточного звена для хранения информации. При передачe память-память может быть задан специальный режим фиксации адреса (Address hold), при котором значение текущего адреса в регистре нулевого канала не изменяется, при этом весь выходной блок памяти заполняется одним и тем же элементом данных, находящимся по заданному адресу.
2. Автоинициализация (Autoinitialization). После завершения обычной передачи использованный канал ПДП маскируется и должен быть перепрограммирован для дальнейшей работы с ним. При автоинициализации маскировка канала после окончания передачи не происходит, а регистры текущего адреса и счетчик циклов автоматически загружаются из соответствующих регистров с начальными значениями. Таким образом для продолжения (повторения) обмена достаточно выставить сигнал запроса на ПДП по данному каналу.
3. Режим фиксированных приоритетов. В этом режиме канал 0 всегда имеет максимальный приоритет, а канал 3 - минимальный. Это означает, что любая передача по каналу с более высоким приоритетом будет выполняться раньше, чем по каналу с более низким приоритетом.
4. Циклический сдвиг приоритетов. Позволяет избежать "забивания" шины одним каналом при одновременной передачe по нескольким каналам. Каждому каналу, по которому прошла передача, автоматически присваивается низший приоритет, после чего право на передачу получает канал с наивысшим приоритетом, для которого передача в данный момент возможна.
5. Сжатие времени передачи (Compressed transfer timing). В случае, если временные характеристики быстродействия обменивающихся устройств совпадают, ПДП может сократить время выполнения каждого такта передачи на 2 цикла часов за счет тактов ожидания, входящих в каждый цикл передачи.
Описание внутренних регистров ПДП
Контроллер имеет 344 бита внутренней памяти, организованной в виде регистров. Первые пять регистров имеются в каждом из 4-х каналов.
Регистр начального адреса (Base Address Register). В этом регистре задается стартовый адрес ОЗУ, с которого начинается передача. Регистр содержит 16 разрядов и определяет адрес внутри заданной страницы памяти размером 64К.
Регистр начального счетчика циклов (Base Word Count Register). В этом регистре задается начальное число циклов передачи для программируемого канала. Фактическое число передаваемых во время работы ПДП элементов данных на единицу превышает заданное число циклов.
Регистр текущего адреса (Current Address Register). Начальное значение заносится в этот регистр одновременно с регистром начального адреса. В дальнейшем в ходе передачи значение текущего адреса автоматически увеличивается или уменьшается (конкретное направление изменения задается при программировании в регистре режима). Если разрешена автоинициализация, то после окончания передачи в регистр автоматически устанавливается значение из регистра начального адреса.
Регистр текущего счетчика циклов (Current Word Count Register). Регистр содержит текущее значение счетчика циклов (число оставшихся циклов передачи). Отображаемое в нем число циклов всегда на единицу меньше числа еще не переданных элементов данных, так как изменение значения в этом регистре проиводится в конце цикла передачи, уже после фактической передачи элемента данных, а конец передачи фиксируется в момент переполнения счетчика (изменение его значения с 0 на 0FFFFh).
Регистр режима (Mode Register). Данный регистр задает режимы работы своего канала контроллера (используются 5 младших разрядов):
разряды 0-1: 00=проверка,
01=запись (в память),
10=чтение (из памяти)
11=недопустимая комбинация
разряд 2: 1- автоинициализация разрешена
0- автоинициализация запрещена
разряд 3: 0=увеличение текущего адреса при обмене
1=уменьшение текущего адреса при обме
разряды 4-5: 00=режим передачи по требованию
01=режим одиночной передачи
10=режим блочной передачи
11=каскадный режим.
Следующий набор регистров является общим для всех каналов.
Регистр команд (Command Register). Этот 8-битный регистр управляет работой контроллера. Он программируется, когда контроллер находится в состоянии программирования и очищается командами сброса "Reset" и "Master Clear". Назначение битов регистра команд:
разряд 0: 0=запретить передачу память-память, 1=разрешить
1: 0=запретить фиксацию адреса в канале 0, 1=разрешить
2: 0=разблокировать, 1=заблокировать контроллер
3: 0=нормальная временная диаграмма, 1=сжатие времени
4: 0=фиксированные приоритеты, 1=циклический сдвиг
5: 1=режим расширенной записи, 0=задержки при записи
6: 0=активным считается высокий уровень DREQ, 1=низкий
7: 0= активным считается высокий уровень DACK, 1=низкий
Регистр состояния (Status Register). Регистр отражает текущее состояние запросов и передач по всем четырем каналам. Биты 0 - 3 устанавливаются в единицу после завершения передачи по каналам бит 0 - канал 0, бит 1 - канал 1 и т. д.), если не задан режим автоинициализации. Эти биты очищаются после команды сброса контроллера и после каждой операции считывания состояния из регистра состояния. Биты 4 – 7 указывают по какому из каналов 0 - 3 активен в текущий момент сигнал запроса на ПДП.
Регистр масок (Mask Register). Каждый бит этого 4-битового регистра маскирует/демаскирует свой канал ПДП, при этом значение 1 маскирует канал, значение 0 демаскирует канал и разрешает прием сигнала запроса по этому каналу.
Регистр запросов (Request Register). Сигнал запроса на ПДП (DREQ) может быть издан как обслуживаемым устройством, так и программно. Для программного издания сигнала запроса по одному из 4-х каналов ПДП необходимо установить соответствующий бит в 4-разрядном регистре запросов. Запрос на ПДП может быть отменен записью нулевого значения в соответствующий бит регистра. Бит запроса очищается автоматически при окончании передачи по данному каналу. Все биты запросов очищаются при сбросе контроллера. Для того, чтобы воспринимать программные запросы на ПДП, канал должен находится в режиме блоковой передачи.
Рабочий регистр (Temporary Register). Этот 8-разрядный регистр используется для хранения элемента данных, передаваемого в режиме фиксированного адреса при передаче память-память или для временного хранения передаваемого байта при всех остальных режимах передачи.
4.3. Системный таймер
Все ВМ используют программируемый системный таймер (ПСТ), выполняющий три основных функции:
§ генерацию прерываний от системных часов, вызывающих инкремент счетчика системного времени в ячейке 0000:046Ch - счетчик тиков таймера (области данных BIOS);
§ генерацию запросов на регенерацию памяти;
§ генерацию звуковых сигналов.
При инициализации BIOS устанавливает свой обработчик для прерывания таймера. Этот обработчик каждый раз увеличивает на 1 текущее значение четырехбайтовой переменной - счетчик тиков таймера. Если этот счетчик переполняется (прошло более 24 часов с момента запуска таймера), в ячейку 0000:0470h заносится 1.
Другое действие, выполняемое стандартным обработчиком прерывания таймера - контроль за работой двигателей НГМД. Если после последнего обращения к НГМД прошло более 2 секунд, обработчик прерывания выключает двигатель. Ячейка с адресом 0000:0440h содержит время, оставшееся до выключения двигателя. Это время постоянно уменьшается обработчиком прерывания таймера. Когда оно становится равно 0, обработчик выключает двигатель НГМД.
Последнее действие, которое выполняет обработчик прерывания таймера - вызов прерывания INT 1Ch. После инициализации системы вектор INT 1Ch указывает на команду IRET, т. е. ничего не выполняется. Программа может установить собственный обработчик этого прерывания для того чтобы выполнять какие-либо периодические действия.
В качестве ПСТ ранее применялась микросхема Intel 8254, роль которой на современных системных платах берет на себя чипсет, сохраняя полную программную совместимость. ПСТ представляет собой трехканальные программируемые счетчики-таймеры (рис. 4.3) с независимыми входами CLK – вход счетных импульсов и GATE – вход разрешения счета и выходом OUT, изменяющим состояние по окончании счета.
Рис. 4.3. Архитектура программируемого системного таймера Intel 8254

Каждый канал (счетчик 0, 1, 2) содержит регистры:
· состояния канала RS (8 разрядов);
· управляющего слова RSW (8 разрядов);
· буферный регистр OL (16 разрядов);
· регистр счетчика CE (16 разрядов);
· регистр констант пересчета CR (16 разрядов).
Регистр счетчика CE работает в режиме вычитания. Его содержимое уменьшается по заднему фронту сигнала CLK при условии, что на вход GATE установлен уровень логической 1. В зависимости от режима работы таймера при достижении счетчиком CE нуля тем или иным образом изменяется выходной сигнал OUT.
Буферный регистр OL предназначен для запоминания текущего содержимого регистра счетчика CE без остановки процесса счета. После запоминания буферный регистр доступен программе для чтения.
Регистр констант пересчета CR может загружаться в регистр счетчика, если это требуется в текущем режиме работы таймера.
Регистр состояния канала RS и управляющего слова RSW предназначены, соответственно, для определения текущего состояния канала и для задания режима работы таймера.
Возможны шесть режимов работы таймера. Они разделяются на три типа:
- Режимы 0, 4 - однократное выполнение функций. Режимы 1, 5 - работа с перезапуском. Режимы 2, 3 - работа с автозагрузкой.
В режиме однократного выполнения функций перед началом счета содержимое регистра констант пересчета CR переписывается в регистр счетчика CE по сигналу CLK, если сигнал GATE установлен в 1. В дальнейшем содержимое регистра CE уменьшается по мере прихода импульсов CLK. Процесс счета можно приостановить, если подать на вход GATE уровень логического 0. Если затем на вход GATE подать 1, счет будет продолжен дальше. Для повторения выполнения функции необходима новая загрузка регистра CR, т. е. повторное программирование таймера.
При работе с перезапуском не требуется повторного программирования таймера для выполнения той же функции. По фронту сигнала GATE значение константы из регистра CR вновь переписывается в регистр CE, даже если текущая операция не была завершена.
В режиме автозагрузки регистр CR автоматически переписывается в регистр CE после завершения счета. Сигнал на выходе OUT появляется только при наличии на входе GATE уровня логической 1. Этот режим используется для создания программируемых импульсных генераторов и генераторов прямоугольных импульсов (меандра).
Программирование ПСТ осуществляется через порты ввода/вывода со следующими адресами:
· 40h - канал 0;
· 41h - канал 1;
· 42h - канал 2;
· 43h - управляющий регистр.
Формат управляющего регистра приведен на рис. 4.4.
Поле B определяет формат константы, использующейся для счета – (В=0) двоичный или (В=1) двоично-десятичный. В двоично-десятичном режиме константа задается в диапазоне 1-9999.
Поле M определяет режимы работы ПСТ:
- 0 - прерывание от таймера; 1 - программируемый ждущий мультивибратор; 2 - программируемый генератор импульсов; 3 - генератор меандра; 4 - программно-запускаемый одновибратор; 5 - аппаратно-запускаемый одновибратор.
Поле RW определяет способ загрузки констант через однобайтовый порт. Если в этом поле задано значение 00, это управляющее слово будет использоваться для фиксации текущего содержимого регистров счетчика CE в буферном регистре OL с целью чтения программой. Это код команды CLC - фиксация регистров. Код канала, для которого будет выполняться фиксация, должен быть указан в поле SC. Поля M и B при этом не используются. 

Поле SC определяет номер канала, для которого предназначено управляющее слово. Если в этом поле задано значение 11, будет выполняться чтение состояния канала.
Как указывалось в начале раздела одна из функций выполняемых ПСТ – генерация звуковых сигналов. В компьютере большинство операций обмена данными регулируется параллельным программируемым адаптером (ППА). Этот адаптер содержит три 8-разрядных регистра; два из них используются для операций ввода данных, а один - для вывода. Выходному регистру ППА соответствует номер порта 61Н. Динамиком можно управлять в двух режимах, задаваемых значениями двух битов выходного регистра ППА. Если бит 0 равен 1, то системный таймер (ПСТ) задает частоту звучания динамика. Если бит 1 равен 1, то динамик начинает издавать звук и продолжает звучать до тех пор, пока бит 1 не станет равным 0.
4.4. Системные регистры
Системные регистры предназначены для обслуживания ЦП при многозадачной обработке. Для этого ЦП переводится в защищенный режим. Прежде, чем процессор перейдёт в защищённый режим, должна быть определена глобальная дескрипторная таблица GDT (Global Descriptor Table), так как все сегменты и прочие системные объекты должны быть описаны в дескрипторной таблице.
Глобальная дескрипторная таблица GDT - это область памяти, в которой находятся дескрипторы. Процессору всё равно, где именно вы расположили эту таблицу, но в любом случае она будет находиться в первом мегабайте адресного пространства, потому что только из режима реальных адресов можно перевести процессор в защищённый режим. Также подразумевается, что сама таблица GDT будет выровнена на границу 8 байт, так как дескрипторы, из которых она состоит, имеют 8-байтный размер. Такое выравнивание позволит процессору максимально быстро обращаться к дескрипторам, что, естественно,
увеличивает производительность.
Число дескрипторов, определённых в GDT, может быть любым, от 0 до 8192. Нулевой дескриптор, т. е. определённый в самом начале GDT, процессор не использует, обращение к такому дескриптору могло бы быть, когда поле Index селектора равно 0. Если всё же в программе встречается обращение к нулевому дескриптору, то процессор генерирует исключение и не позволит доступ к такому дескриптору. В связи с этим, везде в литературе рекомендуется использовать нулевой дескриптор как шаблон, на основе которого программа может создавать новые дескрипторы, но на практике их удобнее создавать иными способами, о которых мы ещё будем говорить.
GDT используется процессором всё время, пока он находится в защищённом режиме. Параметры GDT хранятся в специальном 48-разрядном регистре GDTR:

Рис. 4.5. Формат регистра GDTR.
Адрес начала GDT - это тот адрес, по которому размещена таблица.
Предел таблицы GDT - это максимальное смещение относительно её начала. Например, создаётся GDT, состоящую из 3-х дескрипторов - для сегментов кода, стека и данных. Общее число дескрипторов будет равно четырём, потому что первым по счёту будет идти нулевой дескриптор, а за ним уже остальные три:
Смещение от начала GDT | Назначение дескриптора |
0 | Нулевой |
8 | Сегмент кода |
16 | Сегмент стека |
24 | Сегмент данных |
Размер GDT в данном случае будет равен 32 байтам, следовательно, предельное смещение в таблице будет равно 31 - это и есть предел GDT.
Для загрузки значения в регистр GDTR используется команда LGDT. Операндом этой команды является 48-разрядное значение адреса в памяти, где размещается адрес и предел GDT. Можно также сохранить содержимое GDTR командой SGDT, указав в операнде адрес 48-разрядной переменной в памяти. Следует отметить, что размер GDT желательно не менять в процессе выполнения программ в защищённом режиме. Если программа будет динамически создавать новые дескрипторы, то размер GDT лучше всего заранее задать достаточно большим, например, 64 Кб (максимальный размер). Однако, следует учитывать, что при обращении процессора к несуществующим дескрипторам, его поведение непредсказуемо, хотя оно, скорее всего, закончится зависанием.
Все 32-разрядные процессоры, начиная с Intel 80386, имеют набор системных регистров, предназначенных для использования в защищённом режиме. Среди них есть регистры управления (Control Registers) CR0, CR1, CR2, CR3 и CR4.
Регистры управления, в основном, состоят из флагов. Назначение и использование каждого флага достаточно сложно и требует отдельного рассмотрения. Для начала мы рассмотрим только один бит PE (Protection Enable) регистра CR0, отвечающего за переход процессора в защищённый режим и обратно. Полный список с описаниями регистров управления можно найти, например на www.sasm.narod.ru/docs/pm.
Регистры управления предназначены для считывания и записи информации. Они имеют размер 32 бита и оперировать ими можно только целиком - считывается значение целого регистра, изменяются нужные биты и записывается обратно. Единственная команда, которой позволен доступ к этим регистрам - это MOV, в качестве операнда которой используется 32-разрядный регистр общего назначения.
Если установить бит РЕ в 1,то процессор перейдёт в защищённый режим, если сбросить - то в режим реальных адресов. Процессор после аппаратного сброса переходит в режим реальных адресов и бит PE сброшен.
Ниже приведены примеры использования бита PE:
1. Перевод процессора в защищённый режим.
mov eax, cr0 ; Копируем в EAX содержимое регистра CR0.
or al,1 ; Устанавливаем в копии 0-й бит, который
; соответствует 0-му биту CR0, т. е. биту PE.
mov cr0,eax ; Записываем в CR0 обновлённое значение.
; Процессор перешёл в защищённый режим.
... ; 1-я команда программы, которая выполнится
; в защищённом режиме.
2. Перевод процессора в режим реальных адресов.
mov eax, cr0
and al,0feh ; Сбрасываем бит PE.
mov cr0,eax ; Процессор перешёл в режим реальных адресов.
Если просто выполнить переход в защищённый режим, как показано на приведенном выше примере, то процессор зависнет. Для работы в защищённом режиме процессор использует дескрипторы сегментов, вместо их адресов (которые находятся в сегментных регистрах), поэтому прежде, чем перевести процессор в защищённый режим, нужно провести определенные подготовительные работы. Эти особенности будут рассмотрены в следующем разделе.
Контрольные вопросы
1. Сколько режимов обслуживания прерываний обеспечивает ПКП?
2. В чем заключаются особенности работы ПКП в режиме поллинга и когда его целесообразно использовать?
3. Сколько уровней аппаратных прерываний могут обслужить четыре ПКП и как их следует объединить между собой?
4. Какие параметры передаются контроллеру ПДП при программировании?
5. Перечислите режимы работы контроллера ПДП и объясните особенности использования каждого режима.
6. Сколько каналов включено в ПСТ и в чем заключается основное предназначение каждого канала?
7. Какие регистры содержит каждый канал ПСТ и в чем их предназначение?
8. В чем заключается основное назначение системных регистров ЦП?
9. Опишите формат регистра GDTR и назначение его полей.
10. В чем заключается основное назначение регистров управления ЦП?
11. Сколько уровней прерываний можно обслужить с помощью ПКП?
12. Объясните назначение схемы сравнения приоритетов.
13. Для чего используется сигнал SP/EN?
14. Перечислите последовательность действий при обслуживании прерываний.
15. Объясните назначение режима блочной передачи.
16. Опишите особенности режимов работы системного таймера.
17. Какое число дескрипторов можно определить в GDT?
18. Что означает предел таблицы GDT?
19. Как и для чего используется бит РЕ регистра управления?
20. Опишите основное назначение системных регистров.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |


