Mov R0. 4

IN R0.4

и

выполняют принципиально различные действия. Первая команда читает содержимое порта ввода-вывода 4 в регистр R0, тогда как вторая читает в этот же регистр содержимое слова памяти по адресу 4. Таким образом, четверки в этих командах означают различные адреса из непересекающихся адресных пространств.

Второй подход, состоит в отображении всех управляющих регистров периферийных устройств на адресное пространство памяти (рис. 10.1 б).

Каждому управляющему регистру назначается уникальный адрес в памяти. Такая система называется отображаемым на адресное пространство памяти вводом-выводом. Обычно для регистров устройств отводятся адреса на вершине адресного пространства.

Также существуют различные гибридные схемы, с отображаемыми на адресное пространство памяти буферами данных и отдельными портами ввода-вывода (рис. 10.1 в). Эта схема довольно широко применяется в совместимых с IBM PC компьютерах на базе процессоров х86 и Pentium, в которых, помимо портов ввода-вывода с номерами от 0 до 64 К, адресное пространство оперативной памяти от 640 К до 1 М зарезервировано под буферы данных устройств ввода-вывода.

Во всех случаях, когда центральный процессор хочет прочитать слово данных либо из памяти, либо из порта ввода-вывода, он выставляет нужный адрес на адресную шину, после чего выставляет сигнал READ на управляющую шину. Вторая сигнальная линия позволяет отличить обращение к памяти от обращения к порту. В зависимости от состояния этой линии шины управления на запрос процессора реагирует устройство (контроллер) ввода-вывода или память.

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

Обе схемы обращения к контроллерам имеют свои сильные и слабые стороны.

Достоинство отображаемого на адресное пространство памяти ввода-вывода:

Во-первых, при такой схеме для обращения к устройствам ввода-вывода не требуются специальные команды процессора, такие как IN и OUT. Б результате программу, общающуюся с таким устройством, можно написать целиком на языке С или C++, без вставок на ассемблере или обращений к подпрограммам, написанным на ассемблере, то есть без дополнительных накладных расходов.

Во-вторых, при отображении регистров ввода-вывода на память не требуется специального механизма защиты от пользовательских процессов, пытающихся обращаться к внешним устройствам. Все, что нужно сделать операционной системе, - это исключить ту часть адресного пространства, на которую отображаются управляющие регистры устройств ввода-вывода из адресного пространства пользователей. Более того, если управляющие регистры различных устройств ввода-вывода отображаются на различные страницы памяти, операционная система может предоставить доступ к различным страницам различным пользователям, таким образом, предоставляя пользователям доступ к одним устройствам и запрещая доступ к другим. Для этого нужно всего лишь включить номер соответствующей страницы памяти в карту памяти нужного пользователя. В результате такая схема позволяет разместить драйверы различных устройств в различных адресных пространствах, тем самым не только уменьшая размер ядра, но и удерживая драйверы от вмешательства в дела друг друга.

В-третьих, при отображении регистров ввода-вывода на память каждая команда процессора, обращающаяся к памяти, может с тем же успехом обращаться к управляющим регистрам устройства.

Например, если у процессора есть в наборе команд инструкция TEST, проверяющая содержимое некоего слова в памяти на равенство 0, она может с тем же успехом применяться и при обращении к управляющему регистру устройства ввода-вывода. Управляющий регистр, равный 0, будет означать,например, готовность данного устройства к приему новой команды. Программа на ассемблере может выглядеть следующим образом:

LOOP: TEST P0RT_4 // сравнить содержимое порта 4 с нулем

BEQ READY // если он равен 0. идти на метку READY

BRANCH LOOP // в противном случае продолжать опрос порта

READY:

Если отображения регистров ввода-вывода на память нет, управляющий регистр устройства должен быть сначала считан в регистр процессора, а уже затем сравнен с 0, что требует двух команд процессора вместо одной. Для приведенного выше цикла добавление четвертой команды может слегка снизить (все зависит от конкретных процессоров, конечно) скорость реакции драйвера на появление признака готовности устройства.

Недостатки отображения регистров ввода-вывода на память.

Во-первых, в большинстве современных компьютеров применяется кэширование памяти. Кэширование управляющих регистров привело бы просто к катастрофе. Поясним это утверждение на уже приведенном выше примере программы, опрашивающей в цикле порт P0RT_4. При первом обращении к этому порту считалось бы верное значение порта, но это значение сохранилось бы в кэше. Все последующие обращения к порту P0RT_4 на следующих итерациях цикла просто читали бы значение, сохраненное в кэше, и никогда не обращались бы к реальному устройству. Таким образом, программа никогда не вышла бы из цикла ожидания готовности, так как при кэшировании регистров устройств она просто не смогла бы узнать об изменении управляющего регистра.

Чтобы не допустить такой ситуации, необходима специальная аппаратура, способная выборочно запрещать кэширование, например, в зависимости от номера страницы памяти, к которой обращается процессор. Таким образом, отображение регистров ввода-вывода на память увеличивает сложность аппаратуры и операционной системы, которой приходится управлять избирательным кэшированием.

Во-вторых, при едином адресном пространстве все модули памяти и все устройства ввода-вывода должны изучать все обращения процессора к памяти, чтобы определить, на которые им следует реагировать. Если у компьютера одна общая шина (рис. 10.2 а), реализовать подобный просмотр всех обращений к памяти всеми устройствами несложно.

Однако в конструкции современных персональных компьютеров наблюдается тенденция в сторону использования выделенной высокоскоростной шины (рис. 10.2 б). Эта шина предназначена для увеличения скорости обмена данными между процессором и памятью, чему в архитектуре общей шины сильно мешали медленные устройства ввода-вывода. В компьютерах на базе процессора Pentium таких внешних шин целых три (шина памяти, PCI и ISA).

Сложность применения выделенной шины памяти на машинах с отображением регистров ввода-вывода на память состоит в том, что у устройств ввода-вывода нет способа увидеть адреса памяти, выставляемые процессором на эту шину, следовательно, они не могут реагировать на такие адреса. Поэтому, чтобы отображение регистров ввода-вывода могло работать на системах с несколькими шинами, необходимы специальные меры.

Один способ решения этой проблемы состоит в том, что сначала все обращения к памяти посылаются процессором по выделенной быстрой шине напрямую памяти (чтобы не снижать производительности). Если память не может ответить на эти запросы, процессор пытается сделать это еще раз по другим шинам. Такое решение работоспособно, но требует дополнительного увеличения сложности аппаратуры.

Второе возможное решение заключается в установке на шину памяти специального следящего устройства, передающего все адреса потенциально заинтересованным устройствам ввода-вывода. Проблема, однако, в том, что устройства ввода-вывода могут просто не успеть обработать эти запросы с той же скоростью, что и память.

Третье решение, используемое в компьютерах на базе процессора Pentium ( рис. 3 ), состоит в фильтрации адресов микросхемой моста PCI. Эта микросхема содержит регистры диапазона, заполняемые во время загрузки компьютера. Например, диапазон адресов от 640 К до 1 М может быть помечен как не относящийся к памяти. Все адреса, попадающие в подобный диапазон, передаются не памяти, а на шину PCI. Недостаток этой схемы состоит в необходимости принятия во время загрузки решения о том, какие адреса не являются адресами памяти.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: