|
| ||
|
|
||
|
| ||
Система
ввода-вывода
Система
ввода-вывода, т. е. комплекс средств обмена информацией с внешними устройствами,
является важнейшей частью архитектуры процессора и машины в целом. К системе ввода-вывода
можно отнести и способы подключения к системной шине различного оборудования,
и процедуры взаимодействия процессора с этим оборудованием, и команды процессора,
предназначенные для обмена данными с внешними устройствами.
Непрерывное совершенствование
микропроцессоров и стремление максимально повысить производительность всей вычислительной
системы привело к существенному усложнению внутренней организации компьютеров:
повышению разрядности шин, появлению внутренних быстродействующих магистралей
обмена данными, использованию кэш-буферов для ускорения обмена с памятью и дисками
и проч. Если, однако, отвлечься от важных с точки зрения производительности, но
несущественных для программиста деталей, то логическую схему современного компьютера
можно представить традиционным образом, в виде системной шины (магистрали), к
которой подключаются сам микропроцессор и все устройства компьютера (рис. 1.13).

Рис. 1.13. Подключение устройств компьютера к системной шине(A - адреса; D - данные; M/IO - один из сигналов управления)
Системная
шина представляет собой, в сущности, набор линий - проводов, к которым единообразно
подключаются все устройства компьютера. В более широком плане в понятие системной
шины следует включить электрические и логические характеристики сигналов, действующих
на линиях шины, их назначение, а также правила взаимодействия этих сигналов при
выполнении тех или иных операций на шине - то, что обычно называют протоколами
обмена информацией. Сигналы, распространяющиеся по шине, доступны всем подключенным
к ней устройствам, и в задачу каждого устройства входит выбор предназначенных
ему сигналов и обеспечение реакции на них, соответствующей протоколу обмена.
Процессор связан с системной шиной большим количеством линий (практически всеми
своими выводами), из которых нас будут интересовать только линии трех категорий:
набор линий адресов, набор линий данных и один из сигналов управления, носящий
название М / IO' (М - "IO с отрицанием"). Последний сигнал, строго говоря,
имеется только среди выходных сигналов микропроцессора, а на системную шину приходят
производные от этого сигнала, образованные, как комбинации сигнала М / IO' с управляющими
сигналами записи и чтения. Однако суть дела от этого не изменяется, и для простоты
мы опустили эти подробности.
Процессор, желая записать данное по некоторому
адресу в памяти, выставляет на линии адресов требуемый адрес, а на линии данных
- данное. Устройство управления памятью расшифровывает поступивший адрес и, если
этот адрес принадлежит памяти, принимает с линий данных поступившее данное и заносит
его в соответствующую ячейку памяти. Описанная процедура отражает выполнение процессором
команды типа
mov mem,AX
где
mem - символическое обозначение ячейки памяти, принадлежащей сегменту данных программы.
Если процессор, выполняя команду типа
mov AX, mem
должен
прочитать данное из памяти, он выставляет на линии адресов требуемый адрес и ожидает
поступления данных. Устройство управления памятью, расшифровав поступивший адрес
и убедившись в наличии такого адреса в памяти, отыскивает в памяти требуемую ячейку,
считывает из нее данное и выставляет его на линии данных. Процессор снимает данное
с шины и отправляет его в указанный в команде операнд (в данном случае в регистр
АХ).
Описанные процедуры записи и чтения справедливы не только по отношении
к памяти; для всех остальных устройств компьютера они выглядят точно так же. За
каждым устройством закреплена определенная группа адресов, на которые оно должно
отзываться. Обнаружив свой адрес на магистрали, устройство, в зависимости от заданного
процессором направления передачи данных, либо считывает с магистрали поступившие
данные, либо, наоборот, устанавливает имеющиеся в нем данные на магистраль.
Из рис. 1.13 видно, что все устройства компьютера можно разбить на две категории.
Представителем одной категории является видеобуфер, входящий в видеосистему компьютера.
Устройство управления видеобуфером настроено на две группы адресов, которые как
бы продолжают адреса, относящиеся к оперативной памяти. Действительно, адрес последнего
байта оперативной памяти составляет 9FFFFh, а уже следующий адрес A0000h является
адресом первого байта графического видеобуфера. Графический видеобуфер занимает
64 Кбайт адресного пространства до адреса AFFFFh (реально немного меньше, но в
плане рассматриваемого вопроса это не имеет значения). Текстовый видеобуфер расположен
на некотором расстоянии от графического и занимает 32 Кбайт, начиная с адреса
B8000h. Таким образом, адреса оперативной памяти и памяти видеобуфера разнесены
и не перекрываются.
Ко второй категории устройств можно отнести все устройства,
адреса которых перекрываются с адресами оперативной памяти. Например, за контроллером
клавиатуры закреплены два адреса: 60h и 61h. По адресу 60h выполняется чтение
кода нажатой клавиши, а адрес 61h используется для управления работой контроллера.
И тот, и другой адрес имеются в оперативной памяти и, таким образом, возникает
проблема распознавания устройства, к которому происходит обращение. Аналогичная
ситуация наблюдается и со многими другими устройствами компьютера. Например, контроллер
прерываний, служащий для объединения сигналов прерываний от всех устройств компьютера
и направления их на единственный вход прерывания микропроцессора, управляется
через два адреса Поскольку -в состав машины всегда включают два контроллера, для
них выделяются две пары адресов. Во всех компьютерах типа IBM PC контроллерам
прерываний назначаются адреса 20h-21h и A0h-Alh, которые так же отвечают и некоторым
байтам оперативной памяти.
Проблема идентификации устройств с перекрывающимися
адресами имеет два аспекта: аппаратный и программный. Идентификация устройств
на системной шине осуществляется с помощью сигнала М / IO', которой генерируется
процессором в любой операции записи или чтения. Однако значение этого сигнала
зависит от категории адресуемого устройства. При обращении к памяти или видеобуферу
процессор устанавливает значение сигнала М / IO' = 1 (М обозначает memory, память).
При обращении к остальным устройствам этот сигнал устанавливается в О (IO обозначает
in-out, ввод-вывод, и если IO с отрицанием равно 0, то IO равно 1, и это олицетворяет
не операцию с памятью, а операцию ввода-вывода). В то же время все устройства,
подключенные к шине, анализируют значение сигнала М / IO1. При этом память и видеобуфер
отзываются на операции чтения-записи на шине, только если они сопровождаются значением
М / IO' = 1, а остальные устройства воспринимают сигналы магистрали только при
значении М / IO' = 0. Таким образом осуществляется аппаратное разделение устройств
"типа памяти" и устройств "ввода-вывода".
Программное
разделение устройств реализуется с помощью двух наборов команд процессора - для
памяти и для устройств ввода-вывода. В первую группу команд входят практически
все команды процессора, с помощью которых можно обратиться по тому или иному адресу
- команды пересылки mov и movs, арифметических действий add, mul и div, сдвигов
rol, ror, sal и sar, анализа содержимого байта или слова test и многие другие.
Фактически в эту группу команды входит большинство команд процессора. Вторую группу
команд образуют специфические команды ввода-вывода. В МП 86 их всего две - команда
ввода in и команда вывода out. При выполнении команд первой группы процессор автоматически
генерирует М / IO' = 1; при выполнении команд in и out процессор устанавливает
сигнал М / IO' = 0.
Таким образом, при обращении к памяти и к видеобуферу
программист может использовать все подходящие по смыслу команды процессора, при
этом, работая, например, с видеобуфером, можно не только засылать в него (или
получать из него) данные, но и выполнять прямо в видеобуфере любые арифметические,
логические и прочие операции.
Обращаться же к контроллерам тех или иных устройств
(и, между прочим, к видеоадаптеру), допустимо только с помощью двух команд - in
и out. Арифметические операции или анализ данных в устройстве невозможен. Необходимо
сначала прочитать в процессор данное из внешнего устройства, и лишь затем выполнять
над ним требуемую операцию.
Наличие двух категорий адресов устройств дает
основание говорить о существовании двух адресных пространств - пространства памяти,
куда входит сама память, а также видеобуферы и ПЗУ, и пространства ввода-вывода
(пространства портов), куда входят адреса остальной аппаратуры компьютера. При
этом, если объем адресного пространства памяти составляет 1 Мбайт (а в защищенном
режиме 4 Гбайт), то адресное пространство портов гораздо меньше - его размер составляет
всего 64 Кбайт. Эта величина определяется форматом команд ввода-вывода. Адрес
адресуемого порта должен быть записан в регистр DX (и ни в какой другой) и, таким
образом, максимальное значение этого адреса составляет величину FFFFh. Реально
из 64 Кбайт адресного пространства портов используется лишь очень малая часть.
Практические вопросы программирования через общее с памятью адресное пространства
и через пространство портов будут рассмотрены в следующих главах.
| Физика лабы | ||||||||
| ||||||||