Процессоры семейства х86 имеют раздельную адресацию памяти и портов ввода-вывода. Это разделение обеспечивается выделением специальных инструкций ввода-вывода, с помощью которых возможна передача данных между портами и регистрами процессора (или портами и памятью). Инструкции ввода-вывода порождают шинные циклы обмена, в которых вырабатываются сигналы чтения из порта и записи в порт. На шине ISA это сигналы IORD# и IOWR# соответственно, они и отличают пространство ввода-вывода от пространства памяти, где соответствующие операции чтения и записи вырабатывают сигналы MEMRD# и MEMWR#. На шине PCI разделение памяти и пространства ввода-вывода происходит иначе — здесь тип операции кодируется 4-байтной командой в зависимости от типа инструкции, выполняемой процессором.
В инструкциях ввода-вывода используется 16-битная адресация, что обуславливает размер пространства ввода-вывода в 64 кбайт. Для дешифрации адресов портов в оригинальном ПК из 16 бит использовались только младшие 10 (А0-А9), что обеспечивает обращение к портам в диапазоне адресов 0-3FFh. Старшие биты адреса хотя и поступают на шину, но устройствами игнорируются. В результате обращения по адресам, к примеру, 378h, 778h, B78h и F78h, воспринимаются устройствами одинаково. Это упрощение, нацеленное на снижение стоимости как системной платы, так и схем плат адаптеров, для шины ISA никто не отменял. Устаревшие адаптеры {legacy card) для шины ISA для старших битов адреса не имеют даже печатных ламелей на своем краевом разъеме. Впоследствии перешли к 12-битной адресации устройств шины ISA, но ее приходится применять с оглядкой на возможное присутствие устройств с 10-битной адресацией. В адаптерах для шин МСА и PCI используются все 16 бит адреса, полная дешифрация адреса применяется и в современных системных платах. Карта распределения адресов ввода-вывода стандартных устройств PC приведена в табл. 4.1. Эта карта подразумевает 10-битную дешифрацию адреса. Естественно, что в конкретном компьютере реально присутствуют не все перечисленные устройства, но в то же время там могут оказаться другие, не попавшие в таблицу. Выбор базовых адресов стандартных устройств (3F8h, 3F0h, 378h и т. п.) объясняется стремлением к экономии. Эти адреса выбирались так, чтобы в их дешифрации участвовало максимальное количество единиц и минимальное — нулей (логические схемы «И-НЕ» применяются чаще, чем схемы «ИЛИ», а применение более сложных схем для дешифрации было нежелательно).
Каждой шине назначается своя область адресов ввода, и дешифратор адресов, расположенный на системной плате, при чтении открывает соответствующие буферы данных, так что реально считываться будут данные только с одной шины. При записи в порты данные (и сигнал записи) могут распространяться и по всем шинам компьютера (широковещательно). В стандартном распределении адреса Oh-OFFh отведены для устройств системной платы. При наличии (и разрешении работы) периферийных устройств на системной плате чтение по этим адресам не распространяется на шины расширения. Для современных плат со встроенной периферией и несколькими шинами (ISA, PCI) распределением адресов управляет BIOS через регистры конфигурирования чипсета, а в иерархии шин PCI (и PCI-E) диапазоны адресов задаются программированием мостов (см. 14.6).
Аппаратные прерывания
Аппаратные прерывания обеспечивают реакцию процессора на события, происходящие асинхронно по отношению к исполняемому программному коду. По возникновении такого события адаптер (контроллер) устройства формирует запрос прерывания, который поступает на вход контроллера прерываний. Контроллер прерываний формирует общий запрос прерывания для процессора, а когда процессор подтверждает получение этого запроса, контроллер сообщает процессору вектор прерывания, по которому выбирается программная процедура обработки прерываний. Процедура должна выполнить действия по обслуживанию данного устройства, включая сброс его запроса, и отправить команду завершения в контроллер прерываний, что дает возможность отреагировать на следующие события. Логика работы системы прерываний и программная модель контроллера прерываний, совместимого с микросхемой i8259A, являются важной частью стандартизации архитектуры PC-совместимых компьютеров. Прерывания в процессорах х86 рассмотрены в 7.2.