Как блок управления памятью (MMU) в процессоре защищает сегменты памяти - PullRequest
5 голосов
/ 30 сентября 2010

Проходя через архитектуру одного встроенного процессора, я видел блочный MMU, и он в основном упоминает о функции защиты памяти.

Могу я знать,

Как MMU делает эту защитуа зачем это нужно?Что подразумевается под защитой памяти?

Какие другие виды использования MMU, кроме защиты (например, виртуальная адресация)?

Пожалуйста, рассмотрите встроенную систему без ОС.

__Kanu

Ответы [ 3 ]

19 голосов
/ 30 сентября 2010

Для процессоров, которые используют память (большинство из них), существует некоторый интерфейс памяти, некоторые имеют имена (например, amba, axi, wishbone), некоторые нет. С точки зрения процессоров это адрес, данные и, пожалуйста, либо прочитайте, либо напишите, что находится по этому адресу. В старые добрые времена у вас была бы одна шина, и ваша шина, флэш-память и периферийные устройства сидели на этой шине, просматривая определенные (обычно верхние) биты адреса, чтобы определить, обращались ли они к ним и, если да, то читать с или переходить на в противном случае шина данных остается в состоянии триста. Сегодня, в зависимости от чипа и т. Д., Некоторая часть этого декодирования памяти происходит в ядре или близко к нему, и ваш общедоступный интерфейс к ядру или чипу может состоять из нескольких шин, может быть определенная шина флэш-памяти, определенная шина sram и конкретный драм автобус и т. д.

Итак, первая проблема, с которой вы столкнулись при плоском линейном адресном пространстве, даже если разделить на флэш-память и оперативную память, часть оперативной памяти является плоской, адреса от 0 до N-1 для N байтов. Для не встроенной операционной системы - облегчить жизнь людей, если бы у программ был какой-то способ предположить, что все они начинаются с адреса 0, адреса 0x100 или адреса 0x8000, вместо того, чтобы каким-то образом компилировать их для следующей свободной памяти или операционной системе не нужно полностью перемещать программу из нижней памяти и заменять ее другой при переключении задач. Старый простой способ состоял в том, чтобы использовать сегмент intels: схема смещения. Программы всегда запускались в одном и том же месте, потому что сегмент кода был скорректирован перед запуском программы, а смещение использовалось для выполнения (очень упрощенный вид этой модели), когда при переключении задач между программами вы просто меняете сегмент кода, восстанавливаете компьютер для следующая программа Одна программа может быть по адресу 0x1100, а другая по адресу 0x8100, но обе программы считают, что они находятся по адресу 0x0100. Легко для всех разработчиков. MMU предоставляют те же функциональные возможности, беря этот адрес на процессорной шине и называя его виртуальным адресом. MMU обычно располагается близко к процессору между интерфейсом памяти процессоров и остальной частью чипа / мира. Таким образом, вы можете снова запросить адрес mmu see 0x0100 в таблице и перейти к физическому адресу 0x0100, а затем при переключении задач изменить таблицу так, чтобы следующий выбор 0x0100 перешел на 0x1100. Каждая программа считает, что работает по адресу 0x0100, связывание, компиляция, разработка, загрузка и выполнение кода менее болезненны.

