.. когда следует делиться памятью и прерываниями между безопасным и нормальным миром?
Распределение памяти зависит от ваших системных требований/дизайна. Можно использовать smc
, чтобы использовать регистры только для обмена информацией. Никто не может дать общий ответ на обмен памяти.
Редко имеет смысл делиться прерываниями. Вам понадобится драйвер в обоих мирах. Весь смысл trustzone - это разделение аппаратного обеспечения.
Некоторые аппаратные средства trustzone осведомлены. То есть, он может изменить его регистр/представление на основе того, что мир выполняет. Как правило, это аппаратное обеспечение имеет только прерывание для одного мира или отдельный номер прерывания. Если у вас нет устройства trustzone, это, вероятно, глупо, что нужно попробовать.
.. как я могу перейти в нормальный мир, чтобы запустить на нем богатую ОС?
Ну, это довольно просто, когда у вас есть режим монитора. Таким образом, с безопасной загрузки (возможно, безопасная ОС задача/нить),
- Загрузите нормальный мир OS памяти.
- Установка режима монитора и других контекстов; для режима мониторинга требуется буфер памяти для хранения мировых контекстов.
- Переключиться в режим мониторинга.
- Настройка разметки памяти (в принципе разрешить все для нормального мира).
- Изменить
NS
бит, чтобы установить нормальный мир CP15.
- Конфигурирование CP15 регистрируется в соответствии с загрузкой по умолчанию. Многие операционные системы ожидают, что они будут загружаться в обычном режиме. Большинство trustzone ЦП не настраивают нормальный мир CP15 регистры по умолчанию.
- Маска прерывает, выключает кеш и т. Д., Как требуется для загрузки обычная ОС.
- С
NS
бит все еще установлен, сделать мировой переключатель.
Мировой выключатель зависит от конструкции вашей системы. Если безопасный мир OS используется только регистры 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.
The ldm rX, {xxx, pc}^
будет делать переключатель режимов работы. Монитор «sp» может иметь 13 нулей (для r0-r12), а затем нормальную точку входа в мир для «ПК». Монитор «lr» будет иметь режим запуска (прерывание в масках и т. Д.) Для нормального мира.
ПРИМЕЧАНИЕ: Это простой пример, который не предназначен для вашей конкретной ОС. Это только концептуально. Специфика зависит от конкретных нормальных/безопасных требований мировой ОС. Как правило, вам нужно сделать все, что загрузочный загрузчик сделает для этой платформы/ОС без TrustZone. Кроме того, вам необходимо инициализировать все регистры во всех режимах. Вам могут не нравиться регистры, которые безопасный мир не использует (NEON/VFP), и оставлять их в соответствии с загрузочными значениями по умолчанию; это более верно для реального кода «world switch».
... относительно кода режима монитора, где его записать? Является ли это модулем ядра в безопасном мире?
Monitor mode will always USE the CP15 registers of the secure world. Это означает, что режим мониторинга имеет вид MMU, кеш и т. Д. Защищенной ОС. Когда бит «NS» установлен, а режим мониторинга делает mcr
или mrc
, он устанавливает нормальные мировые регистры. Ну, технически это может быть «отдельно», вероятно, будет много взаимодействия между защищенной ОС и монитором. Опять же, это зависит от специфики. Есть много типов операционных систем (или мировые контексты),
- режим опроса
- невытесняющего
- Преимущественного
Вы перестановки выше для обоего безопасных и нормального мировое и мировое управление переключением будет зависеть от требований обоих. Для наиболее сложного случая (Pre-emptive secure/normal) вам нужна интеграция планировщиков, зависящих от ОС.
См. Также: [TZ scheduler] (http://stackoverflow.com/questions/22659472/arm-trustzone-behaviour-of-the-scheduler-in-secure-and-non-secure-os) вопрос. –