#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; это может не дать прямого ответа на ваш точный вопрос, и вам, возможно, придется просмотреть исходный код, чтобы получить полную информацию.
Возможно, разделите память данных на три области — пользовательскую, ядро и общую.