"Чтение байта из порта ввода-вывода" и "Чтение байта из адреса памяти"?
Для упрощения обсуждения я предполагаю, что существует только один поток выполнения. Следующее - только мои дикие предположения:
1, если процессор считывает байт из адреса памяти, то он может повторно считывать одно и то же значение с одного и того же адреса.
2, если процессор считывает байт из порта несколько раз, то он может считывать разные значения каждый раз.
Я думаю, что разница между этими двумя способами заключается в том, что контроллер порта может автоматически обновлять значение порта после каждой операции чтения.
Однако я не смог найти ни одного учебника, явно поддерживающего мои высказывания.
Я прав?
1 ответ
Инструкции ввода-вывода должны взаимодействовать с оборудованием. Поэтому инструкции ввода-вывода в общем случае (и не должны) соответствовать семантике памяти. Вместо этого семантика зависит от аппаратного обеспечения (и соответствующего протокола), с которым они взаимодействуют. Не думайте о пространстве ввода-вывода как о памяти.
Инструкции памяти могут обращаться к памяти, а также к вводу-выводу памяти. Когда они обращаются к IO, отображенному в памяти, они ведут себя как инструкции IO. Семантика памяти применяется только тогда, когда они обращаются к реальной памяти. Это означает, например, что чтение в ячейку памяти всегда возвращает последнее значение, которое было записано в эту ячейку.
Для ЦП важно различать адресные пространства, используемые для ввода-вывода с отображением в память и для реальной памяти. Например, данные из сопоставленного с памятью ввода-вывода не должны храниться в кэше, а инструкции в памяти не должны спекулятивно обращаться к расположению сопоставленного с памятью ввода-вывода. Из-за этого доступ к памяти IO-пространства значительно медленнее, чем доступ к реальной памяти.
Чтобы различать IO с отображенной памятью и реальную память, процессор обычно использует таблицу страниц, но существуют и другие механизмы, такие как регистры диапазона типов памяти.
Не в последнюю очередь может быть другое оборудование, способное записывать в память. Примерами являются системы с несколькими ядрами и / или прямым доступом к памяти. Эти системы должны быть осведомлены друг о друге и использовать протокол когерентности кэша для поддержания правильной семантики памяти. Конечно, это также требует различения между отображенной памятью ввода-вывода и реальной памятью.
Вывод состоит в том, что реальная память также ведет себя как память и соответствует семантике памяти. IO и отображение памяти IO может вести себя так, как хочет.