А.2. Пространство ввода/вывода
А.2. Пространство ввода/вывода
Процессоры х86 имеют раздельную адресацию памяти и пор- тов ввода/вывода. Инструкции ввода/вывода порождают шинные циклы обмена, в которых вырабатываются сигналы IORD# (чтение порта) и IOWR# (запись в порт) на шинах ввода/вывода. Эти сигналы отличают пространство ввода/ вывода от пространства памяти, где соответствующие опе- рации чтения и записи вырабатывают сигналы MEMRD# и MEMWR#. Для обращения к пространству ввода/вывода пред- назначены четыре основные инструкции процессора: IN (ввод в регистр), OUT (вывод из регистра), INS (ввод из порта в элемент строки памяти) и OUTS (вывод элемента из строки памяти). Последние две инструкции с префиксом повтора REP используются для быстрой пересылки блоков данных между портом и памятью. Разрядность слова, передаваемо- го за одну инструкцию ввода/вывода, может составлять 8, 16 или 32 бита. В зависимости от выравнивания адреса по гра- нице слова и разрядности шины это слово может переда- ваться за один или несколько циклов шины.
Сигналы IORD# и IOWR# вырабатываются и в циклах DMA;
в этом случае на шину адреса подается адрес памяти, к кото- рой производится доступ, а не порта. Для блокировки сраба- тьшания дешифратора адреса порта в цикле DMA в шине ISA имеется сигнал AEN. Селективное программное управление сигналом AENx для каждого слота шины EISA дает возмож- ность изолировать пространства ввода/вывода портов, что используется для программного конфигурирования адресов адаптеров. В шине ISA разделение слотов не предусмотрено, что объясняет сложность реализации для нее системы РпР.
Для дешифрации адреса в оригинальном PC из 16 бит ис- пользовались только младшие 10 (АО-А9), что позволяет об-
ращаться к портам 0-3FFh. Старшие биты адреса, хотя и поступают на шину, устройствами игнорируются. Так, обра- щение по адресам 378h, 778h, B78h и F78h воспринимается устройствами одинаково. В адаптерах для шин МСА и PCI используются все 16 бит адреса. Современные системные платы полностью дешифруют адрес.
В реальном режиме процессора программе доступно все про- странство адресов ввода/вывода. В защищенном режиме (в частности, в режиме виртуального процессора 86) можно программно ограничить пространство ввода/вывода, опре- делив его максимальный размер. Внутри разрешенной обла- сти доступ может быть разрешен или запрещен для каждого конкретного адреса. Размер области и карта разрешенных портов (70 Permission Bitmap) задаются ОС в дескрипторе сегмента состояния задачи (TSS). При обращении по нераз- решенному адресу вырабатывается исключение процессора, обработчик которого определяется ОС. Возможно снятие задачи-нарушителя. Не исключено, что по обращению к пор- ту ОС выполнит некоторые действия, создав для програм- мы иллюзию реальной операции ввода/вывода.
Несколько портов вывода могут иметь совпадающие адреса. Операции записи они будут отрабатывать нормально. Для операций считывания ситуация другая. Если несколько пор- тов ввода имеют совпадающий адрес, при считывании они передают свои данные на шину. Если они находятся на од- ной физической шине, возникает конфликт. При прочих рав- ных условиях для каждого бита шины "побеждает" порт, выводящий логический ноль. Так, если один порт "хочет" передать байт OFh, а другой - FOh, то процессор считает OOh. Если порты находятся на разных физических шинах (напри- мер, один в ISA, а другой - в PCI), конфликта не будет, по- скольку шины отделены друг от друга буферами данных. Каждой шине назначается своя область ввода, и дешифра- тор, расположенный на системной плате, при чтении откры- вает соответствующие буферы, так что реально считывают- ся данные только с одной шины. При записи в порты данные (и сигнал записи) обычно распространяются по всем ши- нам компьютера. Адреса Oh-OFFh отведены для устройств системной платы, чтение по этим адресам не распространя-
ется на шины расширения. Для современных плат со встро- енной периферией и несколькими шинами (ISA, PCI) рас- пределением адресов управляет BIOS через регистры кон- фигурирования чипсета.
Приведенные выше рассуждения справедливы и для про- странства памяти, но, как правило, они актуальны только для портов ввода/вывода.
Карта распределения адресов ввода/вывода стандартных устройств приведена в табл. АЛ. Подразумевается 10-битная дешифрация адреса.
AT и PS/2 |
PC/XT |
Назначение |
000-OOF |
000-OOF |
Контроллер DMA #1 8237 |
010-01F |
PS/2 - расширение DMA # 1 |
|
020-021 |
020-021 |
Контроллер прерываний #1 - 8259А |
040-05F |
040-043 |
Таймер (PC/XT: 8253, AT: 8254) |
060 |
060 |
Диагностический регистр POST (только запись) |
060-063 |
Системный интерфейс 8255 |
|
060,064 |
Контроллер клавиатуры AT 8042 |
|
061 |
Источники NMI и управление звуком |
|
070-07F |
Память CMOS и маска NMI |
|
080 |
Диагностический регистр |
|
080-08F |
080-083 |
Регистры страниц DMA |
090-097 |
PS/2: микроканал, арбитр и т. д. |
|
ОАО |
Маска NMI |
|
OAO-OBF |
Контроллер прерываний #2 - 8259А |
|
OCO-ODF |
Контроллер DMA #2 8237А-5 |
|
OFO-OFF |
Сопроцессор 80287 |
|
100-1 EF |
Управление микроканалом PS/2 |
|
170-177 |
Контроллер НЖМД #2 (IDE#2) |
|
1FO-1F7 |
Контроллер НЖМД #1 (IDE#1) |
AT и PS/2 |
PC/XT |
Назначение |
200-207 |
200-20F |
Игровой адаптер |
210-217 |
Блок расширений |
|
238-23F |
COM4 |
|
278-27F |
278-27F |
Параллельный порт LPT2 (LPT3 при наличии MDA) |
2А2-2АЗ |
Часы MSM48321RS |
|
2CO-2DF |
2CO-2DF |
EGA #2 |
2ЕО-2Е7 |
COM4 |
|
2E8-2EF |
COM4 |
|
2F8-2FF |
2F8-2FF |
COM2 |
300-31F |
Плата-прототип |
|
320-32F |
Жесткий диск XT |
|
338-33F |
COM3 |
|
370-377 |
Контроллер НГМД #2 |
|
376-377 |
Порты команд IDE#2 |
|
378-37F |
378-37F |
Параллельный порт LPT1 (LPT2 при наличии MDA) |
380-38F |
380-38F |
Синхронный адаптер SDLC/BSC #2 |
3AO-3AF |
ЗАО-ЗА9 |
Синхронный адаптер BSC #1 |
ЗВО-ЗВВ |
ЗВО-ЗВВ |
Монохромный адаптер (MDA) |
ЗВ4-ЗС9 |
Видеосистема PS/2 |
|
3BC-3BF |
3BC-3BF |
Параллельный порт LPT1 платы MDA |
3CO-3CF |
3CO-3CF |
EGA#1 |
3CO-3DF |
3CO-3DF |
VGA |
3DO-3DF |
3DO-3DF |
CGA/EGA |
ЗЕО-ЗЕ7 |
COM3 |
|
3E8-3EF |
COM3 |
|
3FO-3F7 |
3FO-3F7 |
Контроллер НГМД #1 |
3F6-3F7 |
Порты команд IDE#1 |
|
3F8-3FF |
3F8-3FF |
СОМ1 |