Система ввода-вывода
Если процессор, выполняя команду типа: 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 Кбайт адресного пространства портов используется лишь очень малая часть. Практические вопросы программирования через общее с памятью адресное пространства и через пространство портов будут рассмотрены в следующих главах.