Предположим, что у Вас обычный CPU без MMU и Вам надо прочитать содержимое внешней ячейки RAM. Для этого Вы (или компилятор) будете, например, использовать команду LDR. При исполнении этой команды CPU (без MMU/MPU) выставит на внешнюю шину адреса адрес из команды LDR, RAM будет выбрана и дата из соотв. ячейки RAM поступит в CPU - здесь все делается, что называется, в лоб.
Если же у Вас CPU с MMU, то при исполнении той же команды LDR, адрес из нее поступает не на внешнюю шину адреса, а в некоторый "черный ящик" - MMU.
И вот тут выясняется несколько интересных вещей.
Оказывается, что адреса на шине адреса внешней RAM никак не связаны с адресом из команды LDR. Более того, адреса во внешней RAM идут, конечно, подряд, но используются подряд только в пределах небольших блоков памяти (скажем, 4Kb размером) - страниц.
Каждая такая страница, помимо своего прямого содержимого, имеет и дополнительную информацию о себе (эта информация хранится в специально зарезервированной области RAM и используется MMU). В общем случае эта информация содержит номер(ID) процесса, владеющего содержимым страницы и начальный реальный (тот, что задается в командах типа LDR) адрес содержимого страницы.
Таким образом, здесь физический адрес RAM никак не связан с реальным адресом - например, страница, соответствующая адресам из команды LDR 0x40000000..0x40000FFF, находится по физическим адресам RAM 0x100000..0x100FFF или 0x200000..0x200FFF и т.д., причем этот физический адрес непостоянен - см.ниже)
Теперь для чтения внешней ячейки RAM, MMU ищет в RAM страницу, в которой находится требуемый адрес. Если такая страница сейчас в RAM - O.K., если же нет - то генерится exception, по которому нужная страница загружается в RAM (например, с жесткого диска, где она временно хранится). В этом случае, если в RAM нет неиспользуемого места, то одна из страниц из RAM выгружается на жесткий диск - выбор такой страницы производится по некоторому принципу (например, выгружается страница, принадлежащая неактивному процессу и т.п.).
|