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

#operating-system #rtos #context-switching #mpu

#операционная система #rtos #переключение контекста #arm-mpu

Вопрос:

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

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

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

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

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

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

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

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

Комментарии:

1. Казалось бы, любая функция операционной системы, которая может привести к переключению контекста, должна будет перейти в привилегированный режим, возвращаясь обратно в непривилегированный только после того, как она «вернется» для завершения переключения контекста. Вот как ядра, с которыми я работал, обрабатывают контекстные переключения. В привилегированном режиме защищенные области памяти могут быть изменены по мере необходимости в рамках переключения контекста.

Ответ №1:

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

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