Ввод-вывод с отображением памяти - Memory-mapped I/O

Ввод- вывод с отображением памяти ( MMIO ) и ввод-вывод с отображением портов ( PMIO ) - это два дополнительных метода выполнения ввода-вывода (I / O) между центральным процессором (CPU) и периферийными устройствами в компьютере . Альтернативный подход - использование выделенных процессоров ввода-вывода, обычно называемых каналами на мэйнфреймах , которые выполняют свои собственные инструкции .

Ввод-вывод с отображением памяти использует одно и то же адресное пространство для адресации как памяти, так и устройств ввода-вывода . Память и регистры устройств ввода-вывода отображаются (связаны с) адресными значениями. Таким образом, адрес памяти может относиться либо к части физического ОЗУ , либо к памяти устройства ввода-вывода. Таким образом, инструкции ЦП, используемые для доступа к памяти, также могут использоваться для доступа к устройствам. Каждое устройство ввода-вывода контролирует адресную шину ЦП и реагирует на любой доступ ЦП по адресу, назначенному этому устройству, соединяя шину данных с аппаратным регистром желаемого устройства . Для размещения устройств ввода-вывода области адресов, используемых ЦП, должны быть зарезервированы для ввода-вывода и не должны быть доступны для нормальной физической памяти. Резервирование может быть постоянным или временным (при смене банка ). Пример последнего можно найти в Commodore 64 , который использует форму отображения памяти, чтобы заставить RAM или оборудование ввода / вывода появляться в 0xD000-0xDFFFдиапазоне.

Порт-карта I / O часто используется специальный класс команд процессора , разработанные специально для выполнения ввода / вывода, такие , как inи outинструкции найденной на микропроцессорах , основанных на x86 и x86-64 архитектур. Различные формы этих двух инструкций могут копировать один, два или четыре байта ( outb, outwи outl, соответственно) между регистром EAX или одним из подразделений этого регистра на ЦП и указанным портом ввода-вывода, который назначен устройству ввода-вывода. Устройства ввода-вывода имеют отдельное адресное пространство от общей памяти, которое обеспечивается либо дополнительным выводом «ввода-вывода» на физическом интерфейсе ЦП, либо всей шиной, выделенной для ввода-вывода. Поскольку адресное пространство для ввода-вывода изолировано от адресного пространства для основной памяти, это иногда называют изолированным вводом-выводом.

Обзор

Различные методы связи ЦП с устройством, такие как отображение памяти, не влияют на прямой доступ к памяти (DMA) для устройства, потому что, по определению, DMA - это метод связи между памятью и устройством, который обходит ЦП.

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

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

Одним из достоинств ввода-вывода с отображением памяти является то, что, отбрасывая дополнительную сложность, которую приносит ввод-вывод порта, ЦП требует меньше внутренней логики и, следовательно, дешевле, быстрее, проще в сборке, потребляет меньше энергии и может быть физически меньше; это соответствует основным принципам вычислений с сокращенным набором команд , а также является преимуществом во встроенных системах . Другое преимущество состоит в том, что, поскольку для адресации устройств используются обычные инструкции памяти, все режимы адресации ЦП доступны для ввода-вывода, а также для памяти, и инструкции, которые выполняют операцию ALU непосредственно с операндом памяти (загрузка операнд из ячейки памяти, сохранение результата в ячейке памяти или и то, и другое) также можно использовать с регистрами устройства ввода-вывода. Напротив, инструкции ввода-вывода с отображением портов часто очень ограничены, часто обеспечивая только простые операции загрузки и сохранения между регистрами ЦП и портами ввода-вывода, чтобы, например, добавить константу к отображаемым портам Регистру устройства потребуются три инструкции: считывание порта в регистр ЦП, добавление константы в регистр ЦП и запись результата обратно в порт.

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

Ввод-вывод с отображением памяти предпочтительнее в архитектурах на базе x86, поскольку инструкции, выполняющие ввод-вывод на основе порта, ограничены одним регистром: EAX, AX и AL - единственные регистры, в которые можно перемещать данные или из них, и либо непосредственное значение размера байта в инструкции, либо значение в регистре DX определяет, какой порт является портом источника или порта назначения передачи. Поскольку любой регистр общего назначения может отправлять или получать данные в или из памяти и устройств ввода-вывода с отображением в память, ввод-вывод с отображением в память использует меньше инструкций и может работать быстрее, чем ввод-вывод порта. AMD не расширила инструкции ввода-вывода порта при определении архитектуры x86-64 для поддержки 64-битных портов, поэтому 64-битные передачи не могут выполняться с использованием ввода-вывода порта.

Барьеры памяти

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

Недостаточная дальновидность в выборе областей ввода-вывода с отображением в память привела ко многим барьерам, связанным с объемом оперативной памяти, в старых поколениях компьютеров. Разработчики редко ожидали, что машины вырастут, чтобы полностью использовать теоретическую емкость ОЗУ архитектуры, и поэтому часто использовали некоторые старшие биты адресного пространства в качестве селекторов для функций ввода-вывода с отображением памяти. Например, барьер в 640 КБ в IBM PC и его производных связан с резервированием области от 640 до 1024 КБ (64 КБ сегментов с 10 по 16) для верхней области памяти . Этот выбор изначально имел небольшое влияние, но в конечном итоге ограничил общий объем оперативной памяти, доступный в 20-битном доступном адресном пространстве. 3 ГБ барьер и PCI отверстие подобные проявления этого с 32-битовых адресных пространств, обостренных деталей X86 процесса загрузки и MMU дизайна. 64-битные архитектуры часто технически имеют аналогичные проблемы, но они редко имеют практические последствия.

Примеры

Пример карты памяти системы
Диапазон адресов ( шестнадцатеричный ) Размер Устройство
0000–7FFF 32 КБ баран
8000–80FF 256 байт Ввод / вывод общего назначения
9000–90FF 256 байт Звуковой контроллер
A000 – A7FF 2 КБ ОЗУ видеоконтроллера / текстового дисплея
C000 – FFFF 16 КБ ПЗУ

Простая система, построенная на 8-битном микропроцессоре, может предоставлять 16-битные адресные строки, позволяя адресовать до 64  кибибайт (KiB) памяти. В такой системе первые 32 КиБ адресного пространства могут быть выделены для оперативной памяти (RAM), еще 16 КиБ для постоянной памяти (ROM), а оставшаяся часть - для множества других устройств, таких как таймеры, счетчики, видеодисплей. чипы, устройства для генерации звука и т. д.

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

Предполагая, что четвертый регистр видеоконтроллера устанавливает цвет фона экрана, ЦП может установить этот цвет, записав значение в ячейку памяти A003, используя свою стандартную инструкцию записи в память. Используя тот же метод, графики можно отображать на экране, записывая значения символов в специальную область ОЗУ видеоконтроллера. До появления дешевой оперативной памяти, которая позволяла использовать растровые дисплеи , этот метод символьных ячеек был популярным методом для компьютерных видеодисплеев (см. Текстовый пользовательский интерфейс ).

Основные типы декодирования адресов

Типы декодирования адресов, при которых устройство может полностью или не полностью декодировать адреса, включают следующее:

Полное (исчерпывающее) декодирование
Отображение 1: 1 уникальных адресов в один аппаратный регистр (место в физической памяти). Включает проверку каждой строки адресной шины .
Неполное (частичное) декодирование
n: 1 отображение n уникальных адресов на один аппаратный регистр. Частичное декодирование позволяет ячейке памяти иметь более одного адреса, что позволяет программисту ссылаться на ячейку памяти, используя n разных адресов. Это также может быть сделано для упрощения аппаратного обеспечения декодирования за счет использования более простой и часто более дешевой логики, которая проверяет только некоторые адресные строки, когда требуется не все адресное пространство ЦП. Обычно само декодирование является программируемым, поэтому система может при необходимости переконфигурировать свою собственную карту памяти, хотя это более новая разработка и, как правило, противоречит цели удешевления.
Синонимы: сворачивание, многократное отображение, частичное отображение, псевдоним адреса .
Линейное декодирование
Адресные строки используются напрямую, без какой-либо логики декодирования. Это делается с помощью таких устройств, как RAM и ROM, которые имеют последовательность адресных входов, и периферийных микросхем, которые имеют аналогичную последовательность входов для адресации банка регистров. Линейная адресация редко используется сама по себе (только когда на шине мало устройств, поскольку использование чисто линейной адресации для более чем одного устройства обычно приводит к потере большого количества адресного пространства), но вместо этого она сочетается с одним из других методов для выбора устройства или группа устройств, в которой линейная адресация выбирает один регистр или ячейку памяти.

Ввод-вывод порта через драйверы устройств

В компьютерах под управлением Windows к памяти также можно получить доступ через специальные драйверы, такие как DOLLx8KD, который предоставляет доступ к вводу-выводу в 8-, 16- и 32-разрядных версиях на большинстве платформ Windows, начиная с Windows 95 и заканчивая Windows 7. Установка ввода-вывода драйверы портов обеспечат доступ к памяти, активируя драйверы с помощью простых вызовов DLL, разрешающих ввод-вывод порта, а когда он не нужен, драйвер может быть закрыт для предотвращения несанкционированного доступа к портам ввода-вывода.

Linux предоставляет утилиту pcimem для чтения и записи адресов MMIO. Ядро Linux также позволяет отслеживать доступ к MMIO из модулей (драйверов) ядра с помощью средства отладки ядра mmiotrace . Чтобы включить это, ядро ​​Linux должно быть скомпилировано с включенной соответствующей опцией. mmiotrace используется для отладки драйверов устройств с закрытым исходным кодом.

Смотрите также

Рекомендации