(его «залипание» на низком уровне) тормозит работу компьютера.
Номинальная длительность цикла определяется чипсетом и может программироваться в BIOS Setup заданием числа тактов ожидания (wait states). При этом циклы обращения к памяти, как правило, короче циклов обращения к портам ввода-вывода. Для управления длительностью цикла используются также сигналы управления разрядностью передачи: если устройство поддерживает 16-битные передачи, предполагается, что оно может работать с меньшим количеством тактов ожидания. Этим объясняется, что в BIOS Setup длительности циклов ISA задаются раздельно как для памяти и ввода-вывода, так и для 8- и 16-битных операций.
Кроме длительности цикла, устройства могут быть критичны к времени восстановления (recovery time) — длительности пассивного состояния управляющих сигналов чтения-записи между циклами. Этот параметр также может программироваться в BIOS Setup и тоже раздельно для 8- и 16-разрядных операций.
Карты расширения для подключения к шине данных, как правило, используют буферные микросхемы, раздельные для линий
SD[7:0]
и
SD[15:8]
.
Здесь широко применяются микросхемы 74ALS245 (1533АП6) — 8-разрядные двунаправленные приемопередатчики. Буфер должен открываться сигналом
ОЕ#
(Output Enable — разрешение выхода), когда на шине адреса присутствует адрес, относящийся к диапазону адресов подключаемого устройства. «Дежурным» является направление передачи «от шины — к устройству»; переключение в обратную сторону производится по сигналу
IOR#
, если устройство представляет порты ввода-вывода, или
MEMRD#
, если устройство приписано к пространству памяти. Таким образом, буферы имеют право передавать данные на шину (управлять шиной данных) только во время действия сигнала чтения, относящегося к зоне адресов данного устройства. Карта расширения может являться комбинацией 8- и 16-битных устройств; например, некогда популярные мультикарты содержали 16-битный адаптер ATA и набор 8-битных контроллеров портов COM, LPT, GAME и контроллера НГМД. В таких картах логика управления буферами и сигналами
IOCS16#
и
MSC16#
управляется сигналами от дешифратора адреса. Если устройство по данному адресу является 8-разрядным (не формирует сигналы
IOCS16#
или
MSC16#
), то оно имеет право разрешать чтение только через буфер линий
SD[7:0]
, а буфер старших линий
SD[15:8]
(если он имеется на карте) должен быть переведен в третье состояние. Если устройство по данному адресу является 16-разрядным, то оно формирует сигнал
IOCS16#
или
MSC16#
, а разрешением буферов управляют сигналы
SBHE#
и
SA0
. В этом случае буфер линий
SD[7:0]
разрешается только при
SA0
=0, а буфер линий
SD[15:8]
разрешается только при
SBHE#
=L. Некорректное разрешение буферов может приводить к их конфликту с перестановщиком байтов системной платы и искажениям данных.
Восьмиразрядные устройства (например, микросхемы 8255, 8250, 8253 и т. п.) следует подключать только к линиям
SD[7:0]
и при обращении к ним не формировать сигналы
IOCS16#
или
MSC16#
. Никакие «косые» буферы (перестановщики байтов) на интерфейсных картах не нужны.
В одном из источников описывается эффект перестановки байтов при обращении к порту ввода-вывода: «Если прочитать слово из порта по четному адресу, значение одно, а если по нечетному — старшие 8 бит предыдущего значения становятся младшими, а старшие нового = FFh». Первые подозрения падают на ошибку в логике управления буферами. На самом деле все объясняется гораздо проще. Пусть имеется устройство с двухбайтным регистром, младший байт которого имеет адрес R0 (четный), старший — R0+1, а по адресу R+2 устройство (и никакие другие) не откликается. Пусть в данный момент в нем записано число AA55h, тогда чтением порта по команде
IN AX, R0
получим в регистрах процессора
AL
=55h,
AH
=AAh. Теперь если попытаться его «прочитать по нечетному адресу», то есть командой
IN АХ, R0+1
, то получим
AL
=AAh (содержимое R0+1, к которому мы на самом деле и адресовались!), a
AH
=FFh (результат чтения «пустоты»). Так что это не «эффект перестановки», а просто незнание общего правила «интеловской» адресации: адресом слова (двойного, учетверенного…) является адрес его младшего байта. Если в нашем устройстве применяется неполная дешифрация адреса (линия
SA1
не используется ни для дешифрации адреса, ни для выбора регистра), то мы увидим полную перестановку байт — в
AH
=55h, результат чтения R0 по адресу-псевдониму R0+2. Логика работы контроллера шины вместе со всеми буферами делает обращение к любой ячейке памяти или порту инвариантным к способу программной адресации — что закажешь, то и получишь, но требуется учитывать особенности периферийных устройств, у которых в адресации портов нередко встречаются псевдонимы. Адреса-псевдонимы встречаются и в пространстве памяти (например, копии образов BIOS под границей 1-го и 16-го мегабайтами памяти в «классических» PC/AT).
6.1.2. Прямой доступ к памяти — DMA
Прямой доступ к памяти позволяет абоненту шины организовывать обмен данными между своим регистром и памятью под управлением контроллера DMA, минуя центральный процессор. До выполнения обмена канал DMA должен быть инициализирован — задан начальный адрес и размер пересылаемого блока памяти, направление и режим обмена. После инициализации канала обмен выполняется по инициативе ПУ.
Для интерфейса ПУ каждый канал DMA представляется парой сигналов: запрос обмена —
DRQx
и подтверждение обмена —
DACKx#
, где
x
— номер используемого канала. На рис. 6.3 приведена диаграмма стандартного цикла передачи байта (для 8-битного канала) или слова (для 16-битного) от ПУ в память по каналу DMA. Цикл передачи блока байтов или слов в память будет выглядеть следующим образом.
1. По сигналу
DRQx
контроллер DMA запрашивает управление шиной и дожидается его предоставления процессором (и другими контроллерами шины).
2. Контроллер выставляет адрес ячейки памяти и формирует в одном цикле шины сигналы
IOR#
,
DACKx#
и
MEMW#
. Адрес на всех линиях, включая
LA[23:17]
, действителен во время всего цикла (защелкивание не требуется),
BALE
=H в течение всего цикла. Сигнал
DACKx#
указывает на то, что операция выполняется для канала x, a
IOR#
— на направление в канале (для пересылки из памяти в канал использовался бы сигнал
IOW#
). Чтобы по сигналу
IOR#
не было ложного чтения (по
IOW#
— ложной записи) порта, адрес которого совпадает с адресом памяти, присутствующим в цикле DMA, контроллер высоким уровнем сигнала
AEN
запрещает портам дешифрацию адреса. Байт, считанный из ПУ, в том же цикле шины записывается в ячейку памяти.
3. Контроллер модифицирует счетчик адреса и повторяет шаги 1–2 для каждого следующего сигнала
DRQx
, пока не будет исчерпан счетчик циклов. В последнем цикле обмена контроллер формирует общий сигнал окончания
TC
(Terminate Count), который может быть использован устройством для формирования сигнала аппаратного прерывания.
Рис. 6.3. Цикл обмена DMA
Диаграмма обратной пересылки (из памяти в ПУ) отличается только тем, что на месте сигнала
IOR#
будет сигнал
MEMR#
, а на месте
MEMW#
— сигнал
IOW#
. Направление обмена и параметры режима задаются программированием контроллера DMA.
Цикл DMA, и так довольно длинный, может быть растянут устройством с помощью сигнала
IOCHRDY
(но сократить его сигналом
0WS#
невозможно). Запрашивать удлинение цикла может только адресованная память — подразумевается, что когда ПУ выставляет запрос
DRQx
, оно уже должно быть готово к обмену.
На 16-битной шине ISA доступно 7 каналов DMA: четыре 8-битных (номера 0–3) и три 16-битных (5–7), подключенные к первичному и вторичному контроллерам соответственно. Канал 4 используется для каскадирования (соединения контроллеров). На 8-битном слоте доступны только четыре 8-битных канала (в XT только 3 — канал 0 требовался для регенерации памяти).
Кроме приведенного на рисунке режима одиночной передачи возможны и иные, описанные в п. 12.4.
Напомним, что по 8-битным каналам DMA за один сеанс настройки контроллера можно передавать не более 64К байт данных, начинающихся с любого адреса (но не пересекая границ страниц, см. п. 12.3.2 и 12.5). По 16-битным каналам за сеанс можно передавать не более 64К слов данных, начинающихся с четного адреса, и границы страниц иные. Используя DMA в режимах, отличных от одиночного, длительность непрерывной передачи не должна превышать 15 мкс (для обеспечения регенерации памяти).
6.1.3. Прямое управление шиной
В случае прямого управления шиной (bus mastering) инициатором обмена становится контроллер какого-либо устройства или интерфейса, но не процессор и не канал DMA. Прямое управление позволяет контроллеру, не отвлекая центральный процессор, выполнять обмен данными с высокой производительностью и, возможно, по более сложным правилам и без ограничений, присущих каналам DMA (невозможность пересечения границы страницы). Контроллер, как правило, обеспечивает обмен данными между системным ОЗУ и своим периферийным устройством или интерфейсом. В принципе он может общаться с памятью или портами другого абонента шины, но для упрощения организации всех информационных связей центральным «перевалочным пунктом» все-таки является системное ОЗУ. Получить право на управление шиной ISA может только контроллер, подключенный к 16- битному слоту. Для арбитража запросов на управление шиной от нескольких источников — центрального процессора, контроллера DMA и контроллеров- абонентов шины используется второй контроллер DMA (каналы 5–7). Устройство, желающее получить управление, выставляет запрос
DRQx
(x=5…7), по которому контроллер DMA запрашивает управление шиной у центрального процессора. Получив подтверждение от процессора, контроллер устанавливает сигнал
AEN
(для блокировки дешифрации адреса портов) и формирует сигнал
DACKx
. Получив этот сигнал, устройство устанавливает низкий уровень на линии
MASTER#
, по которому контроллер шины DMA снимает сигнал
AEN
и освобождает линии командных сигналов. Таким образом, управление шиной переходит к данному устройству до тех пор, пока оно не снимет запрос
DRQx
. В режиме прямого управления шиной ISA устройство становится полновластным и бесконтрольным хозяином как самой шины, так и системы в целом (через мост шины). Если шина захватывается более чем на 15 мкс, контроллер устройства должен заботиться о регенерации памяти (см. ниже). Устройства (и память), к которым обращается задатчик шины, могут потребовать введения тактов ожидания сигналом
IOCHRDY
, и это требование должно удовлетворяться.
6.1.4. Регенерация памяти
Динамическая память, применяемая в компьютере в качестве системного ОЗУ, а также, возможно, находящаяся на картах расширения, требует регенерации — периодического обновления (refresh) всех строк матрицы. На системной плате всегда имеется контроллер регенерации памяти, в задачу которого входит регулярный перебор строк памяти с формированием специального цикла регенерации. Каждые 15 мкс контроллер регенерации формирует цикл регенерации (сигнал
REFRESH#
), диаграмма которого аналогична циклу DMA, но вместо чтения данных выполняется регенерация. В этом цикле считывания данных из микросхем памяти не производится, но стробы строк формируются (подробнее о методах регенерации см. в книге «Аппаратные средства IBM PC. Энциклопедия»). На шине ISA контроллер регенерации работает как нулевой канал DMA (в старых машинах он непосредственно и использовался). Каждые 15 мкс контроллер регенерации формирует сигнал REFRESH#, во время действия которого устанавливается
AEN
=H и
BALE
=H, формируется сигнал
MEMR#
, а на линиях
SA[7:0]
устанавливается адрес текущей регенерируемой строки. Диаграмма цикла регенерации аналогична циклу DMA, но сигнал
REFRESH#
указывает на то, что вместо чтения данных выполняется регенерация.