i.MX53 QSB и ARM TrustZone

Я изучаю i.MX53 QSB и расширения TrustZone. Я запускаю ОС в безопасном мире благодаря загрузчику U-Boot. Теперь я в безопасном мире. У меня три вопроса:

  • Первый вопрос: когда я должен разделить память и прерывания между безопасным и обычным миром?
  • Во-вторых, как я могу перейти в обычный мир, чтобы запустить на нем Rich OS?
  • Третий вопрос касается кода режима монитора, где его писать? Это модуль ядра в безопасном мире?

person EngineerN    schedule 09.04.2015    source источник
comment
См. также: планировщик TZ вопрос.   -  person artless noise    schedule 09.04.2015


Ответы (2)


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

Совместное использование памяти зависит от ваших системных требований/дизайна. Можно использовать smc только для использования регистров для обмена информацией. Никто не может дать общий ответ о совместном использовании памяти.

Делиться прерываниями редко имеет смысл. Вам понадобится водитель в обоих мирах. Весь смысл trustzone заключается в разделении оборудования.

Некоторое оборудование поддерживает зону доверия. То есть, он может изменить свой набор/представление регистров в зависимости от того, какой мир выполняется. Как правило, это оборудование имеет прерывание только для одного мира или отдельный номер прерывания. Если у вас нет устройства, поддерживающего trustzone, возможно, это глупая попытка.

..как я могу перейти в обычный мир, чтобы запустить на нем Rich OS?

Ну, это довольно просто, когда у вас есть режим монитора. Итак, из безопасной загрузки (возможно, из задачи/потока защищенной ОС)

  1. Загрузите ОС обычный мир в память.
  2. Настройка стека режима монитора и других контекстов; режиму монитора потребуется буфер памяти для хранения мировых контекстов.
  3. Переключитесь в режим монитора.
  4. Настройте разбиение памяти (изначально разрешите все для обычного мира).
  5. Измените бит NS, чтобы установить нормальный мир CP15.
  6. Настройте регистры CP15 в соответствии с настройками загрузки по умолчанию. Многие ОС ожидают, что они загружаются как обычно. Большинство процессоров trustzone по умолчанию не настраивают обычные мировые регистры CP15.
  7. Маскируйте прерывания, отключайте кеш и т. д., чтобы загрузить нормальную ОС.
  8. С установленным битом 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, он устанавливает обычные мировые регистры. Ну, технически это может быть «отдельно», вероятно, будет много взаимодействия между защищенной ОС и монитором. Опять же, это зависит от специфики. Существует много типов ОС (или мировых контекстов),

  1. Режим опроса
  2. Неупреждающий
  3. Упреждающий

У вас есть перестановки вышеперечисленного как для безопасного, так и для обычного мира, и обработка переключения мира будет зависеть от требований обоих. Для наиболее сложного случая (упреждающий безопасный/обычный) вам потребуется интеграция планировщиков, зависящих от ОС.

person artless noise    schedule 09.04.2015
comment
Спасибо за ваш ответ!!! но у меня остались вопросы по второму пункту как я могу перейти в обычный мир, чтобы запустить на нем Rich OS Если я понимаю, мне нужно запустить безопасную ОС благодаря u-boot для пример. После этого в потоке в этой защищенной ОС я реализую все, что связано с инициализацией системы мониторинга, после этого я вызываю SMC для перехода в режим мониторинга... и т.д.? Это не u-boot в качестве загрузчика для обычного мира, кто это сделает, я должен сделать это вручную? Второй вопрос касается репозитория github, в котором я нашел дело с этим - person EngineerN; 10.04.2015
comment
В этом репозитории ссылка человек использовал u-boot-2009 в качестве безопасной ОС и Linux в качестве богатая ОС. Можете ли вы показать мне, в каком файле мы говорим обо всем, например, как я могу перейти в обычный мир, чтобы запустить на нем Rich OS? - person EngineerN; 10.04.2015
comment
Переключатель есть в моем ответе ldm rX, {xxx, pc}^ несколько раз. smc используется для вызова из обычного мира в контролируемый-›безопасный мир. libboot-tz содержит файлы u-boot/arch/arm/lib/tz-secure*.S; это код для изучения. Он использует msr spsr_cxsf, #mode_SVC и movs pc,lr для первоначального вызова. Это не так эффективно, как мое предложение. Код монитора может использовать тот же переключатель контекста; но он настраивает коды обоих. Кроме того, я думаю, что эта настройка является режимом опроса безопасным миром/упреждающим нормальным режимом ОС. Это упрощает реализацию режима монитора. u-boot не является ОС. - person artless noise; 10.04.2015

Думайте о коде безопасного монитора как о своего рода гипервизоре, который является посредником между защищенной ОС и незащищенной ОС. Как правило, это была бы какая-то автономная прошивка, которая в основном просто отправляет вызовы и прерывания в безопасную ОС - я полагаю, что технически ее можно сделать полностью интегрированной в безопасную ОС, но это мешает повторному использованию и открывает возможности. потенциал для гораздо большего количества дыр в безопасности, поэтому, как правило, настоятельно не рекомендуется.

Код монитора также должен нести единоличную ответственность за переключение мира - как только безопасная ОС запущена и запущена, она должна вызывать монитор, который устанавливает SCR.NS и выполняет возврат исключения в незащищенный мир для запуска. незащищенный загрузчик.

Что касается совместного использования ресурсов между безопасным и незащищенным, это полностью зависит от того, что вы хотите сделать — относительно простая безопасная полезная нагрузка, такая как программный TPM, может вообще не нуждаться в общих ресурсах; что-то вроде защиты контента полного пути включает передачу буферов и целых устройств между мирами и является гораздо более сложным.

person Notlikethat    schedule 09.04.2015
comment
Благодарю за ваш ответ. Но на практике предположим, что у меня есть безопасная ОС, богатая ОС и U-Boot в качестве загрузчика. Это U-Boot, который загружает безопасный мир, устанавливает программное обеспечение для безопасного мониторинга и вызывает инструкцию SMC? Или мне нужно сделать это вручную после загрузки защищенной ОС? А можно подробнее, если есть ответ, пожалуйста - person EngineerN; 09.04.2015
comment
Я не знаю кода в «u-boot», который выполняет режим мониторинга; у него может быть код-заглушка для обработки некоторой загрузки «гипервизора» на 64-битных процессорах ARM. Если в «u-boot» (общедоступный источник, который вы можете посмотреть для вашей конкретной версии) нет кода, то, конечно, вы должны реализовать его самостоятельно. - person artless noise; 09.04.2015
comment
@EngineerN IIRC (из кода безопасной загрузки Exynos 5410), после сброса U-Boot SPL выполняет базовую инициализацию платы, перемещает сам U-Boot в ОЗУ, загружает большой двоичный объект прошивки в защищенную SRAM и просто переходит к нему. Затем прошивка устанавливает свои собственные векторы монитора и возвращает исключение в незащищенную копию RAM точки входа U-Boot. Однако это была совсем другая система, поэтому вам лучше взглянуть на код U-Boot от Freescale — если они не используют SPL и просто запускают все это в безопасном мире, тогда вы сами по себе. начало нормального мира. - person Notlikethat; 09.04.2015