Каждое устройство имеет своего рода внутренние регистры, которые программное обеспечение (драйверы устройств) используют для контроля состояния устройства, запроса устройства и определения состояния.
Существует 2 основных способа, которыми программное обеспечение (устройство) драйверы) могут обращаться к внутренним регистрам устройства - сопоставляя эти регистры с физическим адресным пространством ЦП (так же, как память отображается с физическим адресным пространством ЦП); и предоставляя специальный механизм (например, порты ввода-вывода на 80x86).
Чтобы понять преимущества / недостатки; Лучше всего подумать о характере связи между процессорами и памятью. Это общение должно быть очень быстрым, потому что все зависит от него; и (для электроники) «быстрый» означает простой, с короткими длинами шины (из-за таких факторов, как емкость и сопротивление) и с наименьшими нагрузками (потому что каждая нагрузка увеличивает ток, необходимый для управления шиной, что означает большие транзисторы для обработки чем выше ток, тем больше времени требуется для переключения транзисторов). Конечно, есть еще несколько хитростей, чтобы сделать его еще быстрее, начиная с кешей (и, возможно, когерентности кеша), предварительной выборки и спекулятивного выполнения, чтобы загружать процессор, пока он ожидает данные.
Предоставляя выделенный механизм (например, порты ввода-вывода на 80x86) все это кажется хорошим; потому что у вас было бы разделение между шиной высокоскоростной памяти и всеми (намного более медленными) вещами.
Что если мы ударим громкий беспорядок прямо посреди наиболее критичного к производительности пути данных (между ЦП и RAM), так что программное обеспечение (драйверы устройств) могут получать доступ к внутренним регистрам устройств, используя вместо этого сопоставленный с памятью ввод-вывод? Ох, мальчик ...
Для начала вы бы рассмотрели некоторые основные сложности для кэшей (как минимум, как-то сказать, что эти области должны кэшироваться, а эти области не должны). t кэшироваться "со всеми логами c, чтобы выяснить, какие обращения кешированы / не кэшированы, и его дополнительная задержка); плюс более серьезные осложнения для самого процессора (может / он должен попытаться выполнить предварительную выборку? может / должен ли он умозрительно выполняться после чтения / записи?); плюс более медленная (длиннее при большей нагрузке) и / или более дорогая шина для обработки «кто знает, какие устройства могут быть подключены», вероятно, с некоторой дополнительной болью (состояния ожидания и т. д. c), чтобы иметь дело с устройствами, которые работают намного медленнее чем память. Это звучит как невероятно плохая идея.
Однако оказывается, что многие устройства могут получить выгоду от возможности прямого доступа к шине памяти (используя мастеринг шины / DMA для передачи данных между устройством и ОЗУ). напрямую, а не для ввода-вывода с отображением в память), так что вы, в основном, в конечном итоге захотите использовать эту более медленную шину, и вы в основном захотите решить и все другие сложности.
Если вы посмотрите на историю (на минимум для 80х86); вы обнаружите постепенный переход от «простого, главным образом с использованием портов ввода-вывода» к «чрезвычайно сложному, главным образом, с использованием ввода-вывода с отображением памяти».
Зачем нам нужен ввод-вывод с отображением памяти?
Нет, это не является строгой необходимостью (но гораздо приятнее, если вы готовы принять последствия производительности / сложности).