MPU (Memory Protection Unit)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 17:30, 22 февраля 2019.

MPU (англ. Memory Protection Unit – Блок защиты памяти) – это блок процессора, отвечающая за защиту распределение памяти между процессами, отслеживает случаи обращения к запрещенным для текущей рабочей программы участкам, или страницам, оперативной памяти и организацию для них прерываний в реализации программ.

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

Назначение

MPU необходим для исключения изменения какой-либо информации, находящейся в ОП. Блок защиты памяти (БЗП) является средством, которое обеспечивает мультипрограммную работу ЭВМ. Когда на ЭВМ исполняется несколько программ, каждая из них обладает своим адресным пространством, назначенным процессором именно ему. При этом любая программа может работать только в своем адресном пространстве и обращения "чужим" адресам могут вызвать прерывание и прекращение работы программы. Обращение к таким адресам может произойти из-за неправильной разработке ПО или неисправности оборудования. Конструктивно МОЗУ совмещено с блоком защиты памяти, который предохраняет массивы информации, хранящиеся в запоминающем устройстве, от ошибочной записи в них посторонних кодов.

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

Фиксация сигналов о сбоях производится в регистре ошибок (РО); регистр РБЗ является информационным для блока защиты памяти; эти регистры также относятся к числу служебных регистров.

В состав процессора могут входить сверхоперативная быстродействующая память небольшой емкости (СОЗУ), блок прерывания, блок защиты памяти, блок контроля правильности работы и диагностики процессора и другие блоки. Оперативное запоминающее устройство и каналы связи с периферийными устройствами выполняются в виде отдельных устройств, хотя в небольших ЭВМ могут конструктивно объединяться с процессором.[Источник 1]

Во встроенных системах данный блок применяется для повышения их устойчивости и надежности с помощью:

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

По сравнению с MMU, MPU не имеет буфера ассоциативной трансляции (TLB – Translation lookaside buffer), а также в нем нет таблицы страниц. (рис. 1)

Рисунок 1 – Сравнение MMU и MPU

Но в системах реального времени с ограничениями по скорости отклика использование MMU имеет серьезный недостаток: при трансляции из виртуального адресного пространства в физическое может произойти промах кэш-памяти (то есть транслируемый адрес может не оказаться в кэше). Это приводит к тому, что приходится считать физический адрес по таблице страниц. Таким образом, использование MMU может привести к непостоянному времени отклика.

В MPU все виртуальное адресное пространство сопоставляется к физическому как 1 к 1. По этой причине использование MPU популярно в системах реального времени.

MPU в Cortex-M

MPU в Cortex-M может быть использован для защиты 8 регионов памяти. Каждый из них имеет свой номер (от 0 до 7), который соответствуют их приоритету. Таким образом, номера участка памяти в MPU – это их унифицированные идентификационные номера в системе. Также существуют специальные флаги доступа (на запись, чтение, исполнение и кэширование) которые можно выставлять регионам.

Участки памяти в MPU всегда содержит следующие атрибуты: * номер участка в MPU.

  • адрес участка памяти.
  • флаги доступа к участку и его размер.

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

Также адрес участка памяти должен соотноситься со своим размером. Например, если размер составляет 64КB, то адрес должен быть кратен 64КВ. Так как 64КВ эквивалентно 0x10000, то адрес участка должен быть равен 0x10000, 0x20000 и так далее. Это необходимо для того, чтобы участок памяти был выровнен по своему размеру.

Флаги доступа и размер участков являются основными параметрами для системы, использующей MPU.

Драйвер MPU

Поддержка флагов доступа

Всего под атрибуты каждого участка памяти выделено 28 бит, как показано в таблице ниже:

Биты Имя флага Описание
28 XN Доступ на исполнение
26:24 AP Флаги доступа к данным
21:19 TEX Тип блока памяти
18 S Разделяемая память
17 C Возможность кэширования
16 B Возможность буферизации
15:8 SRD Флаги субрегионов
5:1 SIZE Определяет размер участка

Флаг XN контролирует исполнение кода. Для выполнения инструкции в пределах участка памяти, необходимо иметь доступ на чтение в привилегированном режиме и XN должен быть равен 0. В противном случае возникнет исключение.

