Я не могу говорить по-глобальному, могут быть исключения. Но это общая идея, заключающаяся в том, что интерфейс памяти cpu полностью проходит через mmu (и полностью через кеш или слои кешей).
Для того, чтобы периферийные устройства действительно работали (кэширование регистра состояния при первом чтении, а затем последующее чтение, когда кешированная версия не является реальной версией), вы должны установить, что адресное пространство для периферийного устройства не кэшируется. Так, например, на руке, и, без сомнения, другие, у которых есть отдельный кеш i и d, вы можете включить кеш i без mmu, но включить d-кеш и не иметь этой периферийной проблемы, вам нужно, чтобы mmu и периферийное пространство в таблицах и помечено как не кэшированное.
Мы, разработчики программного обеспечения, решили, хотите ли они, чтобы виртуальный адрес для периферийных устройств соответствовал физическому или переместил периферийные устройства в другом месте, оба имеют свои плюсы и минусы.
Возможно, вы можете создать чип/систему, где адресное пространство автоматически не отправляется через mmu или кеш, что может сделать уродливые шины, и/или чип может иметь отдельные шины для периферийных устройств от ram или другие решения, поэтому вышеизложенное не обязательно является универсальным ответом, но, скажем, рукой, и я бы принял x86, как это работает. На руках, которыми я знаком с кешем mmu и l1, находятся в ядре, l2 находится снаружи и l3 за его пределами, если он у вас есть. l2 буквально между ядром и миром (если у вас есть один (от руки)), но шина axi/amba имеет параметры кэширования, поэтому каждая транзакция может быть или не быть помечена как кэшируемая, если она не кэшируема, то она проходит прямо через l2. если включено, mmu определяет, что если включено для каждой транзакции.