Memory Protection Unit
Memory Protection Unit (MPU, блок защиты памяти) — это аппаратный модуль микроконтроллера или микропроцессора, предназначенный для контроля доступа к областям оперативной памяти и периферийным устройствам. MPU реализует политику защиты памяти на основе привилегий, разделяя адресное пространство на регионы с заданными правами доступа (чтение, запись, исполнение) и уровнями привилегий (режим ядра и пользовательский режим). В отличие от более сложного блока управления памятью (MMU), MPU не выполняет трансляцию виртуальных адресов в физические, а работает исключительно с физическими адресами, что делает его эффективным для встраиваемых систем реального времени.
История
Концепция аппаратной защиты памяти восходит к 1960-м годам, когда в мейнфреймах (например, IBM System/360) использовались регистры границ для изоляции процессов. В микроконтроллерах MPU начали применяться в 1990-х годах с развитием операционных систем реального времени (RTOS) и необходимостью защиты от ошибок программирования. Первые массовые реализации появились в архитектуре ARMv7-M (серия Cortex-M3/M4), где MPU стал стандартным компонентом для обеспечения безопасности в медицинских, автомобильных и промышленных устройствах. В 2020-х годах, с ростом требований к кибербезопасности (стандарты IEC 62443, ISO 21434), MPU интегрируется в большинство 32-битных микроконтроллеров, включая RISC-V и российские разработки (например, «Эльбрус»).
Архитектура и принцип работы
Регионы защиты
MPU делит физическое адресное пространство на несколько регионов (обычно от 8 до 16). Каждый регион характеризуется:
- Базовым адресом — начало области (выравнивается по размеру региона).
- Размером — степень двойки (от 32 байт до 4 ГБ).
- Атрибутами доступа:
- Чтение (R) — разрешено чтение данных.
- Запись (W) — разрешена запись данных.
- Исполнение (X) — разрешено выполнение кода.
- Привилегии — доступ только из режима ядра (Privileged) или из пользовательского режима (Unprivileged).
Уровни привилегий
В архитектурах с MPU (например, ARM Cortex-M) поддерживаются два режима:
- Handler Mode (режим обработчика прерываний) — полный доступ ко всем регионам, используется ядром RTOS и обработчиками прерываний.
- Thread Mode (потоковый режим) — может быть привилегированным или непривилегированным. Обычно приложения работают в непривилегированном режиме, где MPU блокирует доступ к критическим областям (стеку ядра, таблицам векторов прерываний, периферии).
Механизм проверки
При каждом обращении к памяти (чтение/запись/выполнение) MPU проверяет:
- Попадает ли адрес в один из заданных регионов.
- Соответствует ли тип доступа атрибутам региона.
- Имеет ли текущий режим (привилегированный/непривилегированный) право на доступ.
Если проверка не пройдена, генерируется исключение (например, HardFault или MemManage Fault в ARM), которое обрабатывается операционной системой.
Виды и реализации
MPU в архитектуре ARM Cortex-M
- Cortex-M0+ — опциональный MPU с 8 регионами, фиксированный размер региона (32 байта).
- Cortex-M3/M4 — стандартный MPU с 8 регионами, поддержка атрибутов кэширования и буферизации.
- Cortex-M7 — MPU с 16 регионами, поддержка TEX (Type Extension) для управления кэшем.
- Cortex-M33/M85 — MPU с TrustZone, разделение на безопасный (Secure) и небезопасный (Non-Secure) миры.
MPU в архитектуре RISC-V
- PMP (Physical Memory Protection) — аналог MPU, обязательный для профилей RISC-V S (Supervisor) и U (User). Поддерживает до 16 регионов с атрибутами R/W/X и режимами M (Machine), S, U.
- Smepmp — расширение для защиты от выполнения кода в стеке (аналог NX-бита).
MPU в российских процессорах
- «Эльбрус» (МЦСТ) — аппаратная защита памяти на основе тегов (capability-based), где каждый указатель содержит права доступа. MPU реализован как часть системы управления памятью, поддерживает до 16 регионов.
- «Байкал» (Байкал Электроникс) — в ядрах ARM Cortex-A75 MPU используется для изоляции ядер и периферии в режиме TrustZone.
Применение
Операционные системы реального времени (RTOS)
- FreeRTOS — использует MPU для изоляции задач: каждая задача получает свой регион памяти (стек, куча, глобальные переменные). При нарушении доступа (например, задача пытается изменить стек другой задачи) генерируется исключение, что предотвращает крах всей системы.
- Zephyr — поддерживает MPU для защиты от переполнения стека и разделения привилегий между ядром и пользовательскими приложениями.
- RT-Thread — в версии 4.0+ реализован менеджер MPU для динамического выделения регионов.
Безопасность встраиваемых систем
- Медицинские устройства (кардиостимуляторы, инсулиновые помпы) — MPU блокирует запись в критически важные области (например, таблицу векторов прерываний), предотвращая сбои из-за ошибок ПО.
- Автомобильная электроника (ECU, ADAS) — соответствие стандарту ISO 26262 (ASIL D) требует изоляции компонентов разного уровня критичности. MPU разделяет память между модулями ABS, подушек безопасности и мультимедиа.
- Промышленные контроллеры (PLC) — MPU защищает от переполнения буфера в протоколах (Modbus, CANopen), что критично для систем управления технологическими процессами.
Кибербезопасность
- Защита от эксплуатации уязвимостей — MPU запрещает выполнение кода в областях данных (NX-бит), что делает невозможным атаки типа buffer overflow с внедрением шелл-кода.
- Изоляция криптографических ключей — ключи хранятся в отдельном регионе с доступом только из режима ядра, что предотвращает их утечку через пользовательские приложения.
- TrustZone (ARM) — MPU в сочетании с TrustZone создаёт безопасную среду (Secure World) для выполнения доверенного кода, изолированного от основной ОС (Non-Secure World).
Сравнение с MMU
| Параметр | MPU | MMU |
|---|---|---|
| Трансляция адресов | Нет (работает с физическими адресами) | Да (виртуальные → физические) |
| Сложность | Низкая (несколько регистров) | Высокая (TLB, таблицы страниц) |
| Задержка доступа | 0–1 такт (фиксированная) | 1–10 тактов (зависит от кэша TLB) |
| Энергопотребление | Низкое | Умеренное |
| Поддержка виртуальной памяти | Нет | Да (свопинг, страничная организация) |
| Область применения | MCU, RTOS, безопасные системы | MPU, Linux, многозадачные ОС |
MPU выбирается, когда требуется детерминированное время отклика и низкое энергопотребление, а MMU — для сложных ОС с виртуальной памятью (Linux, Windows Embedded).
Ограничения и критика
- Недостаточная гибкость — фиксированное число регионов (обычно 8–16) ограничивает количество изолированных областей. В сложных системах с десятками задач этого может не хватить.
- Отсутствие виртуальной памяти — MPU не позволяет выгружать данные на диск, что критично для систем с большим объёмом данных (например, мультимедийные плееры).
- Сложность настройки — неправильное задание регионов (например, перекрытие или невыравнивание) может привести к неработоспособности системы. Требуется тщательное проектирование карты памяти.
- Уязвимости в реализации — в некоторых моделях (например, ранние версии Cortex-M3) обнаружены ошибки в MPU, позволяющие обходить защиту через определённые последовательности инструкций.
Интересные факты
- Первый MPU в микроконтроллере появился в 1998 году в чипе ARM7TDMI (опционально).
- В архитектуре RISC-V PMP может быть реализован программно через трапы (ловушки), что снижает производительность, но упрощает аппаратуру.
- Российский микроконтроллер «К1986ВЕ92Ф» (НИИЭТ) содержит MPU с 8 регионами, совместимый с ARM Cortex-M4.
- В 2023 году компания NXP выпустила серию MCX N94x с MPU, поддерживающим до 32 регионов — рекорд для массовых микроконтроллеров.
Источники
- ARM Architecture Reference Manual ARMv7-M (ARM DDI 0403E)
- RISC-V Instruction Set Manual, Volume II: Privileged Architecture (Version 1.12)
- FreeRTOS MPU Porting Guide (Amazon Web Services)
- IEC 62443-4-2: Security for industrial automation and control systems
- ISO 26262-6: Road vehicles — Functional safety — Product development at the software level
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →