Память IO - как устройство IO знает, что значение изменилось?

Как устройство ввода / вывода узнает, что значение в памяти, относящееся к нему, изменилось в отображенном в память вводе / выводе?

Например, скажем, адрес памяти 0 был выделен для хранения цвета фона для устройства VGA. Как устройство VGA узнает, когда мы меняем значение в памяти [0]? Устройство VGA постоянно опрашивает ячейку памяти? Или процессор как-то уведомляет устройство, когда оно меняет значение (и если да, то как?)?

Примером архитектуры является MIPS. Учитывая, что набор инструкций MIPS не имеет in или же out инструкции, я не понимаю, как это могло возможно общаться (при изменении) с устройством VGA в примере. Другой пример - архитектура ARM.

2 ответа

Решение

При отображении в память ввода-вывода выполнение чтения / записи памяти в область памяти устройства приведет к тому, что ЦП выполнит транзакцию с устройством для извлечения / сохранения этого значения - либо непосредственно через шину памяти ЦП, либо через вторичную шина (например, AHB/APB в системах ARM). Эта транзакция памяти напрямую уведомляет устройство об изменении значения; отдельное уведомление не требуется.

Вы предполагаете, что отображаемый в память ввод-вывод отображается нормальной оперативной памятью. Это не вариант. Действительно, эти устройства могут вести себя совершенно иначе, чем в реальной памяти! Например, типичная реализация устройства UART или SPI может иметь один регистр данных, в который можно записывать данные для передачи или считывать данные для получения принятых данных. Точно так же регистры прерываний нередко имеют семантику "очистить при чтении" или "записать 1 для очистки".

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

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

Чтобы определить, как обрабатывать доступ к памяти (чтение или запись), процессор сначала проверяет тип области, которой принадлежит целевой адрес памяти. В любом процессоре MIPS существует как минимум два типа: Uncached и Cached. Регионы MMIO всегда не кэшируются. Запрос доступа к некэшированной памяти напрямую отправляется контроллеру основной памяти без проверки или воздействия на любой из кэшей. Тем не менее, запрос доступа к некэшированной памяти ввода / вывода отправляется контроллеру ввода / вывода, и в конечном итоге запрос достигнет целевого устройства ввода / вывода.

Теперь то, как процессор и устройство ввода-вывода взаимодействуют друг с другом, полностью определяется самим устройством ввода-вывода. Таким образом, устройство ввода-вывода будет иметь спецификацию, которая обсуждает, сколько существует регистров ввода-вывода и как каждый из них должен использоваться. Регистр ввода / вывода может использоваться для хранения флагов состояния, управляющих флагов, данных, которые должны быть считаны или записаны ЦПУ, или некоторой их комбинации. Обратите внимание, что, поскольку регистры ввода / вывода физически являются частью устройства ввода / вывода, тогда устройство ввода / вывода может быть спроектировано так, чтобы оно могло обнаруживать, когда любой из его регистров считывался или записывался, и предпринимать соответствующие действия, если требуется.

Устройство ввода / вывода может отправить прерывание в ЦПУ, чтобы сообщить ему, что некоторые данные доступны, или, возможно, оно требует внимания по какой-либо причине. ЦП также может часто опрашивать устройство ввода-вывода, проверяя некоторые флаги состояния, а затем предпринимать соответствующие действия.

Другие вопросы по тегам