Что именно это означает, когда кто-то говорит «отображение памяти», «отображение ввода-вывода», «ввод-вывод с отображением памяти» и «ввод-вывод с сопоставлением портов»?

Все эти слова немного сбивают меня с толку, поскольку я новичок. Я понимаю, что в основном микроконтроллер - это процессор + память для хранения данных (ОЗУ) + память данных ИЛИ откуда выполняются инструкции (ПЗУ / флэш-память) + периферийные устройства.

  1. Как я должен визуализировать отображение?
  2. Отображение выполняется в оперативной памяти?
  3. Если да, то разве это не память? Как об этом узнает процессор?
  4. Выполняется ли это сопоставление, когда я включаю контроллер, или его выполняет человек/компания, изготовившая контроллер?

если это действительно глупый вопрос или широкий, дайте мне знать. Я бы попробовал сузить.

Вы путаете адресное пространство памяти с самой памятью.
Какую литературу или учебники по компьютерной архитектуре вы переварили, прежде чем запостить этот вопрос?
Для вопросов терминологии или вопросов типа "что это такое?" всегда сначала обращайтесь к Википедии, например en.wikipedia.org/wiki/Memory-mapped_I/O . Раньше он охватывал большинство аспектов вопроса. Затем, если что-то неясно или у вас есть реальная проблема, задайте вопрос о проблеме или этом очень конкретном аспекте. Так вы сэкономите свое время и получите информацию в более структурированном виде.
@IgnacioVazquez-Abrams клянусь, я сделал
@AliChen 8085 книг по архитектуре и некоторые ответы на этом сайте, которые меня смутили. У меня действительно были проблемы с пониманием того, как жесткие диски ПК помещают ОС / исполняемые программы в оперативную память. Я, хотя адрес памяти жесткого диска отображается на ОЗУ
Дисковод (жесткий, гибкий или оптический) — это устройство ввода-вывода — оно будет иметь некоторые регистры управления и данных, которые занимают несколько ячеек памяти или ячеек ввода-вывода. Программа будет выдавать команды контроллеру диска, например «дайте мне блок данных, начиная с дорожки X, сектор Y», и контроллер диска будет считывать эти данные с диска и помещать их в регистр данных, где программа может их видеть. . Вы не можете запустить программу прямо с диска.
"как жесткие диски ПК помещают ОС/исполняемые программы в оперативную память" - это другой вопрос. Диски обычно имеют гораздо больший объем памяти, чем ОЗУ, поэтому их нельзя напрямую отобразить в прямое пространство памяти. Только некоторые небольшие порции (программы) могут быть переданы и ЗАГРУЖЕНЫ в оперативную память для выполнения.

Ответы (4)

Я думаю, что эти термины в основном используются с микропроцессорами, а не с микроконтроллерами.

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

Некоторые микропроцессоры (Intel 8085 и родственные им) имеют отдельное адресное пространство для использования устройством ввода-вывода, не являющееся частью обычного пространства памяти, и ограниченное количество инструкций для чтения или записи в это адресное пространство. Устройства ввода-вывода, использующие это пространство, будут «сопоставлены вводом-выводом».

Интересный. И как вы определяете разницу в отображении между «микроконтроллером» и «микропроцессором»? Кроме того, в первом случае отображение часто предопределяется (фиксируется) производителем ИС, а во втором случае отображение должно выбираться самим разработчиком системы? ИМО, концепция отображения такая же.
С микроконтроллером шины адреса и данных обычно недоступны извне, поэтому у пользователя нет другого выбора, кроме как получить доступ к портам ввода-вывода, как задумал производитель, поэтому говорить о режимах доступа ввода-вывода с микроконтроллерами особого смысла нет. . С микропроцессорами адресные шины и шины данных, а также необходимые линии управления доступны пользователю, поэтому он может выбирать, как реализовать ввод-вывод (но некоторые микроконтроллеры не имеют специального пространства ввода-вывода и инструкций, поэтому вы застряли с вводом-выводом с отображением памяти).

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

Оба типа отображения используют одну и ту же адресную (16 линий) и шину данных (8 линий). Чтобы сообщить внешней логике, адресуете ли вы память или ввод-вывод, у процессора есть два контакта; один называется MREQ, а другой — IORQ. Когда процессор переводит MREQ в низкий уровень, внешняя логика конфигурируется для распознавания того, что это адрес памяти на адресной шине, и подключает память к шине данных после декодирования адресной шины для чтения или записи данных (которые контролируются RD). (чтение) и WR (запись), один из которых будет иметь низкий уровень для операции чтения или записи.

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

Если процессор одновременно устанавливает низкий уровень MREQ и IORQ, он неисправен. Выброси это. То, что он вытягивает вниз, зависит от отдельных инструкций в наборе инструкций, используемом программистом.

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

Любопытная странность Z80 заключается в том, что в его спецификации заявлено, что он использует только 8 бит адресной шины для ввода-вывода, управляемого регистром C, но на самом деле он кодирует все 16, используя пару BC (в инструкциях ввода и вывода). Что приятно.

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

  • отображение памяти
  • Отображение ввода-вывода
  • Ввод-вывод с отображением памяти
  • Ввод-вывод с сопоставлением портов

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

