.. когда я должен разделить память и прерывания между безопасным и обычным миром?
Совместное использование памяти зависит от ваших системных требований/дизайна. Можно использовать smc
только для использования регистров для обмена информацией. Никто не может дать общий ответ о совместном использовании памяти.
Делиться прерываниями редко имеет смысл. Вам понадобится водитель в обоих мирах. Весь смысл trustzone заключается в разделении оборудования.
Некоторое оборудование поддерживает зону доверия. То есть, он может изменить свой набор/представление регистров в зависимости от того, какой мир выполняется. Как правило, это оборудование имеет прерывание только для одного мира или отдельный номер прерывания. Если у вас нет устройства, поддерживающего trustzone, возможно, это глупая попытка.
..как я могу перейти в обычный мир, чтобы запустить на нем Rich OS?
Ну, это довольно просто, когда у вас есть режим монитора. Итак, из безопасной загрузки (возможно, из задачи/потока защищенной ОС)
- Загрузите ОС обычный мир в память.
- Настройка стека режима монитора и других контекстов; режиму монитора потребуется буфер памяти для хранения мировых контекстов.
- Переключитесь в режим монитора.
- Настройте разбиение памяти (изначально разрешите все для обычного мира).
- Измените бит
NS
, чтобы установить нормальный мир CP15.
- Настройте регистры CP15 в соответствии с настройками загрузки по умолчанию. Многие ОС ожидают, что они загружаются как обычно. Большинство процессоров trustzone по умолчанию не настраивают обычные мировые регистры CP15.
- Маскируйте прерывания, отключайте кеш и т. д., чтобы загрузить нормальную ОС.
- С установленным битом
NS
выполните переключение мира.
Переключение мира зависит от дизайна вашей системы. Если бы операционная система безопасного мира использовала только регистры R0-R12, инструкции могли бы выглядеть так:
# NS bit is set.
msr spsr_fsxc, lr # mon_lr contains normal world mode, etc.
ldm sp, {r0 - r12, pc}^ # monitor 'sp' is a context pointer.
ldm rX, {xxx, pc}^
переключит режим. У монитора 'sp' может быть 13 нулей (для r0-r12), а затем обычная точка входа в мир для 'PC'. Монитор 'lr' будет иметь начальный режим (маскированное прерывание и т. д.) для обычного мира.
ПРИМЕЧАНИЕ. Это простой пример, не предназначенный для вашей конкретной ОС. Это только концептуально. Особенности зависят от конкретных требований ОС для нормального/безопасного мира. Как правило, вам нужно делать все то, что загрузчик делал бы для этой платформы/ОС без TrustZone. Кроме того, вам необходимо инициализировать все регистры во всех режимах. Вы можете не заботиться о регистрах, которые безопасный мир не использует (NEON/VFP), и оставить их в соответствии с загрузочными значениями по умолчанию; это более верно для фактического кода «переключателя мира».
... что касается кода режима монитора, где я должен его написать? Это модуль ядра в безопасном мире?
Режим мониторинга всегда будет ИСПОЛЬЗОВАТЬ регистры CP15 безопасный мир. Это означает, что режим монитора имеет представление MMU, кеш и т. д. защищенной ОС. Когда бит 'NS' установлен, а режим монитора выполняет mcr
или mrc
, он устанавливает обычные мировые регистры. Ну, технически это может быть «отдельно», вероятно, будет много взаимодействия между защищенной ОС и монитором. Опять же, это зависит от специфики. Существует много типов ОС (или мировых контекстов),
- Режим опроса
- Неупреждающий
- Упреждающий
У вас есть перестановки вышеперечисленного как для безопасного, так и для обычного мира, и обработка переключения мира будет зависеть от требований обоих. Для наиболее сложного случая (упреждающий безопасный/обычный) вам потребуется интеграция планировщиков, зависящих от ОС.
person
artless noise
schedule
09.04.2015