segment
Sep 17 2010, 10:35
Появилась задача безопасного выполнения пользовательской программы на микроконтроллере.
В начале работы контроллер настраивает периферию и прочее. После настройки нельзя менять эти настройки, может повредить устройство неправильная установка регистров, а починка будет проблематична. Далее алгоритм задачи должен загружаться пользователем.
Выходит два варианта:
- Интерпретатор
- Загрузка и выполнение кода в RAM
При интерпретаторе все нормально, виртуальная машина обрабатывает пользовательский скрипт, доступа по указателям и периферии нет. Если напишут кривой (скорее всего напишут) код, то программа корректно прекратит работу. Вроде бы все нормально, но из-за виртуальной машины производительность падает примерно в 40 раз (проверяли вычислением F32 на Си и с помощью скрипта). Это не во всех случаях подходит.
При простой подгрузке бинарника встает вопрос об возможности доступа к регистрам и памяти. То есть пользователь, криво написав программу, залепит в какой-нибудь регистр фигню, а дальше как повезет. Тут уже нужно будет обрабатывать Data Abort, но это не всегда спасает.
В конечном виде нужно получить несколько системных вызовов и безопасное выполнение кода пользователя.
Интерпретатор и компилятор не проблема написать, уже писал. Бинарник подгрузить не сложно, но вот не знаю можно ли каким-либо методом ограничить использование регистров и доступ к памяти?
Dron_Gus
Sep 17 2010, 10:37
Какой контроллер? На ARM>9 для это есть MMU. На cortex-m3 вроде тоже есть свои механизмы.
segment
Sep 17 2010, 10:42
Задача выполняется на простых ARM7 (72Мгц, LPC2000) и Cortex-M3 (100Мгц, LPC1700). То есть два устройства на разных канмях. И на обоих нужно это реализовать.. Либо придется как-то уговаривать начальство переделать под один тип микроконтроллера.
Dron_Gus
Sep 17 2010, 10:50
У кортексов есть MPU. Не знаю, есть ли он на LPC17**, на STM32 точно есть. Для ARM7 ничего посоветовать не могу.
segment
Sep 17 2010, 11:20
Да, есть MPU. Его еще не использовал, поэтому возникли вопросы по поводу реализации.
Алгоритм, насколько я понял, такой:
- При инициализации МК находимся в Privileged Thread режиме
- Настройка MPU (на критические области) и остальной периферии
- Загружаем пользовательскую программу в оперативную память
- Переходим в Unprivileged Thread режим
- Запускаем программу пользователя
Вопрос возник по поводу перехода обратно в Privileged Thread режим. То есть как реализовать системные вызовы? Вопрос может быть глупый, но я занимался пока только интерпретаторами вплотную.
Dron_Gus
Sep 17 2010, 11:32
Системные вызовы через SWI (SWC).
Посмотрите FreeRTOS, насколько я помню, там через SWI и сделано. Плюс там есть порт с поддержкой MPU.
segment
Sep 17 2010, 11:38
Насколько я понял в ARM7 можно поменять режим и использовать SWI для системных вызвов, но доступ к регистрам из User Mode все равно будет?
Dron_Gus
Sep 17 2010, 11:39
Да.
segment
Sep 17 2010, 11:59
Спасибо. С PMU вроде все понятно. А нет ли хорошего гайда по SWI? Примеры видел, но что-то логики работы не понимаю, а описано везде размыто..
Dron_Gus
Sep 17 2010, 12:28
Для ARM7 можно попробовать задействовать регистры отладчика - ловить выходящие за границы допустимого обращения к памяти.
Во всяком случае в ключах Guardant Code (сделанных на LPC2xxx) присутствует подобный механизм контроля.
Dron_Gus
Sep 17 2010, 13:43
А к ним можно получить доступ "изнутри"?
Цитата(Dron_Gus @ Sep 17 2010, 17:43)

А к ним можно получить доступ "изнутри"?
Не знаю. Попробуйте
здесь спросить, как они сумели это сделать.
ar__systems
Sep 17 2010, 14:48
Цитата(Сега @ Sep 17 2010, 05:35)

Выходит два варианта:
- Интерпретатор
- Загрузка и выполнение кода в RAM
При простой подгрузке бинарника встает вопрос об возможности доступа к регистрам и памяти.
Компилируйте бинарники сами. Дайте какой-то примитивный язычок юзерам, типа бейсика, и свой компилятор, исключая таким образом возможность доступа к регистрам.
prottoss
Sep 17 2010, 17:43
Цитата(Сега @ Sep 17 2010, 17:35)

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

В первом случае девочка одним пальцем набирает операторы Васика, во втором чел должен иметь уровень программирования на два порядка выше.
segment
Sep 24 2010, 09:23
Бывают сидят такие, которые потом приходят и говорят "а я нашел уязвимость", при этом летит прошивка или еще хуже девайс. Многим требуется работа с указателями еще..
Вообщем буду пробовать связку SWI + PMU. Почти разобрался, будет загрузчик который подгружает программу в RAM (FLASH маленькое количество циклов записи, и при отладке не хочется занашивать чип) из внешнего протокола или с отдельной флешки. Только соответственно встает вопрос об компиляторе, нужно будет компилировать уже в ARM код, а не в свой, так что еще придется поработать с компилятором. Оптимизация упадет скорее всего
А мне больше нравится или интерпретатор или свой компилятор. В крайнем случае что-то типа анализатора, который запускается до компилятора и пытается вычислить и заблокировать обращения куда не следует не допуская компиляции.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.