Ввод-вывод, отображаемый на пространство памяти

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

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


Но тут возникает вопрос: как центральный процессор обменивается данными с регистрами управления и буферами данных устройств? Есть два альтернативных варианта. В первом из них каждому регистру управления назначается номер порта ввода-вывода, являющийся 8- или 16-разрядным целым числом[22]. Набор всех портов ввода-вывода формирует пространство портов ввода-вывода, которое защищено от доступа со стороны обычных пользовательских программ (доступ к нему имеет только операционная система). Используя специальные команды ввода-вывода, например

IN REG,PORT

центральный процессор может считать данные из регистра управления PORT и сохранить полученный результат в своем регистре REG. Аналогично этому, используя команду

OUT PORT,REG

центральный процессор может записать содержимое своего регистра REG в регистр управления PORT. Многие компьютеры первых поколений, включая практически все универсальные компьютеры, такие как IBM 360 и все его преемники, работали именно таким образом.

На рис. 5.1, а показано, что при использовании этой схемы для оперативной памяти и для ввода-вывода используются совершенно разные адресные пространства. При такой конструкции команды

IN R0,4

и

MOV R0,4

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

Второй вариант, появившийся на машинах PDP-11, предусматривает отображение всех регистров управления на пространство памяти (рис. 5.1, б). Каждому регистру управления выделен уникальный адрес в памяти, который не распределяется в оперативной памяти. Эта система называется отображаемым на адресное пространство памяти вводом-выводом. В большинстве систем выделяемые адреса находятся в верхней части адресного пространства или возле нее. На рис. 5.1, в показан также гибридный вариант, в котором имеются буферы данных ввода-вывода, отображаемые на пространство памяти, и отдельные порты ввода-вывода для регистров управления. Такая архитектура используется в семействе машин x86, у которых по аналогии с IBM PC адресное пространство оперативной памяти от 640 K до 1 M - 1 зарезервировано для буферов данных различных устройств вдобавок к портам ввода-вывода, имеющим номера от 0 до 64 K - 1.

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

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

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

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

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

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

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

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

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

Но в современных персональных компьютерах наблюдается тенденция использования выделенной высокоскоростной шины памяти (рис. 5.2, б). Эта шина специально приспособлена для оптимизации производительности памяти, чтобы не идти на компромисс ради медлительных устройств ввода-вывода. У машин семейства x86 могут быть несколько шин (шины памяти, шины PCIe, SCSI и USB), показанных на рис. 1.12.

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

выставляются на шину

а 6

Рис. 5.2. Архитектура: а — использующая одну шину; б — с двойной шиной памяти

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

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

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

5.1.4.

<< | >>
Источник: Э. ТАНЕНБАУМ Х. БОС. СОВРЕМЕННЫЕ ОПЕРАЦИОННЫЕ СИСТЕМ Ы 4-е ИЗДАНИЕ. 2015

Еще по теме Ввод-вывод, отображаемый на пространство памяти:

  1. § 75 Ввод во владение по завещанию и споры на завещание. – Различные способы спора. – Пошлины с перехода имений по завещанию.
  2. ПРЕДСТАВЛЕНИЕ ПАМЯТИ
  3. Гигиена памяти.
  4. укрепление памяти
  5. ТЕОРИЯ ПАМЯТИ
  6. V. 2. 5. Структура парциального хранилища памяти.
  7. следующие виды памяти
  8. Сила памяти
  9. В психологии различают четыре типа памяти.
  10. V. 2. МОДЕЛЬ ПАРЦИАЛЬНОГО ХРАНИЛИЩА ПАМЯТИ ЧЕЛОВЕКА
  11. § 38 Изменение старых понятий о переходе вотчинного права. – Формы приобретения по нынешнему закону. – Ввод во владение по новому нотариальному уставу. – Невыгоды от неизвестности о правах. – Попытка к регистрации поземельной собственности в России. – Вотчинная записка в прибалтийских губерниях
  12. Энерго-информационные ключи к памяти Атлантиды
  13. Роль памяти и воображения
  14. 9.2. БАРЬЕРЫ ПАМЯТИ
  15. 9.11. С ПОМОЩЬЮ ПАМЯТИ
  16. 4.7. МЕТОД ПОРТАТИВНОГО БАНКА ПАМЯТИ
  17. Таинственные узоры Атлантиды – шифры великой памяти
  18. Игры на развитие памяти