Поле разрешения доступа (AP) определяет доступность участка памяти для чтения и записи в зависимости от режима (пользователя или ядра).

Обработка исключений

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

Исключение вызывается только в случае высокого приоритета в режиме исполнения (потока).

В случае появления исключения с более высоким приоритетом, оно вытесняет старое. При вытеснении предыдущее исключение сохраняется на стеке. Его обработка продолжается после завершения нового.

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

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

В стековом кадре хранится адреса следующей инструкции в прерванной программе.

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

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

Если во время входа пришло исключение с более высоким приоритетом, то для него запускается обработчик. Для предыдущего исключения ожидающий статус не меняется. Возврат исключения происходит, когда процессор находится в режиме обработчика, и при этом выполняется одна из инструкции, которая загружает значение возврата на PC:

  • загружается регистр PC.
  • загружается значение на PC через инструкцию LDR. * затем создается ветка с обработчиком исключения.

Переключение контекстов

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

Эта проблема была решения с помощью исключений. В процессорах архитектуры Cortex-M 3/4 обработчик исключений находится всегда в привилегированном режиме, поэтому переключение можно сделать через вызов супервизора (SVC).

Для переключения контекста в системе использовались прерывания и стеки. Во время переключения, система должна сохранять состояние предыдущих задач, чтобы восстановить их при очередном переключении. При переключении контекста необходимо:

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

Обновление флагов доступа

Рисунок 2 – Обновление флагов блока памяти

Для обновления атрибутов блока памяти необходимо, чтобы были выполнены следующие действия (рис. 2):

  • Данный участок памяти должен быть отключен.
  • Чтобы избежать неопределенного поведения, нужно отключить прерывание.
  • Также перед обновлением MPU необходимо выполнить инструкции DSB и ISB. Это нужно для того, чтобы быть уверенными, что все незавершенные операции с памятью выполнены.
  • Вышесказанные инструкции не требуются, если процедура обновления проходит в обработчике исключений, так как в этом случае завершение операций автоматически произойдет во время входа и выхода из исключения.

Реализация в ARM-архитектуре

MPU может быть использован для повышения устойчивости и надежности системы, предоставляя следующие возможности:

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

MPU может быть использован для защиты 8 областей памяти. В свою очередь, они могут иметь 8 подобластей, если размер области не менее 256 байт. Подобласти всегда имеют равный размер, и могут быть включены или отключены с использованием номера подобласти. Поскольку минимальный размер области зависит от длины строки кэша (32 байта), 8 подобластей по 32 байта соответствует 256 байтам.

Области пронумерованы от 0 до 7. В дополнение есть другая область, названная областью по умолчанию, с идентификатором -1. Все области памяти в диапазоне от 0 до 7 имеют приоритет над областью по умолчанию.

Области могут перекрываться, и могут быть вложенными. Область 7 имеет более высокий приоритет, область 0 низкий, и это определяет поведение перекрывающихся областей. Приоритеты фиксированы и не могут быть изменены.

Рис. 3 показывает пример с 6-ю областями. Этот пример показывает, что область 4 перекрывает области 0 и 1. Область 5 включена полностью в область 3. Так как приоритет идет в порядке возрастания, у областей перекрытия (желтые) есть приоритет над другими областями. Таким образом, если область 0 определена как доступная для записи, а область 4 наоборот, недоступная, то адрес, попадающий в зону перекрытия областей, не будет доступен для записи.

Рисунок 3 – Пример перекрытия областей

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

MPU может быть использован для определения других атрибутов памяти, таких как кэширование, которые могут быть экспортированы (применены) в системном блоке кэш-памяти или в контроллере памяти.

Управление кэшем происходит глобально посредством регистра команд кэша, но MPU может определить политики кэша, и будет ли область кэшируемой или нет. MPU позволяет установить атрибуты кэша для области кэшем уровня L1 (доступно только для серии STM32F7, у которой есть кэш L1).

Модель памяти. В архитектуре STM32 процессор имеет по умолчанию фиксированную карту распределения памяти, которая предоставляет до 4 гигабайт адресуемой памяти. На рис. 4 показана карта распределения памяти.

Рисунок 4 – Распределение адресного пространства процессора

Типы памяти, регистры и атрибуты