Следующая функция - это кэширование, защита памяти и т. Д. Таким образом, процессор и его контроллер памяти могут декодировать некоторые адреса до того, как достигнут MMU, возможно, некоторые регистры ядра и, возможно, MMU сами управляют. Но другие вещи, такие как память и периферийные устройства, могут быть адресованы на другой стороне MMU, на другой стороне кэша, который часто является следующим слоем лука вне MMU. Например, при опросе вашего последовательного порта, чтобы увидеть, есть ли еще один доступный байт, вы не хотите, чтобы доступ к данным кэшировался так, чтобы первое чтение регистра состояния последовательного порта фактически выходило на физическую шину и касалось последовательного порта, а затем все последующие чтения читают устаревшую версию в кеше. Вы хотите это для значений оперативной памяти, для цели кэша, но для изменчивых вещей, таких как регистры состояния, это очень плохо. Поэтому, в зависимости от вашей системы, вы, вероятно, не сможете включить кеш данных, пока не будет включен MMU. Интерфейс памяти в ARM, например, имеет управляющие биты, которые указывают, к какому типу доступа это относится, является ли это не кешируемым доступом, кешируемым, частью пакета, такого рода вещами. Таким образом, вы можете включить кэширование инструкций независимо от кэширования данных, и без MIMU он будет передавать эти управляющие сигналы напрямую к контроллеру кэша, который затем подключается к внешнему миру (если он не обрабатывал транзакцию). Таким образом, ваша инструкция может быть кэширована, а все остальное не кэшировано. Но для кеширования доступа к оперативной памяти данных, а не к регистрам состояния с последовательного порта, вам нужно настроить таблицы для MMU, и во встроенной среде вы можете просто привязать оперативную память к одному, то есть виртуальный адрес 0x1000 становится физическим 0x1000. , но теперь вы можете включить бит кэша данных для этого фрагмента памяти. Затем для вашего последовательного порта вы можете сопоставить виртуальные и физические адреса, но очистите бит включения кэша данных для этого куска памяти. Теперь вы можете включить кэш данных, теперь чтения из памяти кешируются (потому что управляющие сигналы, проходящие через mmu, помечены как таковые, но для доступа к вашему регистру управляющие сигналы указывают, что они не кэшируются).

Вам, конечно, не нужно сопоставлять виртуальное и физическое один к одному, это зависит от того, встроена она или нет, операционной системы или нет, и т. Д. Но именно здесь ваша защита вступает в силу. Легче всего увидеть в операционной системе. Прикладная программа на уровне приложений не должна иметь доступа к защищенной системной памяти, ядру и т. Д. Не должна быть в состоянии забить пространство памяти других приложений. Поэтому, когда приложение включено, таблицы mmu отражают, к какой памяти ему разрешен доступ и к какой памяти ему не разрешен доступ. Любой адрес, не разрешенный программой, перехватывается MMU, генерируется исключение / ошибка (прерывание), и ядро ​​/ супервизор получает контроль и может работать с этой программой. Вы, возможно, помните термин «общая ошибка защиты» с более ранних окон, до того, как маркетинговые и другие заинтересованные группы в компании решили, что мы должны изменить имя, это было прямо из руководства Intel, прерывание было вызвано, когда у вас была ошибка это не относится к другим категориям, как вопрос с несколькими вариантами ответов в тесте A bob, B ted, C alice, D ничего из вышеперечисленного. Общая ошибка защиты не относится ни к одной из вышеперечисленных категорий, но наиболее часто встречается, потому что это то, что вы получили, когда ваша программа пыталась получить доступ к памяти или к вводу-выводу за пределами выделенного пространства памяти.

Еще одним преимуществом mmus является malloc. До mmus для выделения памяти приходилось использовать схемы для переупорядочения памяти, чтобы держать большие пустые блоки посередине. для этого следующего большого malloc, чтобы минимизировать «с 4meg free, почему мой 1kbyte alloc выдал ошибку?». Теперь, как и на диске, вы разбиваете пространство памяти на эти 4 Кбайта или несколько таких кусков. Malloc размером не более одного фрагмента, для извлечения любого свободного фрагмента из памяти используйте запись таблицы mmu, чтобы указать на нее и дать вызывающей стороне виртуальный адрес, связанный с этой записью mmu. Вы хотите 4096 * 10 байт, трюк заключается не в том, чтобы найти столько линейной памяти, а в том, чтобы найти 10 записей линейной таблицы mmu, взять любые 10 кусков памяти (не обязательно смежные) и поместить их физические адреса в записи 10 mmu.