РЕДАКТИРОВАТЬ: я собираюсь добавить этот абзац в свой ответ, предполагая, что то, что вы просите, больше ориентировано на микроконтроллеры (PIC, AVR и т. д.). Я коснулся этого немного, чтобы ответить на ваш вопрос номер четыре. Отображение/адреса здесь в основном фиксируются разработчиками чипа, и обычно имеется блок управления декодером адреса/памятью (не в строгом смысле MMU), который отправляет данные в нужное место на внутренней шине. То есть, если вы записываете в регистр управления UART, это влияет на триггеры, которые физически отвечают за эти биты, если вы читаете с адреса SRAM, он возвращает данные непосредственно из него.

В любом случае, сопоставление - это одна и та же общая задача - взять конкретный адрес и придать ему особое значение / направить его куда-нибудь. Например, на платформе x86 адрес пространства ввода-вывода 0x3F8 указывает на регистр последовательного порта в системе. Когда вы записываете или читаете с этого адреса (outb()/inb()), вы физически изменяете состояние 8 битов (реализованных, вероятно, как SRAM или триггеры), которые содержат данные на этом последовательном порту.

Аналогично, для ввода-вывода с отображением памяти у вас может быть устройство PCI, которое запрашивает некоторый объем памяти. Я мог бы спроектировать устройство, в котором, если вы записываете байт по определенному адресу, это меняет состояние 8 светодиодов — 0x00, все выключены, 0xFF, все горят. Ваш MMU (блок управления памятью) отвечает за распознавание того, что адрес памяти, который вы также написали, предназначен для чего-то на шине PCI.

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

Итак, вернемся к вашим вопросам...

1) Как я должен визуализировать отображение?

Просто это -- сопоставление. Это карта, которая сообщает вам, как добраться от вашего начала (адрес, скажем, 0xE0000000) до места назначения (возможно, устройство PCI, возможно, определенное место в физической ОЗУ).

2) Отображение делается на ОЗУ?

Нет. Физическая RAM — скажем, на самом низком уровне отдельный конденсатор, представляющий один бит в DRAM, — это одно из многих назначений, которые также могут быть сопоставлены. Каждый отдельный адрес памяти не обязательно соответствует физическому биту, хранящемуся где-то.

Если у вас есть процессор с внешней шиной адреса/данных (или какой-либо другой большой параллельной шиной), то операции чтения/записи будут напрямую транслироваться в трафик на этом интерфейсе — большинство людей в наши дни будут использовать SPI/I2C/другие последовательные протоколы. , но нередко имелись большие встроенные системы, в которых параллельные SRAM подключались через 8- или 16-битный параллельный интерфейс (AD0-AD15).

3) Если да, то разве это не сама память? Как об этом узнает процессор?

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

4) Это сопоставление выполняется, когда я включаю контроллер, или это делается лицом/компанией, изготовившей контроллер?

В кремнии есть фиксированные отображения (очень верно для встроенных микроконтроллеров), где вы можете просмотреть таблицу данных и получить фиксированные адреса для управляющих регистров, периферийных устройств и т. д. Архитекторы чипа разработали карту памяти, которая имела для них смысл, и обычно оставляет положения для разных моделей с разными периферийными устройствами/объемами памяти (т. е. у моделей 32 КБ и 64 КБ одного и того же чипа все их регистры/периферийные устройства могут находиться в одних и тех же местах, и отличается только адрес памяти для ОЗУ).

Для более сложных систем, где все может перемещаться (например, PCI plug and play), распределение адресов памяти является динамическим и выполняется программным обеспечением.

Это кажется вполне актуальным

Это интересное упражнение. Предлагаю свой вариант.

1) Как я должен визуализировать отображение? - так же, как карта улицы, с единицами хранения (память хранит данные!), где каждая единица имеет уникальный почтовый адрес. Память может быть организована в виде «страниц». Это похоже на ту же карту улиц с тем же диапазоном адресов, только в другом городе с другим почтовым индексом (селектор страниц).

2) Отображение делается на ОЗУ? - не уверен, что вы имеете в виду «в ОЗУ», но отображение выполняется с помощью специального логического устройства, называемого «декодером адреса». Это как почтовое отделение. ЦП выдает номер (адрес хранилища), а декодер «открывает» соответствующий «блок хранения». Затем ЦП может сохранить некоторые данные или может извлечь сохраненные данные.

3) Если да, то разве это не сама память? - нет, см. (2) выше. Кто-то («декодер адреса») должен просмотреть номер (запрошенный адрес), просмотреть карту и открыть нужное место хранения («дверь») для операции чтения/записи.

3а) Как об этом узнает процессор? - Это не. Контроллер памяти просто выдает данные по «карте». Но программист должен знать, какая область отображена и какую «единицу памяти» использовать.

4) Это сопоставление выполняется, когда я включаю контроллер, или его выполняет человек/компания, изготовившая контроллер? - это зависит. Меньшие микроконтроллеры имеют карту, жестко закодированную в аппаратном обеспечении. Процессоры большего размера с устанавливаемой пользователем памятью (например, модули DIMM в ПК) должны определять особенности установленных модулей памяти и настраивать контроллер памяти (устанавливать диапазоны декодера адресов и другие параметры, такие как время доступа и т. д.) во время инициализации в BIOS.

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

Существуют и другие пространства, такие как «пространство конфигурации», которые могут иметь специальный режим ограниченного доступа. Его также можно отобразить в адресное пространство памяти.