Зачем нам нужен ввод-вывод в память? - PullRequest
1 голос
/ 04 февраля 2020

Зачем нам нужен IO с отображением в памяти? Из того, что я узнал в классе CS, MMIO абстрагируется от конкретных c инструкций для управления устройством. Но если управляющие регистры устройства (и, следовательно, что каждая ячейка памяти в своей части адресного пространства) зависит от марки и модели устройства, что получится в плане абстракции?

Ответы [ 2 ]

2 голосов
/ 04 февраля 2020

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

В типичном ЦП все ядра будут подключены к общей шине, которая позволяет ядрам считывать / записывать в основную память и, возможно, совместно использовать кэши. Однако шина имеет отношение c к источнику, месту назначения и содержимому данных. Таким образом, передачи по шине могут go на разные контроллеры памяти, разные ядра, кеши, .ect. В результате разработчики оборудования могут просто подключить устройства ввода-вывода к этой шине, и доступ к устройствам в конечном итоге будет осуществляться через те же механизмы, что и ОЗУ. Это дает ряд преимуществ:

  • Оборудование ввода-вывода теперь может напрямую извлекать данные из ОЗУ или других устройств ввода-вывода без участия ядер в циклах мастеринга
  • Аппаратное кэширование процессора может выполнять транзакции sn oop генерируется IO для обеспечения согласованности кэшей
  • Процессоры могут выполнять полезную работу во время перемещения данных по шине вместо ядер, ожидающих завершения каждой загрузки / сохранения.
  • Никаких специальных Для IO

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

0 голосов
/ 05 февраля 2020

Каждое устройство имеет своего рода внутренние регистры, которые программное обеспечение (драйверы устройств) используют для контроля состояния устройства, запроса устройства и определения состояния.

Существует 2 основных способа, которыми программное обеспечение (устройство) драйверы) могут обращаться к внутренним регистрам устройства - сопоставляя эти регистры с физическим адресным пространством ЦП (так же, как память отображается с физическим адресным пространством ЦП); и предоставляя специальный механизм (например, порты ввода-вывода на 80x86).

Чтобы понять преимущества / недостатки; Лучше всего подумать о характере связи между процессорами и памятью. Это общение должно быть очень быстрым, потому что все зависит от него; и (для электроники) «быстрый» означает простой, с короткими длинами шины (из-за таких факторов, как емкость и сопротивление) и с наименьшими нагрузками (потому что каждая нагрузка увеличивает ток, необходимый для управления шиной, что означает большие транзисторы для обработки чем выше ток, тем больше времени требуется для переключения транзисторов). Конечно, есть еще несколько хитростей, чтобы сделать его еще быстрее, начиная с кешей (и, возможно, когерентности кеша), предварительной выборки и спекулятивного выполнения, чтобы загружать процессор, пока он ожидает данные.

Предоставляя выделенный механизм (например, порты ввода-вывода на 80x86) все это кажется хорошим; потому что у вас было бы разделение между шиной высокоскоростной памяти и всеми (намного более медленными) вещами.

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

Для начала вы бы рассмотрели некоторые основные сложности для кэшей (как минимум, как-то сказать, что эти области должны кэшироваться, а эти области не должны). t кэшироваться "со всеми логами c, чтобы выяснить, какие обращения кешированы / не кэшированы, и его дополнительная задержка); плюс более серьезные осложнения для самого процессора (может / он должен попытаться выполнить предварительную выборку? может / должен ли он умозрительно выполняться после чтения / записи?); плюс более медленная (длиннее при большей нагрузке) и / или более дорогая шина для обработки «кто знает, какие устройства могут быть подключены», вероятно, с некоторой дополнительной болью (состояния ожидания и т. д. c), чтобы иметь дело с устройствами, которые работают намного медленнее чем память. Это звучит как невероятно плохая идея.

Однако оказывается, что многие устройства могут получить выгоду от возможности прямого доступа к шине памяти (используя мастеринг шины / DMA для передачи данных между устройством и ОЗУ). напрямую, а не для ввода-вывода с отображением в память), так что вы, в основном, в конечном итоге захотите использовать эту более медленную шину, и вы в основном захотите решить и все другие сложности.

Если вы посмотрите на историю (на минимум для 80х86); вы обнаружите постепенный переход от «простого, главным образом с использованием портов ввода-вывода» к «чрезвычайно сложному, главным образом, с использованием ввода-вывода с отображением памяти».

Зачем нам нужен ввод-вывод с отображением памяти?

Нет, это не является строгой необходимостью (но гораздо приятнее, если вы готовы принять последствия производительности / сложности).

...