Карта распределения памяти и настройка MPU разделяют карту на области. Каждая область имеет определенный тип памяти и её атрибуты.

Есть три общих типа памяти:

  • Память Normal: позволяет загружать и хранить байты, полуслова и слова, которые будут эффективно расположены процессором (компилятору неизвестно о типах областей памяти). Для этой области загрузка/хранение не обязательно выполняется для процессора в том порядке, который определен в исходном коде программы.
  • Память Device: в этом регионе загрузка и хранение совершаются в строго упорядоченном виде. Это должно гарантировать, что последовательность загрузки регистров выполнена в надлежащем порядке.
  • Строго упорядоченная память: всегда выполняется в порядке, написанном в программе, ожидает завершения инструкции записи/хранения (эффективный доступ к шине) прежде, чем выполнить следующую инструкцию в потоке программы. Это может серьезно увеличить производительность.

Регистры MPU. Регистры MPU расположены по адресу 0xE000ED90. Есть 5 основных регистров MPU и несколько регистров-псевдонимов (alias registers) для каждой области. Следующие регистры используются для установки областей в MPU:

  • MPU_TYPE регистр только для чтения, используется для детекции наличия MPU.
  • MPU_CTRL регистр управления.
  • MPU_RNR номер области, используется для определения допустимых операций к ней.
  • MPU_RBAR базовый адрес области.
  • MPU_RASR атрибуты области и размер.
  • MPU_RBAR_An n-й псевдоним MPU_RBAR, где n в диапазоне от 1 до 3(a).
  • MPU_RASR_An n-й псевдоним MPU_RASR, где n в диапазоне от 1 до 3(a).

Примечание (a): В Cortex®-M0+ эти регистры не реализованы.[Источник 2]

Другие методы защиты памяти

Метод граничных регистров

Рисунок 5 – Метод граничных регистров

Идея метода состоит в том, что вводят два граничных регистра, указывающих верхнюю и нижнюю границы области памяти, куда программа имеет право доступа (см. рис. 5).

При каждом обращении к памяти проверяется, находится ли используемый адрес в установленных границах. При выходе за границы обращение к памяти подавляется и формируется запрос прерывания, передающий управление операционной системе. Содержание граничных регистров устанавливается операционной системой перед тем, как для очередной целевой программы начнется активный цикл. Если для динамического распределения памяти используется базовый регистр, то он одновременно определяет и нижнюю границу. Верхняя граница подсчитывается операционной системой в соответствии с длиной программы в ОП.

Метод ключей защиты

Рисунок 6 – Метод ключей защиты

Память в логическом отношении делится на блоки (см. рис. 6). Каждому блоку памяти ставится в соответствие код, называемый ключом защиты памяти. При этом каждой программе, принимающей участие в мультипрограммной обработке, присваивается код ключа программы. Доступ программы к данному блоку памяти для чтения и записи разрешен, если ключи совпадают или один из них имеет код 0.

Метод защиты отдельных ячеек

В небольших управляющих вычислительных устройствах, работающих, например, в составе АСУ ТП, необходимо обеспечить возможность отладки новых программ параллельно с функционированием находящихся в памяти рабочих программ, управляющих технологическим процессом. Этого можно достичь выделением в каждой ячейке памяти специального разряда защиты. Установка 1 в этот разряд запрещает производить запись в данную ячейку. Это так называемый метод контрольного разряда.[Источник 3]

Источники

  1. Блок защита память // Больная энциклопедия нефти и газа [2019]. Дата изменения: 05.04.2018. URL: http://www.ngpedia.ru/id222497p1.html (дата обращения: 30.01.2019).
  2. AN4838: модуль управления защитой памяти STM32 // micrsin [2019]. Дата изменения: 21.12.2015. URL: http://microsin.net/programming/arm/an4838-managing-memory-protection-unit-stm32.html (дата обращения: 30.01.2019).
  3. Методы защиты памяти: метод граничных регистров, метод ключей защиты, защита отдельных ячеек. // GOSy VMKSS [2019]. Дата изменения: 07.02.2012. URL: https://sites.google.com/site/gosyvmkss12/organizacia-evm-i-sistem/23-metody-zasity-pamati-metod-granicnyh-registrov-metod-klucej-zasity-zasita-otdelnyh-aceek (дата обращения: 30.01.2019).