MMU является посредником между операционной системой и физической памятью, или это просто транслятор адресов? - PullRequest
5 голосов
/ 27 января 2011

Я пытаюсь понять, как работает операционная система, когда мы хотим присвоить какое-то значение определенному адресу виртуальной памяти.

Мой первый вопрос касается того, обрабатывает ли MMU все между ЦП и ОЗУ,Это правда?Из того, что можно прочитать из Википедии, я бы сказал так:

Блок управления памятью (MMU), иногда называемый блоком управления выгружаемой памятью (PMMU), является компонентом компьютерного оборудования, отвечающим за обработку доступав память, запрошенную ЦП.

Если это так, как можно сказать MMU, что я хочу получить 8 байтов, 64 или 128 байтов, например?Как насчет записи?

Если это не так, я предполагаю, что MMU просто переводит виртуальные адреса в физические?

Что происходит, когда MMU обнаруживает, что будет то, что мы называемотказ страницы?Я предполагаю, что он должен сообщить об этом ЦПУ, чтобы ЦП загружал саму страницу с диска, или MMU может это сделать?

Спасибо

Ответы [ 2 ]

26 голосов
/ 04 февраля 2011

Пожираемый Элизиум,

Я постараюсь ответить на ваши вопросы один за другим, но учтите, что было бы неплохо получить в руки учебник для курса по ОС или вводный курс по компьютерной архитектуре.

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 контроллеру памяти, и все готово!

Кэши немного изменят эту игру, но я надеюсь, что это послужит иллюстрацией того, как работает пейджинг. Опять же, было бы очень полезно проверить некоторые книги по ОС / компьютерной архитектуре. Я надеюсь, что это было ясно.

0 голосов
/ 27 января 2011

Существуют структуры данных, которые описывают, какие виртуальные адреса соответствуют каким физическим адресам.ОС создает и управляет этими структурами данных, а ЦПУ использует их для преобразования виртуальных адресов в физические адреса.

Например, ОС может использовать эти структуры данных, чтобы сказать «виртуальные адреса в диапазоне от 0x00000000 до 0x00000FFF».соответствуют физическим адресам от 0x12340000 до 0x12340FFFF ";и если программное обеспечение пытается прочитать 4 байта с виртуального адреса 0x00000468, тогда процессор фактически прочитает 4 байта с физического адреса 0x12340468.

Обычно все выполняется виртуальным-> физическим преобразованием (за исключением случаев, когда процессорполучает доступ к структурам данных, которые описывают перевод).Кроме того, обычно в ЦП встроен какой-то кэш трансляции, чтобы помочь снизить накладные расходы.

...