УДК 004.315.4+004.052.2
А.О. Соколов, Л.А Блюштейн ЗАЩИЩЕННЫЙ МОДУЛЬ УПРАВЛЕНИЯ ПАМЯТЬЮ ДЛЯ МИКРОКОНТРОЛЛЕРА
Рассматривается возможность оснащения современных микроконтроллеров расширенной периферией, такой как MMU и MPU. Проблема является следствием ограниченности элементной базы для специального применения (авиация, космос, атомная энергия), что приводит к невозможности использования многих современных операционных систем реального времени. Предложения, приведенные в статье, реализованы и исследованы на технической базе ОАО «КБ Электроприбор».
Микроконтроллер, модуль управления памятью (MMU), модуль защиты памяти (MPU), операционные системы реального времени (RTOS)
A.O. Sokolov, L.A. Blushtein A PROTECTED MEMORY MANAGEMENT UNIT FOR MICROCONTROLLERS
The article describes the possibility of providing modern microcontrollers with MMU and MPU systems. The problem is the consequence of insufficiency the fundamental basis for specific applications (aviation, space, nuclear energy), which makes impos-
sible using modern real time operating systems. The proposals presented the paper are implemented and tested on the technical basis of the «KB Electropribor»company.
Microcontroller, memory management unit (MMU), memory protection unit (MPU), real time operating system (RTOS)
Введение
В последнее время при разработке встраиваемых систем все большее предпочтение отдается операционным системам реального времени (RTOS - Real Time Operating System) как основному инструментарию. Ускорение разработки, повышение тестируемости, гибкости и удобства сопровождения - все это плюсы, приобретаемые благодаря использованию RTOS.
В то же время многие микроконтроллеры, часто используемые во встраиваемых системах и оснащенные мощной периферией, могут не иметь блока управления памятью (MMU - Memory Management Unit) или блока защиты памяти (MPU - Memory Protect Unit). Это исключает возможность использования многих распространенных RTOS. Примером могут являться микроконтроллеры с архитектурой ядра ARM серий Cortex-Mx [1].
Возможным решением является самостоятельная аппаратная реализация MMU. Современные электронные компоненты позволяют выполнять манипуляции с системной шиной быстрее времени доступа к памяти, т.е. с точки зрения программы - моментально. Это позволяет сохранить быстродействие контроллера и упростить механизм интеграции.
Аппаратная реализация MMU
Подход требует наличия возможности модификации адреса на шине. Для этого модуль управления памятью должен функционально располагаться между процессором и памятью. Выполнение данного условия возможно только при работе с внешней памятью. В связи с этим дальше рассматриваться будут только микроконтроллеры, системная шина которых имеет внешние выводы. Как правило, это микроконтроллеры в достаточно больших корпусах с расширенной периферией.
Минимальный набор функций для MMU [2] страничного типа:
— осуществление преобразования виртуального адреса в физический;
— переключение страницы памяти;
— защита управляющих регистров MMU от пользовательских программ.
Под механизмом переключения страницы подразумевается системная функция RTOS, предназначенная для изменения значения в регистре номера страницы (PNR - Page Number Register). Виртуализация не обязательна для всего адресного пространства. На практике чаще всего рассматриваются случаи, когда определенные участки памяти (обычно - часть RTOS и разделяемая процессами память) являются общими для всех процессов. Значение в PNR имеет значение только для области пользовательской программы.
Механизм переключения страницы может быть реализован с помощью таблицы страниц (PT -Page Table). В большинстве случаев, структура и способ организации данных в таблице определены архитектурой RTOS [3], поэтому для обеспечения гибкости системы, эта часть механизма должна быть реализована программно средствами используемой RTOS.
Защита MMU
Защита PNR и PT от несанкционированного доступа позволит гарантировать сохранность данных программ от искажения вследствие ошибки или вредоносного кода. Для этого можно воспользоваться различными методами. Рассмотрим основные из них.
Защита кодовой комбинацией. Данный метод уже нашел широкое применение в микропроцессорной технике для защиты от записи flash-памяти. Для того чтобы выполнить необходимое действие, системе необходимо выполнить заранее определенный набор действий (например, запись определенных слов по определенным адресам или подача определенной последовательности сигналов). В ответ на кодовую посылку, аппаратная часть открывает доступ к защищаемой части.
Одно из преимуществ такой реализации в том, что нет необходимости в защищенном режиме -шанс ошибочного воспроизведения кодовой посылки обратно пропорционален её сложности. Но отсутствие защищенного режима вносит и определенные недостатки - невозможность организации защиты от вредоносного кода (что, учитывая специфику микроконтроллерных устройств, требуется очень редко) и уязвимость при ошибочной передаче управления. Последнее заключается в том, что если пользовательская программа некорректно совершила системный вызов или передачу управления
операционной системе, код передачи кодовой посылки может выполниться без необходимого контекста.
Данный подход применим достаточно редко, поэтому далее рассматриваться не будет.
Защита средствами виртуализации. Этот механизм предполагает недоступность PNR и PT пользовательской программе вследствие их расположения в таком месте адресного пространства, которое покрывают виртуальные адреса пользовательской программы. Для выполнения этого условия механизм виртуализации должен либо отключаться при передаче управления ядру операционной системы (т.е. при переходе в защищенный режим), либо автоматически переключать страницу на ту, в которой располагаются необходимые таблицы и регистры.
Механизм перехода в защищенный режим должен передавать управление по корректному адресу в коде операционной системы и переводить систему в защищенный режим. Это действие должно осуществляться атомарно. Иначе, если существует возможность отдельного выполнения одной из этих операций, в системе появится потенциальная уязвимость.
Защита с применением мониторинга адреса. PNR и PT доступны всем процессам, но при доступе к ним по записи MMU (а точнее, MPU в его составе) генерирует ошибочное состояние. Как и в случае защиты средствами виртуализации, переход в защищенный режим должен одновременно и отключать MPU, и передавать управление операционной системе. Данная реализация сложнее, но введение функций мониторинга адреса заметно расширяет возможности RTOS.
Переход в защищенной режим, учитывая расположение MMU вне микроконтроллера, является нетривиальной задачей. В случае использования микроконтроллером гарвардской архитектуры памяти с разделением внешней шины на шины программ и данных можно однозначно определить передачу управления операционной системе. Это происходит, если на шине программ появился адрес системного вызова RTOS. По этому признаку можно совершенно безопасно открыть полный доступ к системе виртуализации (PNR и PT).
В более общем случае переход по адресу системного вызова может выглядеть так же, как и чтение данных по этому адресу. В связи с этим с вероятностью, зависящей от количества системных вызовов, возможна ситуация ошибочного вхождения в режим ядра. Изменить реализацию обращения к системной шине таким образом, чтобы можно было отличить обращение за данными и обращение за кодом программы, в большинстве микроконтроллеров невозможно [1]. К тому же такое изменение аппаратной платформы противоречит многим системам контроля и обеспечения качества, а также нарушает условия некоторых стандартов [4]. В связи с этим в большинстве микроконтроллеров отсутствуют встроенные решения, позволяющие выполнить атомарный переход в режим ядра с оповещением об этом внешней периферии.
Практически все микроконтроллеры, имеющие внешние выводы системной шины, обладают такой периферией, как порты ввода-вывода и система обнаружения внешних прерываний. В этом случае проблема перехода в режим ядра решается путем реализации системного вызова в виде генерации внешнего прерывания. При этом совершенно не обязательно иметь столько линий, сколько требуется системных вызовов. Можно ограничиться одним системным вызовом, а его детали передавать в общедоступной памяти через системную переменную.
Выход из режима ядра также должен сопровождаться генераций сигнала, блокирующего доступ к управлению MMU. В случае защиты средствами виртуализации это произойдет автоматически при включении MMU или при смене значения в PNR. При защите по адресу операционной системе необходимо самостоятельно включить MPU. При любой реализации выход из защищенного режима осуществляется программно. Действие выполняется модулем операционной системы, поэтому дополнительных защит для него не требуется.
Пример реализации
В самом усеченном варианте внешние прерывания можно заменить системными функциями, приводящими к прерыванию (например, Reset). Однако это может оказаться довольно затратным (Reset сбрасывает состояние всех регистров в системе, и инициализацию необходимо проводить при каждом системном вызове). Использование Reset опасно и из-за возможности утери данных запущенными приложениями, так как сохранность данных в ОЗУ не гарантируется. В большинстве микроконтроллеров существуют такие альтернативы внешним прерываниям, как специализированные линии аппаратных ловушек, например Non-Masked Interrupt (NMI).
Использование любого из приведенных методов предполагает наличие специальной RTOS, учитывающей особенности описанных системных вызовов или средств доступа к управлению MMU. Для адаптации уже существующих RTOS необходимо изменение механизма входа в режим ядра и 206
выхода из него. Обычно эта часть операционной системы реализуется в аппаратно зависимых модулях и существует отдельно от основного алгоритма, что упрощает процедуру портирования.
При наиболее удачной архитектуре реализация описанного механизма возможна с использованием нескольких простейших цифровых микросхем или одной небольшой ПЛИС. Пример такой реализации в виде функциональной схемы приведен на рисунке.
В данном примере предполагается, что 16-разрядный микроконтроллер MCU имеет внешнюю системную шину с выводами адреса A0-A15 и выводами данных D0-D15. Внешняя память имеет 32разрядную шину адреса. При этом под элементом Memory может пониматься как одна микросхема памяти (например, только RAM), так и несколько микросхем памяти (RAM, ROM, Flash) со связывающей логикой. Наличие разных типов памяти зависит от строения карты памяти страницы, подлежащей виртуализации, и должно регламентироваться операционной системой. Порт ввода-вывода микроконтроллера имеет 1 свободный вывод для реализации системного вызова (SysCall). Для оповещения системы об ошибке или передачи управления операционной системе используется Внешнее прерывание SysInt. Доступ к регистрам модуля прямого доступа к памяти (DMA - Direct Memory Access) возможен только в защищенном режиме, кэш-память ядра отсутствует. Регистр PNR является частью MMU, таблица PT располагается в памяти Memory.
DD-D15
Syslnt ДЇ-А15
W
Sys Call
г
In Data (16) Out Data (16)
InAddr (16) OutAddr (32)
SysCall . Syslnt
мси
мми
Функциональная схема модуля управления памяти
ММи модифицирует адрес, полученный от микроконтроллера для обращения к памяти, обеспечивая тем самым механизм виртуализации. Модуль имеет доступ и к шине данных. Это необходимо для записи значений в РКИ и для возможности, при использовании мониторинга памяти, блокировки шины при обращении по запрещенному адресу.
Чтобы пользовательской программе совершить системный вызов, необходимо подать сигнал 8у8Са11. Модуль ММИ реагирует на это действие отключением механизмов виртуализации и защиты памяти, а также транслирует сигнал 8у$Са11 в сигнал 8у81Ш, что вызывает возникновение в микроконтроллере внешнего прерывания, обработчиком которого является обработчик системного вызова.
Модификация адреса может происходить разными способами, зависящими от разрядности шины адреса на входе и выходе ММИ и от структуры карты памяти. Например, если 16-разрядное адресное пространство делится на части по 32 Кбайт, старшая из которых является виртуальной, то 15 младших бит адреса транслируются напрямую, а старшие модифицируются в соответствии с данными в РКИ при условии, что 16-й бит равен единице.
Заключение
Подход, описанный в данной статье, позволяет поднять уровень надежности программных продуктов для микроконтроллеров на новый уровень. При этом объем аппаратных дополнений целевой платформы оказывается невелик, а прирост надежности от устранения целого класса программных ошибок оказывается выше, чем ее снижение от увеличения количества электронных элементов на плате.
Основным источником уязвимости описанного в статье метода является возможность программной смены шины для доступа к памяти и возможность доступа к памяти без трансляции адреса на внешнюю шину (управляющие регистры микроконтроллера, прямой доступ к памяти БМЛ, и кэшпамять процессора). Полное решение этих проблем возможно только на уровне архитектуры микроконтроллера и не затрагивает управляющих структур операционной системы и соседних пользовательских процессов. Для уменьшения риска возможно организовать работу с незащищенными ресурсами через механизм системных вызовов, оставляя критичный код внутри тщательно отлаженного ядра КТ08.
Каждая целевая платформа имеет свои особенности. В связи с этим в области встраиваемых систем отсутствуют общеприменимые решения для часто встречающихся проблем. В данной статье описан лишь один из методов увеличения надежности программного обеспечения в таких системах. В зависимости от используемой конфигурации его применение может быть как нецелесообразным, так и полностью решать обозначенные в статье проблемы. Минимальная реализация модуля управления памятью может быть выполнена, если:
доступ к используемой ОЗУ транслируется на внешнюю системную шину; существует однозначный атомарный способ передачи управления по ограниченному набору адресов с одновременной внешней индикацией.
Система может быть полностью защищена и виртуализирована, если она дополнительно соответствует следующим требованиям:
адрес транслируется на внешнюю системную шину при доступе ко всей памяти; кэш-память процессора отсутствует, либо является управляемой и взаимодействует с внешней системной шиной;
— работа модуля DMA отображается на системную шину, либо RTOS предоставляет защищенный доступ к регистрам управления DMA через системные вызовы.
ЛИТЕРАТУРА
1. Cortex-M3 R2P1 technical reference manual; ARM holdings. url: http: // www.arm.com (дата обращения: 25.07.12).
2. Bruce Ja. Virtual memory: issues of implementation / Jacob Bruce, Mudge Trevor. Los ALAMITOS, CA, USA: IEEE computer society press, 1998. ISSN 0018-9162.
3. Таненбаум Э. Современные операционные системы / Э. Таненбаум. 3-е изд. СПб.: Питер, 2010. 1120 с.
4. ОСТ KT-178B. Квалификационные требования. Требования к программному обеспечению бортовой аппаратуры и систем при сертификации авиационной техники.
Соколов Алексей Олегович - Alexey O. Sokolov -
аспирант кафедры «Техническая кибернетика Postgraduate
и информатика» Саратовского государственного Department of Technical Cybernetics
технического университета имени Гагарина Ю.А. and Informatics,
Gagarin Saratov State Technical University
Блюштейн Леонид Александрович - Leonid A. Blushtein -
инженер-конструктор 1 категории Leading Design Engineer
ОАО «КБ Электроприбор» Design Bureau «Electropribor»
Статья поступила в редакцию 17.06.12, принята к опубликованию 20.02.13