Суть в том, «как» это происходит, это то, что он обычно находится между процессором и кешем или, если нет, кеширует шину физической памяти. Логика mmu смотрит на адрес, использует его для просмотра таблицы. Биты в таблице включают в себя физический адрес плюс некоторые управляющие сигналы, которые включают в себя кешируемый, плюс некоторый способ указания, является ли это действительной записью или защищенной областью. Если этот адрес защищен, MMU запускает прерывание / событие обратно в ядро. Если он действителен, он изменяет виртуальный адрес, чтобы он стал физическим адресом в другом / вне MMU, и биты, такие как кешируемый бит, используются, чтобы сообщить, что находится на другой стороне MMU, что это за тип транзакции, инструкция, данные, кеширование, пакетная обработка и т. д. Для встраиваемой системы однозадачности без ОС вам может понадобиться только одна таблица MMU. Быстрый способ защиты в операционной системе, например, состоял бы в том, чтобы иметь таблицу для каждого приложения или подмножество таблицы (такое дерево похоже на структуру каталогов), чтобы при переключении задач вам нужно было изменить только одну вещь, начало таблицы или начало одной ветви дерева, чтобы изменить виртуальные адреса на физические и выделенную память (защиту) для этой ветви дерева.

9 голосов
/ 30 сентября 2010

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

Без защиты программа, работающая в любом процессе, сможет получить доступ к памяти любого другого процесса.Даже если вы игнорируете последствия для безопасности, это означает, что ошибка в одной программе может перезаписать память, принадлежащую другому процессу.Отладить этот класс проблем непросто, потому что симптомы проявляются очень далеко от причины.

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

Преимущество этого состоит в том, что также становится возможным сделать памятьКарта каждого процесса выглядит идентично.Компоновщик может найти каждую программу по одному и тому же начальному адресу, поместить стек и кучу в предсказуемые области и зарезервировать память для взаимодействия с ядром.

MMU - это аппаратный компонент, который реализует преобразование из логических адресов, которыепроцесс использует физические адреса, используемые оборудованием.Он также обеспечивает функции безопасности, такие как маркировка только некоторых частей памяти как исполняемых.Он предоставляет структуры данных, которые необходимы ядру для реализации процесса подкачки и виртуальной памяти, так что страницы памяти, принадлежащие процессу A, даже не могут быть видны процессом B, но как A, так и B могут быть просмотрены доверенным ядром.

Для практического достижения этой цели физическая память делится на страницы, обычно размером 4 КБ.Каждый логический адрес разбит на номер страницы и смещение.Номера страниц индексируют таблицу в MMU, которая переводит каждую логическую страницу в некоторый физический адрес.Этот перевод происходит во время каждого цикла доступа к памяти.Одна физическая страница может быть отображена ни в какие процессы (в этом случае она, вероятно, также находится в пуле свободных страниц), точно в одну или несколько.

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

Если одна и та же страница физической памяти отображается в более чем один процесс, тоэто видно тем.Вот как разделяется DLL в Windows или .so в Unix: страницы, содержащие текст ее программы, отображаются в каждом связанном с ним процессе.

MMU имеет механизм, который выдает исключение, когдаДоступ к странице, которая не была сопоставлена ​​с процессом.Обработка этого исключения позволяет реализовать виртуальную память и увеличить объем памяти, выделяемой процессу по мере изменения его потребностей.

2 голосов
/ 30 сентября 2010

Защита памяти означает, что каждый процесс в системе выполняется в своем собственном виртуальном адресном пространстве, по сути, каждый процесс выполняется так, как будто он имеет основную память системы целиком. Это также подразумевает, что один процесс не может изменить память, зарезервированную для другого процесса; это очень важно для стабильности и безопасности системы (например, программа не может просто сканировать системную память, чтобы найти только что введенный пароль).

Существует множество функций, предоставляемых MMU (виртуальная память, динамическое перемещение и т. Д.).

Вот что и почему. Чтобы ответить «как», вы должны сделать еще чтение .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...