Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Доступ к регистрам из программы
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
segment
Появилась задача безопасного выполнения пользовательской программы на микроконтроллере.
В начале работы контроллер настраивает периферию и прочее. После настройки нельзя менять эти настройки, может повредить устройство неправильная установка регистров, а починка будет проблематична. Далее алгоритм задачи должен загружаться пользователем.
Выходит два варианта:
- Интерпретатор
- Загрузка и выполнение кода в RAM

При интерпретаторе все нормально, виртуальная машина обрабатывает пользовательский скрипт, доступа по указателям и периферии нет. Если напишут кривой (скорее всего напишут) код, то программа корректно прекратит работу. Вроде бы все нормально, но из-за виртуальной машины производительность падает примерно в 40 раз (проверяли вычислением F32 на Си и с помощью скрипта). Это не во всех случаях подходит.

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

В конечном виде нужно получить несколько системных вызовов и безопасное выполнение кода пользователя.

Интерпретатор и компилятор не проблема написать, уже писал. Бинарник подгрузить не сложно, но вот не знаю можно ли каким-либо методом ограничить использование регистров и доступ к памяти?
Dron_Gus
Какой контроллер? На ARM>9 для это есть MMU. На cortex-m3 вроде тоже есть свои механизмы.
segment
Задача выполняется на простых ARM7 (72Мгц, LPC2000) и Cortex-M3 (100Мгц, LPC1700). То есть два устройства на разных канмях. И на обоих нужно это реализовать.. Либо придется как-то уговаривать начальство переделать под один тип микроконтроллера.
Dron_Gus
У кортексов есть MPU. Не знаю, есть ли он на LPC17**, на STM32 точно есть. Для ARM7 ничего посоветовать не могу.
segment
Да, есть MPU. Его еще не использовал, поэтому возникли вопросы по поводу реализации.
Алгоритм, насколько я понял, такой:
- При инициализации МК находимся в Privileged Thread режиме
- Настройка MPU (на критические области) и остальной периферии
- Загружаем пользовательскую программу в оперативную память
- Переходим в Unprivileged Thread режим
- Запускаем программу пользователя

Вопрос возник по поводу перехода обратно в Privileged Thread режим. То есть как реализовать системные вызовы? Вопрос может быть глупый, но я занимался пока только интерпретаторами вплотную.
Dron_Gus
Системные вызовы через SWI (SWC).

Посмотрите FreeRTOS, насколько я помню, там через SWI и сделано. Плюс там есть порт с поддержкой MPU.
segment
Насколько я понял в ARM7 можно поменять режим и использовать SWI для системных вызвов, но доступ к регистрам из User Mode все равно будет?
Dron_Gus
Да.
segment
Спасибо. С PMU вроде все понятно. А нет ли хорошего гайда по SWI? Примеры видел, но что-то логики работы не понимаю, а описано везде размыто..
Dron_Gus
http://infocenter.arm.com/help/index.jsp?t...d/Cacdfeci.html тут вполне подробно расписано
vmp
Для ARM7 можно попробовать задействовать регистры отладчика - ловить выходящие за границы допустимого обращения к памяти.
Во всяком случае в ключах Guardant Code (сделанных на LPC2xxx) присутствует подобный механизм контроля.
Dron_Gus
А к ним можно получить доступ "изнутри"?
vmp
Цитата(Dron_Gus @ Sep 17 2010, 17:43) *
А к ним можно получить доступ "изнутри"?

Не знаю. Попробуйте здесь спросить, как они сумели это сделать.
ar__systems
Цитата(Сега @ Sep 17 2010, 05:35) *
Выходит два варианта:
- Интерпретатор
- Загрузка и выполнение кода в RAM

При простой подгрузке бинарника встает вопрос об возможности доступа к регистрам и памяти.

Компилируйте бинарники сами. Дайте какой-то примитивный язычок юзерам, типа бейсика, и свой компилятор, исключая таким образом возможность доступа к регистрам.
prottoss
Цитата(Сега @ Sep 17 2010, 17:35) *
При интерпретаторе все нормально...
При простой подгрузке бинарника встает вопрос об возможности доступа к регистрам и памяти...
Вообще это совершенно разный уровень пользователейsmile.gif В первом случае девочка одним пальцем набирает операторы Васика, во втором чел должен иметь уровень программирования на два порядка выше.
segment
Бывают сидят такие, которые потом приходят и говорят "а я нашел уязвимость", при этом летит прошивка или еще хуже девайс. Многим требуется работа с указателями еще..
Вообщем буду пробовать связку SWI + PMU. Почти разобрался, будет загрузчик который подгружает программу в RAM (FLASH маленькое количество циклов записи, и при отладке не хочется занашивать чип) из внешнего протокола или с отдельной флешки. Только соответственно встает вопрос об компиляторе, нужно будет компилировать уже в ARM код, а не в свой, так что еще придется поработать с компилятором. Оптимизация упадет скорее всего sad.gif
Deka
А мне больше нравится или интерпретатор или свой компилятор. В крайнем случае что-то типа анализатора, который запускается до компилятора и пытается вычислить и заблокировать обращения куда не следует не допуская компиляции.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.