То, что вы описываете в своем посте, является «типичным» сценарием, особенно если ввод-вывод находится на другой шине, нежели процессор (например, PCI / PCI), или вы говорите с контроллером, а не с реальным устройством ввода-вывода, Реальность, конечно, намного сложнее.
Аппаратное обеспечение может быть спроектировано так, чтобы реагировать любым способом, который разработчик аппаратного обеспечения хочет прочитать / записать запросы от ЦП.
Например, можно:
Сделайте так, чтобы простой доступ (чтение или запись) к адресу ввода-вывода заставлял устройство что-то делать.
Сделайте так, чтобы чтение и запись на один и тот же адрес ввода / вывода фактически обеспечивали доступ к различным регистрам или функциям на устройстве.
Простые устройства могут не нуждаться в регистре данных, управления и статуса. Параллельный порт ПК является примером. Он управляется одним байтом в адресном пространстве ввода / вывода.
Конечно, любые такие устройства будут напрямую адресованы процессором, а не «позади» контроллера. Параллельный порт, являющийся устройством ISA старой школы. Хотя в наши дни это на самом деле шина LPC, но LPC разработан, чтобы работать как ISA.
Вышеупомянутое было гораздо более распространенным явлением в эпоху до появления ПК, и я считаю, что оно распространено на платформах, отличных от x86, таких как ARM и MIPS.
Сложным контроллерам (большинству из них) понадобится дополнительный механизм, позволяющий вам указать, какое устройство подключено к контроллеру, с которым вы хотите общаться. I2C такой.