Какой должна быть стратегия защиты памяти для процессора ARM Cortex?

Мне нужно реализовать многозадачную систему с MPU для процессоров ARM Cortex M3/M4.

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

Поэтому, когда я переключаюсь на новую задачу, я освобождаю область стека и глобальной памяти пользовательского приложения. Это можно легко сделать с помощью регистров ARM Cortex MPU.

Но проблема в том, что когда происходит переключение контекста, мне нужно использовать еще и некоторые глобальные переменные ядра.

Например, я вызываю функцию для получения следующего TCB в обработчике PendSV во время переключения контекста, но пул задач находится вне области пользовательского приложения и защищен от пользовательского приложения.

Итак, кажется, должен быть баланс, не так ли? Каковы безопасные и эффективные стратегии защиты памяти?

Привилегированный режим можно поднять перед переключением контекста при вызове функции Yield, но это не кажется хорошим решением.

Каковы общие стратегии по этому вопросу?


person muratcakmak    schedule 21.10.2016    source источник
comment
Казалось бы, любая функция операционной системы, которая может привести к переключению контекста, должна будет перейти в привилегированный режим, возвращаясь обратно в непривилегированный режим только после того, как она вернется, чтобы завершить переключение контекста. Именно так ядра, с которыми я работал, обрабатывают переключение контекста. В привилегированном режиме области памяти, которые защищены, могут быть изменены по мере необходимости как часть переключения контекста.   -  person rcgldr    schedule 22.10.2016


Ответы (1)


Возможно, вы могли бы взглянуть на существующую реализацию с открытым исходным кодом и посмотреть, какие дизайнерские решения были приняты там. FreeRTOS, например, поддерживает Cortex-M MPU здесь; он может не отвечать на ваш точный вопрос напрямую, и вам, возможно, придется проверить исходный код, чтобы получить полную информацию.

Возможно разделить память данных на три области - пользовательскую, ядро ​​и общую.

person Clifford    schedule 22.10.2016