Пожираемый Элизиум,
Я постараюсь ответить на ваши вопросы один за другим, но учтите, что было бы неплохо получить в руки учебник для курса по ОС или вводный курс по компьютерной архитектуре.
MMU состоит из некоторой аппаратной логики и состояния, целью которых, действительно, является создание физического адреса и предоставление / получение данных в контроллер памяти и из него. На самом деле, работа по переводу памяти - это то, что решается взаимодействием аппаратных и программных (ОС) механизмов (по крайней мере, на современных ПК). Как только физический адрес получен, ЦП по существу выполнил свою работу и теперь отправляет адрес на шину, которая в какой-то момент подключена к реальным чипам памяти. Во многих системах эта шина называется Front-Side Bus (FSB), которая, в свою очередь, подключена к контроллеру памяти. Этот контроллер берет физический адрес, предоставленный процессором, и использует его для взаимодействия с микросхемами DRAM, и в конечном итоге извлекает биты в правильных строках и столбцах массива памяти. Затем данные отправляются обратно в процессор, который теперь может работать с ним. Обратите внимание, что я не включаю кеширование в этом описании.
Так что нет, MMU не взаимодействует напрямую с ОЗУ, которое, как я полагаю, вы используете для обозначения физических микросхем DRAM. И вы не можете сказать MMU, что вы хотите 8 байтов, или 24 байта, или что-то еще, вы можете только предоставить ему адрес. Сколько байтов вам достается, зависит от того, на каком компьютере вы находитесь, и от того, адресуется ли он по байтам или по словам.
Ваш последний вопрос побуждает меня напомнить вам: MMU на самом деле является частью процессора - он расположен на том же кремниевом кристалле (хотя это было не всегда).
Теперь давайте возьмем ваш пример с ошибкой страницы. Предположим, что наше приложение пользовательского уровня хочет, как вы сказали, установить someAddress = 10, я сделаю это поэтапно. Давайте предположим, что someAddress равен 0xDEADBEEF, и давайте пока проигнорируем кэши.
1) Приложение выдает инструкцию store для 0xsomeAddress, которая в x86 может выглядеть примерно так:
mov %eax, 0xDEADBEEF
где 10 - значение в регистре eax.
2) 0xDEADBEEF в этом случае является виртуальным адресом, который необходимо перевести. В большинстве случаев трансляция виртуальных адресов будет доступна в аппаратной структуре, называемой буфером преобразования взгляда (TLB), который очень быстро предоставит нам этот перевод. Как правило, это можно сделать за один такт. Если трансляция находится в TLB, называемом попаданием TLB, выполнение может быть немедленно продолжено (т.е. физический адрес, соответствующий 0xDEADBEEF и значению 10, отправляется на контроллер памяти для записи).
3) Давайте предположим, что перевод не был доступен в TLB (так называемый промах TLB). Затем мы должны найти перевод в таблицах страниц, которые представляют собой структуры в памяти, структура которых определяется аппаратным обеспечением и управляется ОС. Они просто содержат записи, которые отображают виртуальный адрес на физический (точнее, номер виртуальной страницы на физический номер страницы). Но эти структуры также находятся в памяти, и поэтому должны иметь адреса! Аппаратное обеспечение содержит специальный регистр, называемый cr3, который содержит физический адрес таблицы текущей страницы. Мы можем индексировать в эту таблицу страниц, используя наш виртуальный адрес, поэтому аппаратное обеспечение принимает значение в cr3, вычисляет адрес, добавляя смещение, и уходит в память, чтобы получить запись таблицы страниц (PTE). Этот PTE будет (мы надеемся) содержать физический адрес, соответствующий 0xDEADBEEF, и в этом случае мы помещаем это отображение в TLB (чтобы нам больше не приходилось ходить по таблице страниц) и продолжаем наш путь.
4) Но нет! Что если в таблицах страниц для 0xDEADBEEF нет PTE? Это ошибка страницы, и именно здесь операционная система вступает в игру. PTE, который мы получили из таблицы страниц, существовал, поскольку в нем был (допустим, допустимый адрес памяти для доступа, но ОС еще не создала для него отображение VA-> PA, поэтому он должен был бы установить бит) чтобы указать, что это недействительно. Аппаратное обеспечение запрограммировано таким образом, что при обнаружении этого недопустимого бита при доступе оно генерирует исключение, в данном случае сбой страницы.
5) Исключение заставляет аппаратное обеспечение вызывать ОС путем перехода в хорошо известное место - фрагмент кода, называемый обработчиком. Может быть много обработчиков исключений, и обработчик ошибок страницы является одним из них. Обработчик ошибок страницы будет знать адрес, вызвавший ошибку, потому что он где-то хранится в регистре, и поэтому создаст новое отображение для нашего виртуального адреса 0xDEADBEEF. Это будет сделано путем выделения свободной страницы физической памяти и последующего произнесения «все виртуальные адреса между VA x и VA y будут сопоставлены с некоторым адресом в этой недавно выделенной странице физической памяти». 0xDEADBEEF будет где-то в этом диапазоне, поэтому отображение теперь безопасно в таблицах страниц, и мы можем перезапустить инструкцию, которая вызвала ошибку страницы (mov).
6) Теперь, когда мы снова пройдемся по таблицам страниц, мы найдем отображение, и у извлекаемого PTE будет хороший физический адрес, который мы хотим сохранить. Мы передаем это значение 10 контроллеру памяти, и все готово!
Кэши немного изменят эту игру, но я надеюсь, что это послужит иллюстрацией того, как работает пейджинг. Опять же, было бы очень полезно проверить некоторые книги по ОС / компьютерной архитектуре. Я надеюсь, что это было ясно.