В чем разница между аппаратным регистром и регистром с отображением в памяти?
Это было озадачивающе, поэтому я выложу все это здесь. По-видимому, через MMIO вы можете получить доступ к внешним устройствам, используя определенный отображенный в памяти адрес, который затем будет перенаправлен на само это устройство (через запись, пакет команд и т. Д.). Однако я слышал смешанные описания как аппаратных регистров (например, как регистр CPU/GPU, или даже звуковых чипов), так и регистров с отображением в памяти, используемых взаимозаменяемо. Это одно и то же?
Когда вы говорите "регистр с отображением в памяти", вы не имеете в виду адрес, с которого байт данных перенаправляется на определенный адрес внутри этого устройства (например, теоретический: адрес GPU 0x500 предназначен для регистра TEXTURE_BUFFER). Однако устройство с отображенной памятью не может отобразить физический регистр внутри ОЗУ.
В общем, в чем разница между регистром, отображаемым в памяти, и просто аппаратным регистром?
3 ответа
Аппаратные регистры с отображением в памяти доступны как ОЗУ. Все процессоры имеют специальные инструкции для чтения / записи в ОЗУ, и эти же инструкции используются для доступа к отображенным в памяти регистрам.
Аппаратные регистры в общем случае не должны отображаться в памяти, это просто общее соглашение.
x86 предоставляет два адресных пространства, в которых для чтения и записи используются две отдельные группы инструкций - первое - это ОЗУ или пространство памяти (все MOV инструкции), второе пространство ввода / вывода (используя IN а также OUT инструкции). На x86 аппаратные регистры могут появляться в любом месте.
Вам также может понадобиться пройти уровень косвенности, чтобы действительно достичь аппаратного регистра. Устройство может отображать только "порт" в памяти или пространстве ввода / вывода. Затем вам нужно записать регистрационный номер на адрес, а затем данные, которые вы хотите записать на другой адрес. Затем происходит запись. Старый 8563 VDC в Commodore 128 работал так. ОЗУ CMOS и некоторые регистры PCI также работают следующим образом.
Аппаратные регистры ЦП, разумеется, не отображаются в памяти (ни в x86, ни в любом другом обычном ЦП), это еще один пример аппаратного регистра.
Современные ЦП имеют "регистры, специфичные для модели" (MSR), и они считываются / записываются с использованием своих собственных инструкций (RDMSR, WRMSR). Другие регистры процессора имеют свои собственные инструкции (LGDT, MOV xx, CR2базовый EAX/RAX и т. д.)
Регистры ввода-вывода с отображением в память и регистры с отображением в памяти - это не одно и то же, и они не так тесно связаны.
Отображаемый в память ввод / вывод использовался, например, на ранних ПК, где часть адресного пространства ОЗУ была отображена в буфер дисплея. (И в некоторых продуктах обычная ОЗУ фактически использовалась для буфера дисплея, в отличие от наличия буфера на плате адаптера дисплея.) В других случаях аппаратное устройство, такое как контроллер дисковода, использовало бы отображенную в памяти адресацию для установки / чтения своего управления регистры. (И я предполагаю, что современные графические карты все еще отображают память дисплея в адресное пространство графического процессора, хотя я не знаю, что это факт.)
"Регистры с отображением в памяти" могут означать несколько вещей. Одним из них может быть приведенный выше пример контроллера дисковода с отображаемыми в памяти управляющими регистрами. Другой, совершенно другой случай - это процессор, который имеет свои регистры в оперативной памяти. Это было довольно распространенным явлением на ранних (с 50-х до начала 70-х) процессорах, поскольку оно значительно уменьшало количество деталей, а также позволяло использовать некоторые "умные" методы программирования. В некоторых случаях процессор был доступен в двух моделях: одна с отображаемыми в память регистрами, а другая с (более быстрыми) "аппаратными" регистрами.
И в некоторых случаях это было неоднозначно относительно того, что было регистром, а что нет, как в "стековых" машинах Берроуза, где вместо стандартных регистров использовался "стек" (в IIRC есть несколько различных схем для " слежка за "регистрами в оперативной памяти".
Мое обоснованное предположение основано на чем-то, что лектор по информатике рассказал нам из основной книги, но она соответствует тому, что написано на странице Википедии в MMIO. Процессор не знает, на какое устройство он пишет. Насколько это возможно, все это также может быть RAM-памятью. Некоторые устройства используют определенное место в оперативной памяти. Я полагаю, это будет то, что означает аппаратное отображение. Но может быть место памяти в самом аппаратном устройстве, вероятно, должно быть на самом деле.. для передачи данных. Процессору не нужно ждать, пока он пишет в место в ОЗУ, которое сопоставлено с регистром устройства. Регистр - это область памяти в ЦПУ или на аппаратном устройстве. не в оперативной памяти.
Чтобы быть более конкретным в вашем вопросе. Регистр находится в CPU или в аппаратном периферийном устройстве. Не в ОЗУ / основной памяти. Местоположение в ОЗУ / основной памяти просто называется местоположением, а не регистром. Местоположение в CPU или периферийном устройстве обычно не называется местоположением или местом в памяти и всегда называется регистром, это его специальное и правильное имя. Если регистр сопоставлен с памятью, как, без сомнения, многие регистры аппаратного периферийного устройства, то я был бы совершенно уверен, что это означает регистр с отображением в памяти.
Итак, если аппаратный регистр не сопоставлен с памятью, например, если процессор записывает в него напрямую, он не сопоставляется с памятью. Из этой статьи в Википедии видно, что, возможно, если эти адреса расположены в специальном пространстве и требуют специальных выводов или специальной шины, то эти места могут находиться в памяти, но не в MMIO, а не в отображаемой памяти.
Глядя на эту страницу википедии... то есть PMIO, то есть считается, что он не отображен в памяти. Когда регистры ЦП сопоставляются не с обычными ячейками памяти, а со специальным адресным пространством. Таким образом, это не регистр ЦП общего назначения, который может записывать данные на устройство или в память, в зависимости от того, какой адрес помещен в адресную шину. В PMIO (т.е. не в регистре с отображением в памяти) регистр отображается в определенную ячейку памяти устройства, которую, я полагаю, они называют портом.