реклама на сайте
подробности

 
 
> Доступ к регистрам из программы, Есть ли возможность запретить?
segment
сообщение Sep 17 2010, 10:35
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 352
Регистрация: 10-08-06
Из: Санкт-Петербург
Пользователь №: 19 471



Появилась задача безопасного выполнения пользовательской программы на микроконтроллере.
В начале работы контроллер настраивает периферию и прочее. После настройки нельзя менять эти настройки, может повредить устройство неправильная установка регистров, а починка будет проблематична. Далее алгоритм задачи должен загружаться пользователем.
Выходит два варианта:
- Интерпретатор
- Загрузка и выполнение кода в RAM

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

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

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

Интерпретатор и компилятор не проблема написать, уже писал. Бинарник подгрузить не сложно, но вот не знаю можно ли каким-либо методом ограничить использование регистров и доступ к памяти?
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
Dron_Gus
сообщение Sep 17 2010, 10:37
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Какой контроллер? На ARM>9 для это есть MMU. На cortex-m3 вроде тоже есть свои механизмы.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
segment
сообщение Sep 17 2010, 10:42
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 352
Регистрация: 10-08-06
Из: Санкт-Петербург
Пользователь №: 19 471



Задача выполняется на простых ARM7 (72Мгц, LPC2000) и Cortex-M3 (100Мгц, LPC1700). То есть два устройства на разных канмях. И на обоих нужно это реализовать.. Либо придется как-то уговаривать начальство переделать под один тип микроконтроллера.
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Sep 17 2010, 10:50
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



У кортексов есть MPU. Не знаю, есть ли он на LPC17**, на STM32 точно есть. Для ARM7 ничего посоветовать не могу.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
segment
сообщение Sep 17 2010, 11:20
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 352
Регистрация: 10-08-06
Из: Санкт-Петербург
Пользователь №: 19 471



Да, есть MPU. Его еще не использовал, поэтому возникли вопросы по поводу реализации.
Алгоритм, насколько я понял, такой:
- При инициализации МК находимся в Privileged Thread режиме
- Настройка MPU (на критические области) и остальной периферии
- Загружаем пользовательскую программу в оперативную память
- Переходим в Unprivileged Thread режим
- Запускаем программу пользователя

Вопрос возник по поводу перехода обратно в Privileged Thread режим. То есть как реализовать системные вызовы? Вопрос может быть глупый, но я занимался пока только интерпретаторами вплотную.
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Sep 17 2010, 11:32
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Системные вызовы через SWI (SWC).

Посмотрите FreeRTOS, насколько я помню, там через SWI и сделано. Плюс там есть порт с поддержкой MPU.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
segment
сообщение Sep 17 2010, 11:38
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 352
Регистрация: 10-08-06
Из: Санкт-Петербург
Пользователь №: 19 471



Насколько я понял в ARM7 можно поменять режим и использовать SWI для системных вызвов, но доступ к регистрам из User Mode все равно будет?
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Sep 17 2010, 11:39
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Да.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
segment
сообщение Sep 17 2010, 11:59
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 352
Регистрация: 10-08-06
Из: Санкт-Петербург
Пользователь №: 19 471



Спасибо. С PMU вроде все понятно. А нет ли хорошего гайда по SWI? Примеры видел, но что-то логики работы не понимаю, а описано везде размыто..
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Sep 17 2010, 12:28
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



http://infocenter.arm.com/help/index.jsp?t...d/Cacdfeci.html тут вполне подробно расписано


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
vmp
сообщение Sep 17 2010, 13:37
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 20-01-05
Из: Зеленоград
Пользователь №: 2 070



Для ARM7 можно попробовать задействовать регистры отладчика - ловить выходящие за границы допустимого обращения к памяти.
Во всяком случае в ключах Guardant Code (сделанных на LPC2xxx) присутствует подобный механизм контроля.
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Sep 17 2010, 13:43
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



А к ним можно получить доступ "изнутри"?


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
vmp
сообщение Sep 17 2010, 13:52
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 20-01-05
Из: Зеленоград
Пользователь №: 2 070



Цитата(Dron_Gus @ Sep 17 2010, 17:43) *
А к ним можно получить доступ "изнутри"?

Не знаю. Попробуйте здесь спросить, как они сумели это сделать.
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Sep 17 2010, 14:48
Сообщение #14


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Цитата(Сега @ Sep 17 2010, 05:35) *
Выходит два варианта:
- Интерпретатор
- Загрузка и выполнение кода в RAM

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

Компилируйте бинарники сами. Дайте какой-то примитивный язычок юзерам, типа бейсика, и свой компилятор, исключая таким образом возможность доступа к регистрам.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Sep 17 2010, 17:43
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(Сега @ Sep 17 2010, 17:35) *
При интерпретаторе все нормально...
При простой подгрузке бинарника встает вопрос об возможности доступа к регистрам и памяти...
Вообще это совершенно разный уровень пользователейsmile.gif В первом случае девочка одним пальцем набирает операторы Васика, во втором чел должен иметь уровень программирования на два порядка выше.


--------------------
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 12:31
Рейтинг@Mail.ru


Страница сгенерированна за 0.01495 секунд с 7
ELECTRONIX ©2004-2016