Появилась задача безопасного выполнения пользовательской программы на микроконтроллере. В начале работы контроллер настраивает периферию и прочее. После настройки нельзя менять эти настройки, может повредить устройство неправильная установка регистров, а починка будет проблематична. Далее алгоритм задачи должен загружаться пользователем. Выходит два варианта: - Интерпретатор - Загрузка и выполнение кода в RAM
При интерпретаторе все нормально, виртуальная машина обрабатывает пользовательский скрипт, доступа по указателям и периферии нет. Если напишут кривой (скорее всего напишут) код, то программа корректно прекратит работу. Вроде бы все нормально, но из-за виртуальной машины производительность падает примерно в 40 раз (проверяли вычислением F32 на Си и с помощью скрипта). Это не во всех случаях подходит.
При простой подгрузке бинарника встает вопрос об возможности доступа к регистрам и памяти. То есть пользователь, криво написав программу, залепит в какой-нибудь регистр фигню, а дальше как повезет. Тут уже нужно будет обрабатывать Data Abort, но это не всегда спасает.
В конечном виде нужно получить несколько системных вызовов и безопасное выполнение кода пользователя.
Интерпретатор и компилятор не проблема написать, уже писал. Бинарник подгрузить не сложно, но вот не знаю можно ли каким-либо методом ограничить использование регистров и доступ к памяти?
|